Pytorch学习
model.train() model.eval()
模型设置为训练模式和预测模式。
训练完train_datasets之后,model要来测试样本了。在model(test_datasets)之前,需要加上model.eval(). 否则的话,有输入数据,即使不训练,它也会改变权值。这是model中含有batch normalization层所带来的的性质。
eval()时,pytorch会自动把BN和DropOut固定住,不会取平均,而是用训练好的值。不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大。eval()在非训练的时候是需要加的,没有这句代码,一些网络层的值会发生变动,不会固定,你神经网络每一次生成的结果也是不固定的,生成质量可能好也可能不好。
Tensor数据类型

标量,张量
a = torch.tensor(1)
a是tenor(1),标量,维度为0。像loss就是标量
维度>0是张量,a = torch.randn(2,3),2行3列,a.shape 和 a.size()一样,输出tensor.size([2,3]),a.dim()是2,2维。
numpy to tensor




维度变换
view,reshape一样,后面建议用更新的reshape,不改变原来的tensor。
resize也会改变维度,不过是在本身tensor改变。


expand扩充数据,不增加实际内存

repeat增加实际内存


transpose:两个维度交换,比较麻烦。permute比较简单,指定维度。


张量的简化相加,可以省事,不用把维度调成一致,节约存储空间。
合并与分割
concat

stack堆叠,把两个堆叠在一起,会多出一个维度,用于选择哪一个

split拆分

chunk是分成几块,直接输几


tensor裁剪,clamp把张量的值限定在区间内。
矩阵范数
norm()

范数越大,矩阵中元素的值就越大。而且两个矩阵的范数相近,说明两个矩阵联系相近,反之越大。
max(),min(),argmax(),argmin(),mean,topk(),


w创建的时候需要配置梯度,那么反向传播的时候能自动算梯度,并保存在属性里。
为啥用交叉熵,不用sigmoid
sigmoid在接近0或接近1的时候,容易梯度弥散,需要x移动很多,值才能移动一点。交叉熵会好一点。
训练集,验证集,测试集

训练集用来训练,验证集用来判断训练是否OK,防止过拟合。测试集看最后效果,测试集的数据之前不能让模型看过。
visdom可视化工具
训练时可以直接输出训练曲线
K折交叉验证,测试集不能动放一边。验证集在每个epoch中轮,这样可以让所有都能反向传播一次。
防止过拟合
增大数据集,限制模型复杂度,dropout,数据增强,早停,正则项。

正则化,限制W的大小,使模型没有那么强的表达能力。

weight_decay就是2范数的系数。
动态减小learning rate



inplace=True可以节省内存空间,不额外开辟relu的内存空间

BN层这个参数输入和通道数匹配上