一. tensor的一些操作篇
(1)整体复制矩阵块元素
repeat (整体元素重复的次数,(4,2),代表在行上重复4次,在列上重复2次)
torch.Tensor.repeat — PyTorch 1.11.0 documentation
这样可能还是不好形象理解,形象化一点吧:看作矩阵块更加形象具体
二. 神经网络层实现理解
(1)线性层(也就是全连接层)
参考网址:torch.nn.functional.linear — PyTorch 1.11.0 documentation
看到这里一大堆,可能会发怵,初学小白可能会懵:
看懂了之后这样记忆理解:
最重要的是那个公式 :
input 对应 x,weight对应A,那么x的列数=A的列数,y的列数=A的行数,按照矩阵计算法则可以分析出来的
(2)卷积层,Conv2d
输出图片通道数=卷积核的个数
卷积核的通道数=输入图片通道数
更详细的参考:实用卷积相关trick_AutoGalaxy的博客-CSDN博客
(3)batchnorm2d,
momentum = 0.1,affine = True 的作用没有在下面的程序里面体现出来,暂时还不清楚原因
给我灵感启发的文章,不得不说,大多数博客都没有写,均值数量=输入图片通道数量,这个关键的要素,而是在那堆砌无用的公式。公式官网就有,给个参考链接就行,就没必要堆砌了,博客本身就是为了简便记录技术而用的,代码-公式对应,才是真正的技术链。
batchnorm2d函数理解,numpy数据归一化 - 爽歪歪666 - 博客园
1)针对batchsize = 1时的计算规则:
1. 输入是 (N,C,W,H)四维类型,在torch代表,有N张图片组成一个batch,C代表一张图片的通道数,W和H代表图片的宽和高;以下以输入维数为 (1,2,2,2)为例
2. 单纯创建BatchNorm2d,第一个参数有以下含义(一张图片的通道数量,均值数量)
其他的默认参数如下所示:
eps = 1e-5,momentum = 0.1,affine = True
3. 取出一张图片的一个通道层出来,如下是一张2*2的图片
求均值
对应文中代码:
mean2 = channel_1.mean()
对应batchnorm2d论文公式:
求方差:
就是对这四个数据量进行求方差:
对应文中代码:
var = channel_1.var(False)
其中的False表示禁用贝塞尔矫正,具体见这一篇博客:只需要看最后一点点就可以了
【PyTorch】详解pytorch中nn模块的BatchNorm2d()函数_颜丑文良777的博客-CSDN博客_nn.batchnorm2d
对应batchnorm2d的公式:
4. 最后利用这个公式
5. 再经过
其中gama 默认值是 1 , beta默认值是 0
import torch.nn as nn
import torch
model = nn.BatchNorm2d(2)
# batch size = 1, 输入通道数 = 2, 图片宽高:3*3
x = torch.rand((1, 2, 2, 2))
print(x)
print(x.shape)
y = model(x)
print("output:")
print(y)
print(y.shape)
# tensor 计算一个通道层的均值
channel_1 = x[0, 0, :, :]
print(channel_1)
print(channel_1.shape)
# 先计算这个通道层的和
# channel_sum = channel_1.sum()
# print(channel_sum)
# 手动求均值
# mean = channel_sum / (3.0 * 3.0)
# print(mean)
# 自带方法求均值
mean2 = channel_1.mean()
print(mean2)
# 自带方法求方差
var = channel_1.var(False)
print(var)
normal_1 = ( channel_1 - mean2 ) / ((var+1e-5)**0.5)
# 通道1
print(normal_1)
如上图所示,手动验算结果跟代码一致。
2)针对batchsize > 1 的条件 仅仅只在求均值的过程中 取出的是 所有图片的同一通道层数而已。
三. pytorch网络搭建的通用步骤
(1)创建一个类 继承自 nn.Moudle
(2)类的构造函数里面实现网络结构的搭建,推荐使用nn.sequential结构
(3)定义forward成员函数(外部创建此网络对象时,并且把那个对象当作函数方法使用时,会调用这个forward函数)
四. 网络参数的通用步骤
(1)通过torch.nn建立损失函数类
(2)通过optim建立优化器(指定优化器优化的参数,以及学习率等等)
(3)输入实际值和目标值,计算损失函数值,并且返回一个损失tensor
(4)调用优化器的zero_grad(),清除梯度累积
(5)调用损失tensor的backward,进行反向误差传播
(6)调用optim的step,进行参数更新
五. pytorch遇到的各种奇奇怪怪的问题
5.1 下面这种错误
类型不对,关于pytorch的类型在debug时最好
六. 统计程序运行时间
CPU:
import time start = time.time() // time.clock() ~~~ end = time.time() // time.clock() print(start - end)
七. eval函数
用于 model.eval()
参考:
[1].Pytorch笔记:torch.eval使用方法_Mark周末的博客-CSDN博客_torch.eval
[2].