我这个学期给本科生二年级教授“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 kernelfloat 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 ...// biasfloat bias_oi = conv0_bias[o];}
}

如果不考虑程序运行效率,上面描述的CNN实现起来并不难。希望这个作业能让学生克服畏惧心理,增加一些自信心。

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

[C/C++]为什么手搓一个简版CNN并不难相关推荐

  1. 来,一起手撸一个简版 Redis(附源码)

    点击上方 视学算法,选择 设为星标 优质文章,及时送达 作者 | 凯京技术团队 来自 | my.oschina.net/keking/blog/3037372 今天主要介绍两个开源项目,然后创建应用最 ...

  2. 手写一个简版的vue

    Vue源码中实现依赖收集(观察者模式),实现了三个类: Dep:扮演观察目标的角色,每一个数据都会有Dep类实例,它内部有个subs队列,subs就是subscribers的意思,保存着依赖本数据的观 ...

  3. 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言

    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个60 ...

  4. 写一个简版 asp.net core

    动手写一个简版 asp.net core Intro 之前看到过蒋金楠老师的一篇 200 行代码带你了解 asp.net core 框架,最近参考蒋老师和 Edison 的文章和代码,结合自己对 as ...

  5. 初识react(二) 实现一个简版的html+redux.js的demo

    回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱 初识react(二) 实现一个简版的html+redux.js的demo 初识react(三)在 react中使用redux来实现简版计数器 ...

  6. javascript实现图片轮播_手撸一个简易版轮播图(上)

    手撸一个简易版轮播图 实现原理,通过控制 swiper-warpper 容器的定位来达到切换图片的效果. 页面布局 简易版轮播图 < > 页面样式 .container{width: 60 ...

  7. 手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果

    七夕来咯!又到了给重要的人送惊喜的时刻. 今年,除了将心意融入花和礼物,作为程序员,用自己的代码本事手搓一个技术感十足"七夕限定"惊喜,我觉得,这是不亚于车马慢时代手写信的古典主义 ...

  8. 10分钟手撸极简版ORM框架!

    最近很多小伙伴对ORM框架的实现很感兴趣,不少读者在冰河的微信上问:冰河,你知道ORM框架是如何实现的吗?比如像MyBatis和Hibernte这种ORM框架,它们是如何实现的呢? 为了能够让小伙伴们 ...

  9. 生成一个简版导游地图

    目录 1 简版导游地图功能简介 2  注册并登录 3 设置景区(商圈)地图 3.1 新增景区 3.2 增加一个景点介绍 3.3 地图中增加一个景点 3.4 增加几个其他类型的点,如"美食&q ...

  10. 肝一波 ~ 手写一个简易版的Mybatis,带你深入领略它的魅力!

    零.准备工作 <dependencies><dependency><groupId>mysql</groupId><artifactId>m ...

最新文章

  1. 一个有价值的 Sharepoint WebPart 页签部件
  2. Reorder List
  3. Facebook's New Real-time Messaging System: HBase to Store 135+ Billion Messages a Month
  4. 全国计算机等级考试题库二级C操作题100套(第54套)
  5. python爬虫之多线程、多进程+代码示例
  6. 这5个让人窒息的烂代码,你看完都忍不了!
  7. 使用Windows远程桌面工具来远程连接控制Ubuntu系统
  8. iOS开源项目周报0302
  9. 阿里云商标注册服务及常见问题
  10. php中conf,php 中 php-fpm.conf
  11. vue的json格式化工具json-viewer
  12. C#反编译工具:ILSpy
  13. java面试 自我介绍_java面试自我介绍
  14. Nat Chem Biol | 李大力/宋高洁/赵永祥合作开发“精准安全”的腺嘌呤碱基编辑器ABE9...
  15. 3dMax 制作玻璃材质
  16. rap技术原理_学rap最基本的都要学什么
  17. 苹果退款_苹果充值退款什么意思
  18. MSGraphMailbag - 复制/移动 SharePoint Online 中的文件和文件夹
  19. 谷歌浏览器chrome取消左右滑动
  20. mysql5.7.19收费》_mysql5.7.19安装

热门文章

  1. Ubuntu18.04-国产周立功Can 分析仪驱动实现-python版本
  2. python用来正常显示中文标签 plt.rcParams['font.sans-serif'] = ['SimHei']错误
  3. IOS 本地图片加载
  4. 锐捷虚拟机做服务器,笨方法解决锐捷校园网环境下VMware虚拟机无法上网问题(Fedora试用上网成功)...
  5. Android 12 原生播放器的编解码 Codec 2
  6. GBase数据库监控
  7. vb难还是c语言难java_c语言难还是vb难?
  8. linux镜像文件下载
  9. vue项目前端页面模板,基于vue的前端模板
  10. IPAM 开源IP地址管理系统部署