从零手写Resnet50实战——权值另存为

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 从零手写Resnet50实战——权值另存为

​大家好啊,我是董董灿。

这是《从零手写Resnet50实战》的第二篇文章。

权值怎么处理

在制定了不用第三方库和框架,从零手写Resnet50的前提下,面临的第一个问题就是网络的权值怎么处理。

网上有不少教程是基于已有的模型和推理框架来加载权值,然后完成的推理运算。

而如果不依赖已有的框架,就需要对模型中的权值做一次自定义的格式转存。

权值转存成文本文件

第一步,把模型中的权值,另存为一个可以随意被操控的文件格式——最常见的 txt 文本格式。

这样做的好处就是,以txt文件存储的模型参数,可以随时随地的,以读文件的方式随意加载。

由于不再是结构化的数据,而是我们可以随意操控的数据(甚至可以修改),也方便神经网络中每一层的调试。

于是,我写了个脚本,用来将参数数据保存下来。

import torch
import torchvision
import numpy as np
from torchvision import models
resnet50 = models.resnet50(pretrained=True)
print(resnet50)
​
def save(data, file):
  d = np.array(data.weight.data.cpu().numpy())
  np.savetxt(file+str(".txt"), d.reshape(-1, 1))
  
save(resnet50.conv1, "resnet50_conv1")
save(resnet50.bn1, "resnet50_bn1")
​
def save_bottle_neck(layer, layer_index):
  bottle_neck_idx = 0
  layer_name = "resnet50_layer" + str(layer_index) + "_bottleneck"
  for bottleNeck in layer:
    save(bottleNeck.conv1, layer_name + str(bottle_neck_idx) + "_conv1")
    save(bottleNeck.bn1, layer_name + str(bottle_neck_idx) + "_bn1")
    save(bottleNeck.conv2, layer_name + str(bottle_neck_idx) + "_conv2")
    save(bottleNeck.bn2, layer_name + str(bottle_neck_idx) + "_bn2")
    save(bottleNeck.conv3, layer_name + str(bottle_neck_idx) + "_conv3")
    save(bottleNeck.bn3, layer_name + str(bottle_neck_idx) + "_bn3")
    if bottleNeck.downsample:
      save(bottleNeck.downsample[0], layer_name + str(bottle_neck_idx) + "_downsample_conv2d")
      save(bottleNeck.downsample[1], layer_name + str(bottle_neck_idx) + "_downsample_batchnorm")
    bottle_neck_idx = bottle_neck_idx + 1
​
save_bottle_neck(resnet50.layer1, 1)
save_bottle_neck(resnet50.layer2, 2)
save_bottle_neck(resnet50.layer3, 3)
save_bottle_neck(resnet50.layer4, 4)
​
save(resnet50.fc, "resnet50.fc")

这个脚本可以自动地从网上下载已经训练好的模型,然后打印出Resnet50的网络结构,并且将有参数的层(主要是卷积层和BN层和FC层)中的参数保存下来。

!image.png

简单验证存储的权值对不对

Resnet50中的第一层卷积,卷积核大小为 7x7,channel 数是3,共 64 个卷积核,因此这一层的权值参数有 64x7x7x3 = 9408个。

Resnet50中最后一层全连接层,将通道 2048 转为通道 1000,算法上为一个简单地 [m, k] x [k, n] = [m, n] 的矩阵乘法。

image.png

这一层的权值参数个数为 2048 x 1000 = 2048000个。

查看保存的 resnet50_conv1.txt 和 resnet50_fc.txt 的行数:

$ wc -l resnet50_conv1.txt
9408 resnet50_conv1.txt
​
$ wc -l resnet50_fc.txt
2048000 resnet50_fc.txt

txt文件每一行保存一个参数,可以看到参数个数是正确的。

这样就完成了Resnet50权值的格式转存,转存到txt中,无论python环境,还是C++环境,都可以很友好的读入文件数据,然后进行计算。

代码和保存的权值参数文件已经上传到了仓库

说明:txt文件中的数据类型都是浮点型,浮点型能确保整个神经网络推理的精度达标,不至于误差太大,后续算法实现,也需要是浮点运算。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
8月前
|
机器学习/深度学习 编解码 计算机视觉
YOLOv8改进 | 主干篇 | SwinTransformer替换Backbone(附代码 + 详细修改步骤 +原理介绍)
YOLOv8改进 | 主干篇 | SwinTransformer替换Backbone(附代码 + 详细修改步骤 +原理介绍)
977 0
|
6月前
|
机器学习/深度学习 存储 测试技术
【YOLOv10改进-注意力机制】iRMB: 倒置残差移动块 (论文笔记+引入代码)
YOLOv10专栏介绍了融合CNN与Transformer的iRMB模块,用于轻量级模型设计。iRMB在保持高效的同时结合了局部和全局信息处理,减少了资源消耗,提升了移动端性能。在ImageNet等基准上超越SOTA,且在目标检测等任务中表现优秀。代码示例展示了iRMB的实现细节,包括自注意力机制和卷积操作的整合。更多配置信息见相关链接。
|
8月前
|
机器学习/深度学习 存储 测试技术
【YOLOv8改进】iRMB: 倒置残差移动块 (论文笔记+引入代码)
该专栏聚焦YOLO目标检测的创新改进与实战案例,提出了一种融合CNN和Transformer优点的轻量级模型——倒置残差移动块(iRMB)。iRMB旨在平衡参数、运算效率与性能,适用于资源有限的移动端。通过集成多头自注意力和卷积,iRMB在ImageNet-1K等基准上超越SOTA,同时在iPhone14上展现出比EdgeNeXt快2.8-4.0倍的速度。此外,iRMB设计简洁,适用于各种计算机视觉任务,展示出良好的泛化能力。代码示例展示了iRMB模块的实现细节。更多详细信息和配置可在相关链接中找到。
|
8月前
|
算法 Go 区块链
YOLOD也来啦 | 优化YOLOv5样本匹配,顺带设计了全新的模块
YOLOD也来啦 | 优化YOLOv5样本匹配,顺带设计了全新的模块
88 0
|
8月前
|
编解码 计算机视觉
YOLOv5改进 | 主干篇 | SwinTransformer替换Backbone(附代码 + 详细修改步骤 +原理介绍)
YOLOv5改进 | 主干篇 | SwinTransformer替换Backbone(附代码 + 详细修改步骤 +原理介绍)
732 0
|
PyTorch Serverless 算法框架/工具
YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py
YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py
2658 0
|
机器学习/深度学习 存储 算法
KNN算法数字识别完整代码——打开就可以跑
KNN算法数字识别完整代码——打开就可以跑
|
机器学习/深度学习 PyTorch 算法框架/工具
使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成下
生成器的结构应与鉴别器相逆,因此生成器不再使用卷积操作,而是使用卷积的逆向操作,我们称之为转置卷积(transposed convolution)。
|
机器学习/深度学习 PyTorch 算法框架/工具
使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上
使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上
|
计算机视觉
又改ResNet | 重新思考ResNet:采用高阶方案的改进堆叠策略(附论文下载)(二)
又改ResNet | 重新思考ResNet:采用高阶方案的改进堆叠策略(附论文下载)(二)
108 0