【PyTorch】使用笔记
日常帖。
PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。它主要由Facebook的人工智能小组开发,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这一点是现在很多主流框架如TensorFlow都不支持的。 PyTorch提供了两个高级功能: 1.具有强大的GPU加速的张量计算(如Numpy) 2.包含自动求导系统的深度神经网络。除了Facebook之外,Twitter、GMU和Salesforce等机构都采用了PyTorch。
参考
- PyTorch官方教程中文版
- PyTorch trick 集锦
- PyTorch 中模型的使用
网络训练和测试
数据加载参考:
网络参考:。
在模型中有BN层或者dropout层时,在训练阶段和测试阶段必须显式指定train()和eval()。(model.train()和model.eval()的区别主要在于Batch Normalization和Dropout两层。)
model.eval()是保证BN层能够用全部训练数据的均值和方差,即测试过程中要保证BN层的均值和方差不变。对于Dropout,model.eval()是利用到了所有网络连接,即不进行随机舍弃神经元。
测试torch.no_grad()的作用
torch.no_grad()是一个上下文管理器,被该语句 wrap 起来的部分将不会track 梯度,有两个作用:新增的tensor没有梯度,使带梯度的tensor能够进行原地运算。
验证模型时不需要求导,即不需要梯度计算,关闭autograd,提高速度,节约内存。如果不关闭可能会爆显存。
知乎文章|PyTorch 25. torch.backends.cudnn
设置torch.backends.cudnn.benchmark = true可以增加运行效率;适用场景是网络结构固定(不是动态变化的),网络的输入形状(包括 batch size,图片大小,输入的通道)是不变的,其实也就是一般情况下都比较适用。如果卷积层的设置一直变化,将会导致程序不停地做优化,反而会耗费更多的时间。
【pytorch】torch.backends.cudnn.deterministic
注意cuda的随机数种子,需要用到torch.backends.cudnn.deterministic。
设置torch.backends.cudnn.deterministic=True,每次返回的卷积算法将是确定的,即默认算法。如果配合上设置 Torch 的随机种子为固定值的话,应该可以保证每次运行网络的时候相同输入的输出是固定的。
Tensor相关
torch.flatten
-
torch.flatten(input, start_dim=0, end_dim=- 1) → Tensor, 按照默认值,这个函数会把input推平成一个shape为[??]的tensor,其中n即input中元素个数。 -
flatten(x,0)和flatten(x,1)可以看成start_dim=0/1,end_dim=-1。
-
view和flatten都是和输入共享内存的,flatten的好处是不用输入形状参数,直接指定维度,在这之后的都被拉平。view则是更加灵活。
对pytorch中x = x.view(x.size(0), -1) 的理解说明
- 在pytorch中的view()函数就是用来改变tensor的形状的,例如将2行3列的tensor变为1行6列,其中-1表示会自适应的调整剩余的维度。
- 在CNN中,因为卷积或者池化之后需要连接全连接层,所以需要把多维度的tensor展平成一维。卷积或者池化之后的tensor的维度为(batchsize,channels,x,y),其中x.size(0)指batchsize的值,最后通过
x.view(x.size(0), -1)将tensor的结构转换为了(batchsize, channels*x*y),即将(channels,x,y)拉直,之后就可以接fc层了。
torch.hub
Pytorch Hub is a pre-trained model repository designed to facilitate research reproducibility.
torch.hub — PyTorch 1.9.1 documentation