我是靠谱客的博主 认真秀发,最近开发中收集的这篇文章主要介绍[C/C++]为什么手搓一个简版CNN并不难,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我这个学期给本科生二年级教授“C/C++程序设计”,期末项目是实现一个简单的CNN inference,不能使用第三方库,只能手写代码实现。很多同学的第一反应是这个太难了,其实并非如此,本文详细介绍为何不难。

我前几日写过一篇文章介绍这样设计项目的初衷《[C/C++]期末作业实现一个CNN?》。为了让同学们更好起步,在我的研究生冯远滔同学帮助下,提供了一个训练好的模型,这个简单的CNN模型结构如下图。

f8d5a799b58803bf01faf3cfe5a3c9aa.png

这个模型可以区分图像中是否有人脸,图像尺寸128x128,输出是含两个元素的向量,两个数值分别表示是背景和人脸可能性。这个模型的所有参数都以C语言静态数组方式导出到CPP文件中。模型只包含conv、relu,maxpool和fc四种层。conv只有三层,且仅有3x3一种卷积核。这些都大大简化了实现难度。当然我鼓励学生实现更通用的CNN inference。这个简单模型的所有资料可以在 https://github.com/ShiqiYu/SimpleCNNbyCPP 下载 (或左下角“原文链接”)。

3e421fa153452ae86b3c4a09dccc2357.png

这个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实现起来并不难。希望这个作业能让学生克服畏惧心理,增加一些自信心。

详细的视频讲解,请长按下方二维码访问:

86689b371c437513e0ebd7d34d3cb444.png

最后

以上就是认真秀发为你收集整理的[C/C++]为什么手搓一个简版CNN并不难的全部内容,希望文章能够帮你解决[C/C++]为什么手搓一个简版CNN并不难所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部