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

简介: 利用 torch 识别出了虎猫和萨摩耶

大家好啊,我是董董灿。

自从前几天手写了一个慢速卷积之后(从零手写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,项目地址在文章末尾。

试运行

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

image.png

image.png

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

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

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

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

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

image.png

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

image.png

看到推理结果我才意识到,那只狗子是个 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计算的结果对的上!

image.png

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

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

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

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

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

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

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

本文作者原创,请勿随意转载

相关文章
|
NoSQL 数据安全/隐私保护 Android开发
Jlink使用技巧之读取STM32内部的程序
Jlink使用技巧之读取STM32内部的程序
4751 1
Jlink使用技巧之读取STM32内部的程序
|
Android开发 开发者
苹果开发者账号申请教程
登陆苹果官网注册账号 点击地址https://developer.apple.com/account/进入苹果官网 如果没有账号可以点击'Create Apple ID'进行账号注册,输入需要的信息后点击'continue'按钮进入网站 因为我已经有账号,所以直接点'Sign In'登陆进入网站 .
11561 0
|
8月前
|
人工智能 Prometheus Cloud Native
Oh My OpenCode实战指南:打造你的AgentTeam
《Oh My OpenCode实战指南》介绍多模型智能体编排系统,将AI助手升级为协作开发团队。支持Claude/GPT/Gemini等多模型灵活调度,通过规划层(Prometheus)、执行层(Atlas)与工作者层(Hephaestus等)三层架构,实现意图识别、并行任务委派与知识沉淀。强调“类别优先于模型名”,打破厂商锁定,提升开发效率与可靠性。(239字)
5625 5
|
7月前
|
存储 人工智能 API
OpenClaw一人AI企业搭建全攻略:阿里云/本地部署,集成Chief+Sub-Agent架构及多Agent操作指南
2026年,用OpenClaw搭建“一人公司”时,很多人会陷入多Agent管理的困境:记忆混乱导致战略分散、Token消耗激增、上下文污染让Agent“越界干活”——明明需要执行者,却养了一群“记忆错乱的演员”。核心问题不在于Agent数量,而在于架构设计错误。
840 0
|
7月前
|
存储 JSON 缓存
GPT-5.5 进入生产环境后,日志、审计和告警怎么设计
GPT-5.5落地需强可观测性:日志不能只记“调用成功”。必须贯穿request_id、精准模型版本、全链路耗时与token用量,并分级脱敏存prompt/输出。统一多模型日志字段,分离运行日志与审计日志(提示词修改、工具授权等),聚焦五大核心问题——谁、调谁、用何上下文、为何异常、花多少钱。
422 0
|
10月前
|
安全 算法 数据安全/隐私保护
给文档盖上“隐形印章”——全新PDF内嵌字体水印技术,让每一份文件都有迹可循
合肥高维数据首创PDF内嵌字体水印技术,通过微观重构字体结构,实现水印无感嵌入、精准提取,兼具隐形性与抗干扰能力。广泛应用于企业保密、版权保护、法律审计与教育领域,为每份文档赋予唯一“数字身份证”,重新定义文档安全新标准。(238字)
549 4
|
12月前
|
存储 安全 物联网
RFID引领工器具管理智能化变革
RFID工器具管理通过射频识别技术,实现工具的自动识别、实时定位与全程追溯,告别人工盘点低效难题。覆盖电力、医疗、物流等场景,提升盘点效率90%以上,支持全生命周期智能管控,助力企业降本增效,推动管理数字化转型。(238字)
|
数据采集 存储 监控
构建高效爬虫系统:设计思路与案例分析
构建高效爬虫系统涉及关键模块如爬虫引擎、链接存储、内容处理器等,以及用户代理池、IP代理池等反反爬策略。评估项目复杂性考虑数据规模、网站结构、反爬虫机制等因素。案例分析展示了电子商务价格比较爬虫的设计,强调了系统模块化、错误处理和合规性的重要性。爬虫技术需要不断进化以应对复杂网络环境的挑战。
901 1
|
存储 Linux Docker
在Docker中,本地的镜像文件都存放在哪里?
在Docker中,本地的镜像文件都存放在哪里?