torch张量a,a.unsqueeze(dim=k): 对维度k进行扩充;
a.squeeze():对数据的唯独进行压缩,去掉维数为1的维度。
nn.sequential() :
有三种用法:
#方法1
net1=nn.Sequential()
net1.add_module('层名',层class的实例)
#方法2
net2 = nn.Sequential(*多个层class的实例)
方法3
from collections import OrderedDict
net3 = nn.Sequential(OrderedDict([*多个(层名,层class的实例)]))
nn.ModuleList()
被设计用来存储任意数量的 nn.Module
如果在构造函数__init__中用到list、tuple、dict等对象时,一定要思考是否应该用ModuleList或ParameterList代替。
ModuleList是Module的子类,当在Module中使用它的时候,就能自动识别为子module。
当添加 nn.ModuleList 作为 nn.Module 对象的一个成员时(即当我们添加模块到我们的网络时),所有 nn.ModuleList 内部的 nn.Module 的 parameter 也被添加作为 我们的网络的 parameter
nn.moduleList定义对象后,有extend和append方法,用法和python中一样,extend是添加另一个modulelist, append是添加另一个module.。
nn.Sequential定义的网络中各层会按照定义的顺序进行级联,因此需要保证各层的输入和输出之间要衔接。并且nn.Sequential实现了farward()方法,而nn.ModuleList则没有顺序性要求,并且也没有实现forward()方法。
-> :常常出现在python函数定义的函数名后面,为函数添加元数据,描述函数的返回类型,从而方便开发人员使用.
@ :修饰符,只可以在模块或类定义层内对函数进行修饰,不允许修修饰一个类。一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。装饰符@类似于回调函数,把其它的函数(暂且称为目的参数)作为自己的入参,在目的函数执行前,执行一些自己的操作
求元素数的方法:
数组或矩阵:A.size或np.size(A)
(若A是秩为1的数组,则可以采用len(A);若A不是秩为1的数组,则采用len(A)相当于A.shape[0],求行数)
元组:np.size(A)或len(A)
(A.size不可行,报错)
列表:np.size(A)或len(A)
(A.size不可行,报错)
字典:len(A)
(A.size报错,np.size(A)取值不对,均不可行)
通常情况下,列表、元组、字典采用len(A),而数组、矩阵采用np.size(A)或A.size。
使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval,eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大!!!!!!
model.train() : 启用BatchNormalization 和Dropout
model.eval(): 不启用BatchNormalization 和 Dropout
PyTorch中的requires_grad 及 no_grad
requires_grad = True: 需要计算梯度
requires_grad = False: 不需要计算梯度
with torch.no_grad() 或 @torch.no_grad() 中的数据不需要计算梯度,也不会进行反向传播