【小白学PyTorch】4.构建模型三要素与权重初始化
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
文章目录:
1 模型三要素
2 参数初始化
3 完整运行代码
4 尺寸计算与参数计算
这篇文章内容不多,比较基础,里面的代码块可以复制到本地进行实践,以加深理解。
喜欢的话,可以给公众号加一个星标,点点在看,这是对我最大的支持
1 模型三要素
三要素其实很简单
必须要继承nn.Module这个类,要让PyTorch知道这个类是一个Module
在__init__(self)中设置好需要的组件,比如conv,pooling,Linear,BatchNorm等等
最后在forward(self,x)中用定义好的组件进行组装,就像搭积木,把网络结构搭建出来,这样一个模型就定义好了
我们来看一个例子:先看__init__(self)函数
def __init__(self):super(Net,self).__init__()self.conv1 = nn.Conv2d(3,6,5)self.pool1 = nn.MaxPool2d(2,2)self.conv2 = nn.Conv2d(6,16,5)self.pool2 = nn.MaxPool2d(2,2)self.fc1 = nn.Linear(16*5*5,120)self.fc2 = nn.Linear(120,84)self.fc3 = nn.Linear(84,10)
第一行是初始化,往后定义了一系列组件。nn.Conv2d
就是一般图片处理的卷积模块,然后池化层,全连接层等等。
定义完这些定义forward函数
def forward(self,x):x = self.pool1(F.relu(self.conv1(x)))x = self.pool2(F.relu(self.conv2(x)))x = x.view(-1,16*5*5)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x
x为模型的输入,第一行表示x经过conv1,然后经过激活函数relu,然后经过pool1操作 第三行表示对x进行reshape,为后面的全连接层做准备
至此,对一个模型的定义完毕,如何使用呢?
例如:
net = Net()
outputs = net(inputs)
其实net(inputs)
,就是类似于使用了net.forward(inputs)
这个函数。
2 参数初始化
简单地说就是设定什么层用什么初始方法,初始化的方法会在torch.nn.init中
话不多说,看一个案例:
# 定义权值初始化
def initialize_weights(self):for m in self.modules():if isinstance(m,nn.Conv2d):torch.nn.init.xavier_normal_(m.weight.data)if m.bias is not None:m.bias.data.zero_()elif isinstance(m,nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()elif isinstance(m,nn.Linear):torch.nn.init.normal_(m.weight.data,0,0.01)# m.weight.data.normal_(0,0.01)m.bias.data.zero_()
这段代码的基本流程就是,先从self.modules()中遍历每一层,然后判断更曾属于什么类型,是否是Conv2d,是否是BatchNorm2d,是否是Linear的,然后根据不同类型的层,设定不同的权值初始化方法,例如Xavier,kaiming,normal_等等。kaiming也是MSRA初始化,是何恺明大佬在微软亚洲研究院的时候,因此得名。
上面代码中用到了self.modules()
,这个是什么东西呢?
# self.modules的源码
def modules(self):for name,module in self.named_modules():yield module
功能就是:能依次返回模型中的各层,yield
是让一个函数可以像迭代器一样可以用for循环不断从里面遍历(可能说的不太明确)。
3 完整运行代码
我们用下面的例子来更深入的理解self.modules()
,同时也把上面的内容都串起来(下面的代码块可以运行):
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset,DataLoaderclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.pool1 = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.pool2 = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.pool1(F.relu(self.conv1(x)))x = self.pool2(F.relu(self.conv2(x)))x = x.view(-1, 16 * 5 * 5)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xdef initialize_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):torch.nn.init.xavier_normal_(m.weight.data)if m.bias is not None:m.bias.data.zero_()elif isinstance(m, nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()elif isinstance(m, nn.Linear):torch.nn.init.normal_(m.weight.data, 0, 0.01)# m.weight.data.normal_(0,0.01)m.bias.data.zero_()net = Net()
net.initialize_weights()
print(net.modules())
for m in net.modules():print(m)
运行结果:
# 这个是print(net.modules())的输出
<generator object Module.modules at 0x0000023BDCA23258>
# 这个是第一次从net.modules()取出来的东西,是整个网络的结构
Net((conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))(pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))(pool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(fc1): Linear(in_features=400, out_features=120, bias=True)(fc2): Linear(in_features=120, out_features=84, bias=True)(fc3): Linear(in_features=84, out_features=10, bias=True)
)
# 从net.modules()第二次开始取得东西就是每一层了
Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
Linear(in_features=400, out_features=120, bias=True)
Linear(in_features=120, out_features=84, bias=True)
Linear(in_features=84, out_features=10, bias=True)
其中呢,并不是每一层都有偏执bias的,有的卷积层可以设置成不要bias的,所以对于卷积网络参数的初始化,需要判断一下是否有bias,(不过我好像记得bias默认初始化为0?不确定,有知道的朋友可以交流)
torch.nn.init.xavier_normal(m.weight.data)
if m.bias is not None:m.bias.data.zero_()
上面代码表示用xavier_normal方法对该层的weight初始化,并判断是否存在偏执bias,若存在,将bias初始化为0。
4 尺寸计算与参数计算
我们把上面的主函数部分改成:
net = Net()
net.initialize_weights()
layers = {}
for m in net.modules():if isinstance(m,nn.Conv2d):print(m)break
这里的输出m就是:
Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
这个卷积层,就是我们设置的第一个卷积层,含义就是:输入3通道,输出6通道,卷积核,步长1,padding=0.
【问题1:输入特征图和输出特征图的尺寸计算】
之前的文章也讲过这个了,
用代码来验证一下这个公式:
net = Net()
net.initialize_weights()
input = torch.ones((16,3,10,10))
output = net.conv1(input)
print(input.shape)
print(output.shape)
初始结果:
torch.Size([16, 3, 10, 10])
torch.Size([16, 6, 6, 6])
第一个维度上batch,第二个是通道channel,第三个和第四个是图片(特征图)的尺寸。
算出来的结果没毛病。
【问题2:这个卷积层中有多少的参数?】输入通道是3通道的,输出是6通道的,卷积核是的,所以理解为6个的卷积核,所以不考虑bias的话,参数量是,考虑bais的话,就每一个卷积核再增加一个偏置值。(这是一个一般人会忽略的知识点欸)
下面用代码来验证:
net = Net()
net.initialize_weights()
for m in net.modules():if isinstance(m,nn.Conv2d):print(m)print(m.weight.shape)print(m.bias.shape)break
输出结果是:
Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
torch.Size([6, 3, 5, 5])
torch.Size([6])
都和预料中一样。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
【小白学PyTorch】4.构建模型三要素与权重初始化相关推荐
- qbytearray初始化全0_【小白学PyTorch】4.构建模型三要素与权重初始化
文章目录: 1 模型三要素 2 参数初始化 3 完整运行代码 4 尺寸计算与参数计算 这篇文章内容不多,比较基础,里面的代码块可以复制到本地进行实践,以加深理解. 喜欢的话,可以给公众号加一个星标,点 ...
- 【小白学PyTorch】6.模型的构建访问遍历存储(附代码)
<<小白学PyTorch>> 小白学PyTorch | 5 torchvision预训练模型与数据集全览 小白学PyTorch | 4 构建模型三要素与权重初始化 小白学PyT ...
- 【小白学PyTorch】18.TF2构建自定义模型
[机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 扩展之Tensorflow2.0 | 17 TFrec文件的创建与读取 扩展之Tensorflow2.0 | 1 ...
- c++list遍历_小白学PyTorch | 6 模型的构建访问遍历存储(附代码)
关注一下不迷路哦~喜欢的点个星标吧~<> 小白学PyTorch | 5 torchvision预训练模型与数据集全览 小白学PyTorch | 4 构建模型三要素与权重初始化 小白学PyT ...
- pytorch默认初始化_小白学PyTorch | 9 tensor数据结构与存储结构
[机器学习炼丹术]的学习笔记分享<> 小白学PyTorch | 8 实战之MNIST小试牛刀 小白学PyTorch | 7 最新版本torchvision.transforms常用API翻 ...
- 【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(下)池化、Normalization
<<小白学PyTorch>> 扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积.激活.初始化.正则 扩展之Tensorflow2.0 | 20 TF ...
- 【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积、激活、初始化、正则...
[机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 扩展之Tensorflow2.0 | 20 TF2的eager模式与求导 扩展之Tensorflow2.0 | ...
- 【小白学PyTorch】扩展之Tensorflow2.0 | 20 TF2的eager模式与求导
[机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 扩展之Tensorflow2.0 | 19 TF2模型的存储与载入 扩展之Tensorflow2.0 | 18 ...
- 【小白学PyTorch】17.TFrec文件的创建与读取
[机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 小白学PyTorch | 16 TF2读取图片的方法 小白学PyTorch | 15 TF2实现一个简单的服装分 ...
最新文章
- 监控组策略应用---组策略建模
- IOS中Json解析的四种方法
- 英特尔开源WebRTC开发套件OWT
- javascript冷门吗_分享几个html5冷门小知识
- junit测试spring_使用Spring JUnit规则进行参数化集成测试
- ls mac 显示最近修改日期_Find Any File for Mac(Mac本地文件搜索工具)
- viewsource和viewparsed_Network Panel说明
- day16- django
- Filecoin网络存储容量已达3 EB
- 利用k-means算法解决简单的无监督图像识别任务
- C# 、.NET、ASP.NET MVC积累
- VALSE学习(五):看图说话-Visual Question Answering as Reading Comprehension
- Python基础之列表、元组、字典、集合
- 甲乙丙丁四个人去商店每人买了一台计算机,2016国考行测备考:巧用矛盾速解题...
- ShaderWeaver使用教程-动画序列帧
- 1334177-81-9,S-acetyl-PEG8-alcohol乙酰硫基可以脱保护生成巯基
- 解决Adobe Acobat设置了背景色,显示出现白条的问题!
- [二分][dp凸优化] Luogu P4383 林克卡特树lct
- 程序员面试,为什么不跟我谈高并发?
- GD32汽车诊断协议 ISO-9141测试