Pytorch基础
一、数据
epoch:所有数据送入网络一次前向计算和反向传播的过程,多个epoch才能拟合收敛
batch:epoch分为几个小的batch同时送入网络
iteration:完成一次epoch需要的batch个数
batchsize:每个batch中送入的数量
1 数据格式
2 访问元素
1 :3 是第一行到第二行
二、初始化数据
rand和randn的区别
rand是均匀分布
randn是正态分布
Variable详解
三、卷积
https://blog.csdn.net/liujh845633242/article/details/102668515
1 Conv1d
torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’, device=None, dtype=None)
- in_channels(int) – 输入信号的通道。在文本分类中,即为词向量的维度
- out_channels(int) – 卷积产生的通道。有多少个out_channels,就需要多少个1维卷积
- kernel_size(int or tuple) - 卷积核的尺寸,卷积核的大小为(k,),第二个维度是in_channels来决定的,所以实际上卷积大小为kernel_size*in_channels
- stride(int or tuple, optional) - 卷积步长
- padding (int or tuple, default=0)- 输入的每一条边补充0的层数
- dilation(int or tuple, default=1) - 卷积核元素之间的间距
- groups(int, optional) - 从输入通道到输出通道的阻塞连接数
- bias(bool, optional) - 如果bias=True,添加偏置
conv1 = nn.Conv1d(in_channels=256,out_channels=100,kernel_size=2)
input = torch.randn(32,35,256)
# batch_size x text_len x embedding_size -> batch_size x embedding_size x text_len
input = input.permute(0,2,1)#将维度换位(转置)
out = conv1(input)
print(out.size())
32为batchsize,35256符合正态分布的向量,35为句子的最大长度,256为embedding大小
在输入一维卷积时,由于一维卷积是在最后维度上扫的,所以将3235256变换为3225635,out的大小为:batchsizeoutchannls*(len-kernelsize+1)=32100(353-2+1)=3210034
2 Conv2d
3 filter和kernel
四、归一化
BatchNorm、LayerNorm、InstanceNorm、GroupNorm
BatchNorm:在batch方向做归一化,算NHW的均值,小batchsize的效果不好;缺点是对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布。
LayerNorm:channel方向做归一化,算CHW的均值,主要对RNN作用明显;
InstanceNorm:一个channel内做归一化,算H*W的均值,用在风格化迁移;因为在图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。
GroupNorm:将channel方向分group,然后每个group内做归一化,算(C//G)HW的均值;这样与batchsize无关,不受其约束。
SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
五、激活
其中nn.ReLU作为一个层结构,必须添加到nn.Module容器中才能使用,而F.ReLU则作为一个函数调用,看上去作为一个函数调用更方便更简洁
nn.functional.relu返回值为Tensor
六、开始训练之前
1 cuda的使用
单GPU也可以用.cuda()将输入、输出和网络送入设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
data, target = data.to(device), target.to(device)
net.to(device)
2 seed
模型训练时通常会用rand初始化模型权重,为方便复现论文,多次跑的结果一致,设置种子可以让每次生成的随机数相同
# 给CPU设置种子
torch.manual_seed(number)
# 给GPU设置种子
torch.cuda.manual_seed(number)
# 如果使用多个GPU,应该使用torch.cuda.manual_seed_all()为所有的GPU设置种子。
torch.cuda.manual_seed_all(number)