从零手写Resnet50实战——利用 torch 识别出了虎猫和萨摩耶

news2024/11/16 5:46:54

大家好啊,我是董董灿。

自从前几天手写了一个慢速卷积之后(从零手写Resnet50实战—手写龟速卷积),我便一口气将 Resnet50 中剩下的算法都写完了。

然后,暴力的,按照 Resnet50 的结构,将手写的算法一层层地连接了起来。

out = compute_conv_layer(out, "conv1")
out = compute_bn_layer(out, "bn1")
out = compute_relu_layer(out)
out = compute_maxpool_layer(out)
# layer1 
out = compute_bottleneck(out, "layer1_bottleneck0", down_sample = True)
out = compute_bottleneck(out, "layer1_bottleneck1", down_sample = False)
out = compute_bottleneck(out, "layer1_bottleneck2", down_sample = False)
# layer2
out = compute_bottleneck(out, "layer2_bottleneck0", down_sample = True)
out = compute_bottleneck(out, "layer2_bottleneck1", down_sample = False)
out = compute_bottleneck(out, "layer2_bottleneck2", down_sample = False)
out = compute_bottleneck(out, "layer2_bottleneck3", down_sample = False)
# layer3
out = compute_bottleneck(out, "layer3_bottleneck0", down_sample = True)
out = compute_bottleneck(out, "layer3_bottleneck1", down_sample = False)
out = compute_bottleneck(out, "layer3_bottleneck2", down_sample = False)
out = compute_bottleneck(out, "layer3_bottleneck3", down_sample = False)
out = compute_bottleneck(out, "layer3_bottleneck4", down_sample = False)
out = compute_bottleneck(out, "layer3_bottleneck5", down_sample = False)
# layer4
out = compute_bottleneck(out, "layer4_bottleneck0", down_sample = True)
out = compute_bottleneck(out, "layer4_bottleneck1", down_sample = False)
out = compute_bottleneck(out, "layer4_bottleneck2", down_sample = False)
# avg pool
out = compute_avgpool_layer(out)
# Linear
out = compute_fc_layer(out, "fc")

算法的手写和网络的搭建,没有调用任何第三方库,这也是这个项目的初衷。

相关代码都已经上传至:项目根目录/python/inference.py,项目地址在文章末尾。

试运行

在将网络搭建完的那一刻,迫不及待的我,赶紧运行了这个网络,试图让它能识别出这张猫,结果如我所想——识别错误!

我手写手搭的神经网络将这只猫的类别识别成了 bucket——一个水桶!

不过没关系,这不很正常么,谁能确保刚刚手写的一个神经网络,第一次运行就能成功呢?

马斯克不刚刚发射星舰还失败了吗?

识别错误了,那就开始调试。

于是,我快速地使用 torch 搭建了一个官方的 resent50 模型。然后利用这个官方的模型来推理了两张图片,一张是上面的小猫,一张是下面的狗子。

结果很明显,官方模型推理正确。

看到推理结果我才意识到,那只狗子是个 Samoyed——萨摩耶。

在确认了官方的模型和算法可以正确地识别出猫咪和狗子之后,我开始了漫长的debug(调试)之路。

开始调试

调试方法很简单,将 torch 官方的 resnet50 计算每一层得出的结果,和我手写的算法计算的结果对比。
在对比的过程中,真的发现了一个问题。

保存的权值数据与算法不匹配

torch 的权值默认是按照 NCHW 的格式存储的,而我手写算法的时候,习惯按照 NHWC 的格式来写,于是,我的第一层卷积就算错了。

于是,在导出权值的时候(从零手写Resnet50实战——权值另存为),额外增加一个 transpose 操作,将 torch 默认的 NCHW 的权值,转置为我手写算法需要的 NHWC 的权值。

然后继续保存到 txt 中。

在将权值的问题修复完之后,重新对比结果,竟出奇地顺畅。

一路绿灯。

从 conv1->bn1->maxpool,再到第一个layer 中的 conv1->bn1->conv2->bn2->conv3->bn3->relu ,甚至第一个layer中下采样中的计算 conv->bn。

这几个地方竟然全部能和官方resnet50计算的结果对的上!

也就是,在上图中,绿色部分都没问题,红色部分仍然存在计算错误。出错部分刚好是残差结构的加法操作。

