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

简介: 全手写resnet50神经网络,终于运行正常了。

大家好啊,我是董董灿。

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

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

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

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

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

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

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

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

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

image.png
image.png

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

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

image.png
image.png

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

image.png
image.png

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

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

image.png
image.png

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

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

image.png
image.png
image.png

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

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

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

image.png
image.png

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

image.png
image.png

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

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

image.png
image.png

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

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

image.png
image.png

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

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

image.png

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

image.png
image.png

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

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

image.png
image.png

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

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

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

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

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

网络优化

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

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

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

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

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

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

向量内积代替标量循环

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

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

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

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

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

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

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

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

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

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

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

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

项目内容:

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

希望项目可以顺利完成。 欢迎关注同名公众号 @董董灿是个攻城狮,获取最新项目进展和好玩的算法文章。

相关文章
|
程序员 Shell 数据格式
python股票量化交易(1)---K线图、均线与成交量绘制
python股票量化交易(1)---K线图、均线与成交量绘制
3410 0
python股票量化交易(1)---K线图、均线与成交量绘制
|
8月前
|
人工智能 自然语言处理 文字识别
医院随访系统如何实现数据整合?
医院随访系统数据整合旨在打破院内多系统壁垒,构建标准化、智能化数据流通体系。通过FHIR/HL7接口对接、EMPI主索引治理、AI清洗(NLP/OCR)及数据中台架构,融合HIS、EMR、可穿戴设备等院内外数据,实现患者360°视图与“一人一档”,赋能临床决策、科研分析与智慧随访。
547 1
|
存储 安全 网络安全
敏感备份文件:潜在的安全风险与防护措施
本文深入探讨了敏感备份文件的安全风险与防护措施,涵盖gedit和vim生成的备份及交换文件、常见敏感文件类型(如robots.txt、README.md)等。分析了这些文件可能引发的源代码泄露、配置暴露等问题,并提供了禁用备份创建、调整Web服务器配置等具体防护建议。同时,文章还扩展到云环境备份、数据库备份等高级场景,提出加密存储、定期审计等企业级解决方案,强调通过技术手段与管理流程结合,构建纵深防御体系以降低安全风险。
696 0
基于PI和MPPT控制策略的直驱式永磁同步风力发电系统simulink建模与仿真
本课题研究基于PI与MPPT控制策略的直驱式永磁同步风力发电系统建模与仿真。系统由风力机、PMSG、双变流器及滤波装置构成,实现风能到电能的高效转换与并网控制。仿真输出包括电机转速、转矩、功率及电网侧电压电流等关键参数,验证了控制策略的有效性与系统稳定性。
|
10月前
|
数据采集 人工智能 监控
数据治理是什么?数据治理对企业有什么价值
在数字化转型中,数据治理是释放数据价值的关键。本文系统阐述其定义、核心价值、实施路径及趋势,结合金融、零售、制造等实践案例,揭示如何通过治理实现数据一致性、降本增效、合规风控,并推荐阿里云Dataphin等平台,助力企业从“拥有数据”迈向“驾驭数据”。
|
人工智能 自然语言处理 搜索推荐
拔俗AI政务智能体:让政务服务更聪明、更贴心
AI政务智能体是基于人工智能的“数字公务员”,可24小时在线解答政策疑问、智能引导办事、自动填表申报,让政务服务更高效便捷。它整合政策数据,实现“一问即答、一办到底”,提升群众满意度,助力政府治理现代化,推动“数据多跑路,群众少跑腿”真正落地。
647 0
|
数据安全/隐私保护 Python
抖音主页截图生成器在线制作,抖音主页截图生成器,快手小红书抖音截图【python】
这个代码实现了一个完整的抖音主页截图生成器,包含以下功能:顶部导航栏模拟
|
机器学习/深度学习 人工智能 搜索推荐
Ingredients:无需额外训练的多ID视频生成框架,通过多张人物照片生成定制视频
Ingredients 是一款基于多ID照片与视频扩散Transformer相结合的定制视频生成框架,能够生成高质量、身份一致且内容灵活的视频。
872 19
Ingredients:无需额外训练的多ID视频生成框架,通过多张人物照片生成定制视频
|
传感器 Android开发 芯片
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
本文是系列文章的第三篇,展示了如何在Android系统中利用现有的i2c bus驱动,通过编写设备树节点和应用层的控制代码,实现对基于i2c bus的Slaver设备(如六轴陀螺仪模块QMI8658C)的控制,而无需编写设备驱动代码。
793 0
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动