全手写resnet50,分分钟识别“十二生肖“图片

大家好啊,我是董董灿。

前天,我完全手写的算法,并手搭的神经网络,终于成功的识别出一张图片。

点击链接查看出猫现场:我出猫了,第一阶段完成!

成功地识别出来猫,意味着我搭建的整个流程跑通了。

这个流程主要包括了以下几个步骤:

  • 图片导入
  • 图片预处理:裁减、缩放、归一化
  • 输入手写的 Resnet50 中,进行推理,输出 1000 个分类得分
  • 从分类文件中查找得分最大的索引对应的类别

虽然流程通了,但是识别一张图片要耗时 40 分钟!这推理速度,简直就是龟速。

忍不了,于是我优化了一波,识别一张图片的耗时直接从40分钟降到1分多钟。

接着我从百度图片中下载了 12 张动物图片 — 组成十二生肖。

输入给了我手写的神经网络,希望它能正确的识别出来,顺便也测试一下网络的鲁棒性。

下面是十二生肖图片的识别结果,至于怎么优化的,在文章最后会有介绍。


在这里插入图片描述

子鼠,识别结果为 mink — 水貂,识别错误,扣一分。

不过这个老鼠是不是有那么点像水貂?


丑牛,识别为 ox - 公牛,识别正确!加一分。
而且还是公牛,是根据上翘的尾巴做的区分吗?


寅虎,识别为 tiger - 老虎,识别正确!加一分。

这萌萌的老虎特征这么明显,要是识别错,那可以下班了。



卯兔,识别为 hare - 野兔,识别正确!加一分。

这站立的姿势,警觉地竖起的耳朵,野兔无疑了。


辰龙,识别成 harp - 竖琴,识别错误,不减分。

神经网络识别不出来龙,真的不怪神经网络,因为它的类比分类里就没有中国龙这一类。

不过识别成竖琴的话,看这弯曲的身形,还确实是有点神似。

巳蛇,识别为 garter snake - 袜带蛇,识别正确!加一分。
虽然我不知道什么事袜带蛇,但它说是,就是了。


午马,识别成 Mexican hairless - 墨西哥无毛犬,识别错误,减一分。
这个不应该的。

是不是因为这匹马身上太光滑,没有马儿们标志性的鬃毛么? 但是那飘逸的尾巴,也能说明问题啊。


未羊,识别成 ram - 公羊,算是识别正确吧。

我感觉识别出是绵羊更好一些。


申猴,识别出 macaque - 猕猴,识别正确,加一分。

看这身形和毛发,这么像猕猴桃,是猕猴了!


酉鸡,识别出 cock - 公鸡,识别正确,加一分。这个是送分题。


戌狗,识别出 Samoyed - 萨摩耶,识别正确,加一分。

这一身雪白的气质,小萨独有。



亥猪,识别出 hog - 猪,识别正确,加一分。

二师兄小时候,还是很可爱的。

优化完神经网络之后,识别这 12 张图片,总共花了十来分钟。

十二生肖,共 12 种动物类别,剔除“龙”这一项,因为模型分类中没有,其他11个分类,有两个识别错误,分别是老鼠识别成了水貂,骏马识别成了墨西哥无毛犬。

整体识别成功率 81%,还算不错。

网络优化

下面说一下我是如何将这个网络推理一张图片的耗时,从 40 分钟一张,优化到 1 分钟一张的。

在最开始的版本中,整个推理过程,消耗的 90% 的时间集中在卷积运算中。

尤其是卷积运算中的乘累加部分。

在第一版手写卷积算法时,我为了完全展示卷积的运算逻辑,采用了最原始的多层循环,也就造成了现在的龟速卷积从零手写Resnet50实战—手写龟速卷积。

在这里插入图片描述

这种多重循环的写法,时间复杂度O(N^6),简直是没法忍受的。

于是,我针对卷积的乘累加运算,做了一个简单优化。

向量内积代替标量循环

优化方法也很简单:将最内层的循环乘累加替换成向量内积。

卷积的这种优化方法,在编译器或者指令优化场合很常见:尽可能用向量指令代替循环标量运算。

基本原理就是:原来一个时钟周期只可以计算一次循环的一个标量,而现在一个时钟周期可以计算一个向量。

在 python 的应用代码中,也可以这么做,利用 numpy 提供的 vdot 函数,直接对两个数组做向量内积。
然后加到一个数值上完成累加。

基本就下面一条语句搞定。

acc += np.vdot(img[hi_index][wi_index], weight[co_][kh_][kw_])

就这一点改动,整个网络的推理性能,便从原来的 40 分钟,直接降到了 1 分钟。

好啦,这篇文章就到这。欢迎关注本系列文章。

====================================================

最近在尝试不借助任何第三方库,从零手写 Resnet50 的算法并搭建网络,完成一张图片的推理,正确识别一张图片出来。

这是一个很好地图片识别入门实践项目,可以写到简历上,并且亮瞎面试官双眼的那种哦。

如果你感兴趣,欢迎一起参与。

项目地址:https://gitee.com/iwaihou/resnet50-zero
项目内容:

  • 从零手写 Resnet50 中的所有基础算法 - 已完成
  • 从零搭建 Resnet50 的网络结构,将深入理解残差结构 - 已完成
  • 完成一整图片的正确推理 - 已完成
  • 对手写卷积算法进行优化(x86 CPU),提升推理性能 - 进行中
  • 采用异构编程方式完成推理加速(GPU + cuda kernel)

希望项目可以顺利完成。

v v v v v v

点击下方卡片,关注我的公众号,有最新的文章和项目动态。

v v v v v v

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值