不过这个结果确实是惊到我了,这说明——

我手写的 Conv2d、BatchNormal、MaxPool算法没问题!

从做这件事开始,我就担心我手写的算法可能会有问题,不论是功能上还是精度上,不过在我采用了 float64 数据类型后,精度问题不存在了。

而上面和官方的结果的对比验证,也证实了手写的算法在功能上没问题。

反而是我从来没担心的网络结构搭建上,却恰恰出了问题——残差结构有错误,不过既然定位到了,后面有时间再继续调试吧。

最起码,今天离我手写的神经网络出猫,又近了一步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/442716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flowable】Flowable基础表结构

1.表结构讲解 表结构创建文件:flowable-engine-6.3.0.jar!\org\flowable\db\create\flowable.mysql.create.engine.sql 工作流程的相关操作都是操作存储在对应的表结构中,为了能更好的弄清楚Flowable的实现原理和细节,我们有必要先弄清楚Fl…

Python边缘检测之prewitt, sobel, laplace算子

文章目录 滤波算子简介具体实现测试 滤波算子简介 ndimage中提供了卷积算法,并且建立在卷积之上,提供了三种边缘检测的滤波方案:prewitt, sobel以及laplace。 在convolve中列举了一个用于边缘检测的滤波算子,统一维度后&#xf…

es6 const的使用

1.const用来定义常量&#xff0c;赋值知乎不能再赋值&#xff0c;再次赋值会报错。 <script>//1.定义常量&#xff0c;赋值后不能再赋值&#xff0c;在赋值报错const count 1// count 2</script> ​ 2.const不能只声明不赋值&#xff0c;会报错。 <script>…

智能学习 | MATLAB实现CS-BP多变量时间序列预测(布谷鸟搜索算法优化BP神经网络)

