Pytorch个人记录(请勿打开)

一. 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

 看到这里一大堆,可能会发怵,初学小白可能会懵:

看懂了之后这样记忆理解:

最重要的是那个公式 : y = x A^{T} +b

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的图片

求均值  \frac{0.9480+0.8739+0.4779+0.2765}{4}=0.6441

对应文中代码:

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].

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值