日常帖。
PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。它主要由Facebook的人工智能小组开发,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这一点是现在很多主流框架如TensorFlow都不支持的。 PyTorch提供了两个高级功能: 1.具有强大的GPU加速的张量计算(如Numpy) 2.包含自动求导系统的深度神经网络。除了Facebook之外,Twitter、GMU和Salesforce等机构都采用了PyTorch。
参考
网络训练和测试
数据加载参考: 【PyTorch】torch.utils.data数据处理
网络参考:【PyTorch】torch.nn 模块笔记。
在模型中有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 的随机种子为固定值的话,应该可以保证每次运行网络的时候相同输入的输出是固定的。
torch.cuda.empty_cache()
PyTorch的缓存分配器会事先分配一些固定的显存,即使实际上tensors并没有使用完这些显存,这些显存也不能被其他应用使用。这个分配过程由第一次CUDA内存访问触发的。而torch.cuda.empty_cache()
的作用就是释放缓存分配器当前持有的且未占用的缓存显存,以便这些显存可以被其他GPU应用程序中使用,并且通过 nvidia-smi命令可见。注意使用此命令不会释放tensors占用的显存。
不建议使用torch.cuda.empty_cache()
实践中:这个命令并不会真正的帮助你清理更多的显存,与此同时,还会让你的代码速度变慢。
Tensor相关
-
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层了。
tensor.unsqueeze(dim)
:扩展维度,dim指定扩展哪个维度。
tensor.squeeze(dim)
:去除dim指定的且size为1的维度,维度大于1时,squeeze()不起作用,不指定dim时,去除所有size为1的维度。
torch.topk(input, k, dim=None, largest=True, sorted=True, out=None) -> (Tensor, LongTensor)
其中k是保留的k个值,dim表示在指定的维度进行取最值,largest=True意味着选取最大的,sorted=True是指将返回结果排序。
topk返回的是一个tensor,第一个元素指返回的具体值,第二个元素指返回值的index。
torchaudio
PyTorch torchaudio教程 / pytorch教程
torchaudio充分利用了 PyTorch 的 GPU 支持,并提供了许多工具来简化数据加载并使其更具可读性。
torchaudio 和 librosa 中MelSpectrogram
TORCHAUDIO.TRANSFORMS
torchaudio.transforms.MelSpectrogram
torch.hub
Pytorch Hub is a pre-trained model repository designed to facilitate research reproducibility.