智能学习 | MATLAB实现CS-BP多变量时间序列预测(布谷鸟搜索算法优化BP神经网络) 目录 智能学习 | MATLAB实现CS-BP多变量时间序列预测(布谷鸟搜索算法优化BP神经网络)预测效果基本介绍程序设计参考资料预测效果 基本介绍 MATLAB实现CS-BP多变量时间序列预测(布谷鸟搜索算法…

chatGPT衣食住行10种场景系列教程(01)chatGPT热点事件+开发利器

导读 时隔5个多月&#xff0c;chatGPT可谓是一日千里&#xff0c;越演越火&#xff0c;携带着AIGC行业一起飞了起来&#xff0c;那么在短短5个月当中有那些值得我们关注的事件&#xff1f;有那些好玩的场景&#xff1f;以及有那些chatGPT好用的工具&#xff1f;本文都将一一告…

大数据时代必备技能,学好数据可视化

互联网时代&#xff0c;都在强调数据分析的重要性&#xff0c;但是干巴巴的数据没人爱看&#xff0c;老板们对“简单直观地看数据”的需求愈发强烈。随着大数据建设的如火如荼&#xff0c;别讲底层技术和算法牛逼&#xff0c;最终的效率提升、业绩提升要通过数据展示出来&#…

vba:消息框基础,msgbox

常量常量值说明vbOKOnly0只显示“确定”按钮&#xff08;缺省值&#xff09;VbOKCancel1显示“确定”和“取消”按钮VbAbortRetryIgnore2显示“终止”、“重试”和“忽略” 按钮VbYesNoCancel3显示“是”、“否”和“取消”按钮VbYesNo4显示“是”和“否”按钮VbRetryCancel5显…

Python爬虫实战——获取电影影评

Python爬虫实战——获取电影影评 前言第三方库的安装示例代码效果演示结尾 前言 使用Python爬取指定电影的影评&#xff0c; 注意&#xff1a;本文仅用于学习交流&#xff0c;禁止用于盈利或侵权行为。 操作系统&#xff1a;windows10 家庭版 开发环境&#xff1a;Pycharm Co…

Linux 服务简单优化

硬件优化 处理器&#xff1a;核心数、主频、制程工艺、线程数、缓存等 核心数&#xff1a;1、2、4、6、8、12、24、32等 主频&#xff1a;2.0GHz、2.3GHz等等 制程工艺&#xff1a;22nm、14nm、10nm等等 线程数&#xff1a;1、2 缓存&#xff1a;L1、L2、L3 建议&#xff1a;尽…

OpenHarmony 3.2 Release特性更新简析

1.ArkUI 组件能力增强 支持XComponent控件&#xff0c;可用于EGL/OpenGL ES和媒体数据写入&#xff0c;并在XComponent组件显示&#xff1b;通过XComponent组件&#xff0c;配合NDK能力&#xff0c;构建C/ArkTS混合开发能力&#xff0c;支持游戏、媒体应用开发支持AbilityCom…

前端学习:HTML内联框架

目录 一、HTML Iframe 二、添加iframe的语法 三、Iframe设置高度和宽度 ​编辑 四、Iframe删除边框 五、使用iframe作为链接的目标 六、补充 一、HTML Iframe iframe用于在网页内显示网页。 二、添加iframe的语法 <iframe src"URL"></iframe> 提示…

“计数”排序

目录 一、什么是计数排序&#xff1f;二、如何实现计数排序&#xff1f;三、适用场景四、时间复杂度和空间复杂度 一、什么是计数排序&#xff1f; 计数排序&#xff0c;是通过统计每一个数字出现的次数&#xff0c;并把它映射到与它自己本身数值相同的下标处&#xff0c;再遍…

HoloLens2场景理解,识别平面信息

因为可用的资料比较少,就记录下吧,大家也可以少走弯路,节省时间。 场景理解,通俗的讲,可以识别空间当中的墙面、地板、天花板、平台等. 场景理解&#xff08;Scene Understanding&#xff09;是指 HoloLens2 通过深度传感器、摄像头和计算机视觉算法等技术&#xff0c;能够对…

Centos安装Nvidia驱动解决内核版本不匹配问题

Centos安装Nvidia驱动解决内核版本不匹配问题 问题分析尝试解决 写程序三分钟&#xff0c;配环境三小时&#xff0c;尤其是在一台全新机器/重装系统后。。。 已经解决的&#xff1a; 禁用nouveau驱动并重启电脑&#xff08;参考这篇博客&#xff09;缺少cc&#xff0c;手动yum…

C++---状态压缩dp---炮兵阵地(每日一道算法2023.4.17)

注意事项&#xff1a; 本题为"状态压缩dp—蒙德里安的梦想"和"状态压缩dp—小国王"和"状态压缩dp—玉米田"的近似题&#xff0c;建议先阅读这三篇文章并理解。 题目&#xff1a; 司令部的将军们打算在 NM 的网格地图上部署他们的炮兵部队。 一个…

Pytorch中的仿射变换(F.affine_grid)

目录 1、平移操作实现 2、缩放操作 3、旋转操作 4、转置操作 在pytorch框架中&#xff0c; F.affine_grid 与 F.grid_sample&#xff08;torch.nn.functional as F&#xff09;联合使用来对图像进行变形。 F.affine_grid 根据形变参数产生sampling grid&#xff0c;F.grid_…

深入浅出openGauss的执行器基础

目录 火山模型 Tuple 数据结构设计 条件计算 Expr 和 Var 示例1 filter 示例2 join 示例3 index scan & index only scan 火山模型 执行器各个算子解耦合的基础。对于每个算子来说&#xff0c;只有三步&#xff1a; 1、向自己的孩子拿一个 tuple。即调用孩子节点…

C++初阶之缺省参数

目录 前言 缺省参数 1.缺省参数的概念 2.缺省参数的分类 全缺省参数 半缺省参数 前言 今天小编继续给大家带来C的内容&#xff0c;那么今天小编给大家讲解的就是有关C中缺省参数的介绍。 缺省参数 1.缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省…

分布式互联网——Web3.0

文章目录 前言一、什么是 Web3.0?二、Web3.0 技术1.分布式账本技术(DLT)2. 区块链3. 智能合约4. 加密算法2.操作 三、Web3.0 的未来发展 前言 Web3.0&#xff0c;也被称为“分布式互联网”&#xff0c;是当前互联网的下一代版本。它是一种未来的互联网&#xff0c;它没有中心…

ROS学习第十一节——常用命令

1.概述 机器人系统中启动的节点少则几个&#xff0c;多则十几个、几十个&#xff0c;不同的节点名称各异&#xff0c;通信时使用话题、服务、消息、参数等等都各不相同&#xff0c;一个显而易见的问题是: 当需要自定义节点和其他某个已经存在的节点通信时&#xff0c;如何获取…