概述
我这个学期给本科生二年级教授“C/C++程序设计”,期末项目是实现一个简单的CNN inference,不能使用第三方库,只能手写代码实现。很多同学的第一反应是这个太难了,其实并非如此,本文详细介绍为何不难。
我前几日写过一篇文章介绍这样设计项目的初衷《[C/C++]期末作业实现一个CNN?》。为了让同学们更好起步,在我的研究生冯远滔同学帮助下,提供了一个训练好的模型,这个简单的CNN模型结构如下图。
这个模型可以区分图像中是否有人脸,图像尺寸128x128,输出是含两个元素的向量,两个数值分别表示是背景和人脸可能性。这个模型的所有参数都以C语言静态数组方式导出到CPP文件中。模型只包含conv、relu,maxpool和fc四种层。conv只有三层,且仅有3x3一种卷积核。这些都大大简化了实现难度。当然我鼓励学生实现更通用的CNN inference。这个简单模型的所有资料可以在 https://github.com/ShiqiYu/SimpleCNNbyCPP 下载 (或左下角“原文链接”)。
这个GitHub项目中,以代码方式详细介绍了参数的描述,如下:
for (int o = 0; o < out_channels; ++o) {
for (int i = 0; i < in_channels; ++i) {
// weights
// first row of the kernel
float kernel_oi_00 = conv0_weight[o*(in_channels*3*3) + i*(3*3) + 0];
float kernel_oi_01 = conv0_weight[o*(in_channels*3*3) + i*(3*3) + 1];
float kernel_oi_02 = conv0_weight[o*(in_channels*3*3) + i*(3*3) + 2];
// and more rows ...
// bias
float bias_oi = conv0_bias[o];
}
}
如果不考虑程序运行效率,上面描述的CNN实现起来并不难。希望这个作业能让学生克服畏惧心理,增加一些自信心。
详细的视频讲解,请长按下方二维码访问:
最后
以上就是认真秀发为你收集整理的[C/C++]为什么手搓一个简版CNN并不难的全部内容,希望文章能够帮你解决[C/C++]为什么手搓一个简版CNN并不难所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复