**
**
声明:该文章的内容来自于网络的归纳总结,不断更新中,欢迎收藏,点赞评论,以及提供更多工作常用的函数。
1.torch.backends.cudnn.benchmark
一般将torch.backends.cudnn.benchmark设为True就可以大大提升卷积神经网络的运行速度。
原因:将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速。这行代码要加在哪里
其实一般加在开头就好,比如在设置使用 GPU 的同时,后边补一句:
if args.use_gpu and torch.cuda.is_available():
device = torch.device(‘cuda’)
torch.backends.cudnn.benchmark = True
else:
device = torch.device(‘cpu’)
2.torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度
3.torch.unsqueeze()这个函数主要是对数据维度进行扩充。给指定位置加上维数为一的维度
4.torch.clamp_()函数功能将输入input张量每个元素的值压缩到区间 [min,max],并返回结果到一个新张量
5.normal_(), fill_()
a.normal_()就表示用标准正态分布填充a,是in_place操作b.fill_(0)就表示用0填充是in_place操作
6.model.zero_grad() optimizer.zero_grad() pytorch中的backward()函数的计算,当网络参量进行反馈时,梯度是被积累的而不是被替换掉;但是在每一个batch时毫无疑问并不需要将两个batch的梯度混合起来累积,因此这里就需要每个batch设置一遍zero_grad 了
7.torch.tensor.detach_()和torch.tensor.detach()的区别:detach()和detach_()很像,两个的区别就是detach_()是对本身的更改,detach()则是生成了一个新的variable。比如a -> b -> c中如果对b进行detach(),后面如果想修改还是可以对原来的计算图进行操作。但是如果是进行了detach_(),那么原来的计算图也发生了变化。
8.item() 取出单元素张量的元素值并返回该值,保持原元素类型不变。,即:原张量元素为整形,则返回整形,原张量元素为浮点型则返回浮点型
9.net.apply(init_func) 此种初始化方式采用的递归,而在python中,对递归层数是有限制的,所以当网络结构很深时,可能会递归层数过深的错误
10.nn.ReflectionPad2d:填充
11.(BatchNorm、LayerNorm、InstanceNorm、GroupNorm)
https://blog.csdn.net/shanglianlm/article/details/85075706
BN,LN,IN,GN从学术化上解释差异:
BatchNorm:batch方向做归一化,算NHW的均值,对小batchsize效果不好;BN主要缺点是对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结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
12.nn.ZeroPad2d()
指定tensor的四个方向上的填充,比如左边添加1dim、右边添加2dim、上边添加3dim、下边添加4dim,即指定paddin参数为(1,2,3,4)
13.Apply()
Pytorch 的初始化方法apply
from torch.nn import init
import torch
class A:
def init(self):
self.weight = torch.tensor([0.0, 0.0])
self.bias = 0
pass
def apply(self, func):
func(self)
B = A()
def init_weight(B):
def init_value(m):
if hasattr(m, ‘weight’):
init.normal_(m.weight, 0.0, 0.02)
B.apply(init_value)
init_weight(B)
print(B.weight)
14.nn.Sequential()
torch.nn.Sequential是一个Sequential容器,模块将按照构造函数中传递的顺序添加到模块中。另外,也可以传入一个有序模块。 为了更容易理解,官方给出了一些案例:
15.itertools.chain()
itertools 是 Python 中的一个模块,具有一组用于处理迭代器的函数。它们可以非常轻松地遍历列表和字符串等可迭代对象。一个这样的 itertools 函数是 chain()。
它是一个接受一系列可迭代对象并返回一个可迭代对象的函数。它将所有可迭代对象组合在一起并生成一个可迭代对象作为输出。它的输出不能直接使用,因此显式转换为可迭代对象。该函数属于终止迭代器的迭代器类别。
from itertools import chain
odd = [1, 3, 5, 7, 9]
even = [2, 4, 6, 8, 10]
numbers = list(chain(odd, even))
print(numbers)
16.(1) torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
参数:
optimizer (Optimizer) – 封装好的优化器
lr_lambda (function or list) –当是一个函数时,需要给其一个整数参数,使其计算出一个乘数因子,用于调整学习率,通常该输入参数是epoch数目;或此类函数的列表,根据在optimator.param_groups中的每组的长度决定lr_lambda的函数个数,如下报错。
last_epoch (int) – 最后一个迭代epoch的索引. Default: -1.
optimizer = optim.SGD(params = model.parameters(), lr=0.05)
lambda1 = lambda epoch:epoch // 10 #根据epoch计算出与lr相乘的乘数因子为epoch//10的值
lambda2 = lambda epoch:0.95 ** epoch #根据epoch计算出与lr相乘的乘数因子为0.95 ** epoch的值
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda= lambda2)
(2)torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
(3)torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
(4)torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)
(5)余弦退火调度torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
(6)动态衰减torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode=‘min’, factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode=‘rel’, cooldown=0, min_lr=0, eps=1e-08)
参数:
optimizer (Optimizer) – 封装的优化器
mode (str) – min, max两个模式中一个。在min模式下,当监测的数量停止下降时,lr会减少;在max模式下,当监视的数量停止增加时,它将减少。默认值:“分钟”。
factor (float) – 学习率衰减的乘数因子。new_lr = lr * factor. Default: 0.1.
patience (int) – 没有改善的迭代epoch数量,这之后学习率会降低。例如,如果patience = 2,那么我们将忽略前2个没有改善的epoch,如果loss仍然没有改善,那么我们只会在第3个epoch之后降低LR。Default:10。
verbose (bool) – 如果为真,则为每次更新打印一条消息到stdout. Default: False.
threshold (float) – 阈值,为衡量新的最优值,只关注显著变化. Default: 1e-4.
threshold_mode (str) – rel, abs两个模式中一个. 在rel模式的“max”模式下的计算公式为dynamic_threshold = best * (1 + threshold),或在“min”模式下的公式为best * (1 - threshold)。在abs模式下的“max”模式下的计算公式为dynamic_threshold = best + threshold,在“min”模式下的公式为的best - threshold. Default: ‘rel’.
cooldown (int) – 减少lr后恢复正常操作前等待的时间间隔. Default: 0.
min_lr (float or list) – 标量或标量列表。所有参数组或每组的学习率的下界. Default: 0.
eps (float) – 作用于lr的最小衰减。如果新旧lr之间的差异小于eps,则忽略更新. Default: 1e-8.
(7)torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, mode=‘triangular’, gamma=1.0, scale_fn=None, scale_mode=‘cycle’, cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1)
根据循环学习速率策略(CLR)设置各参数组的学习速率。该策略以恒定的频率循环两个边界之间的学习率,论文 Cyclical Learning Rates for Training Neural Networks中进行详细介绍。两个边界之间的距离可以按每次迭代或每次循环进行缩放。
17.torchvision.utils.make_grid()用于把几个图像按照网格排列的方式绘制出来
18.torch.cuda() https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-cuda/
torch.cuda.device_count()
19.nn.InstanceNorm2d()
20.import torch.optim as optim
(1) torch.optim.SGD
(2) torch.optim.ASGD
(3) torch.optim.Rprop
(4) torch.optim.Adagrad
(5) torch.optim.Adadelta
(6) torch.optim.RMSprop
(7) torch.optim.Adam(AMSGrad)
(8) torch.optim.Adamax
(9) torch.optim.SparseAdam
(10) torch.optim.LBFGS
21.from torchvision.utils
(1)torchvision.utils.make_grid()
(2)torchvision.utils.save_image()
22.optimizer_g.param_groups
23.generator.data
24.torch.save
25.transforms.Compose
data_transforms = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])
transforms.Compose(transforms) 方法是将多种变换组合在一起
26.torchvision.transforms模块详解
1.对Tensor进行变换
torchvision.transforms.Normalize(mean, std):用给定的均值和标准差分别对每个通道的数据进行正则化。具体来说,给定均值(M1,…,Mn),给定标准差(S1,…,Sn),其中n是通道数(一般是3),对每个通道进行如下操作:
output[channel] = (input[channel] - mean[channel]) / std[channel]
比如:原来的tensor是三个维度的,值在[0,1]之间,经过变换之后就到了[-1,1]
计算如下:((0,1)-0.5)/0.5=(-1,1)
torchvision.transforms.ToTensor :把一个取值范围是[0,255]的PIL.Image或者shape为(H,W,C)的numpy.ndarray,转换成形状为[C,H,W],取值范围是[0,1.0]的torch.FloadTensor
torchvision.transforms.ToPILImage:将shape为(C,H,W)的Tensor或shape为(H,W,C)的numpy.ndarray转换成PIL.Image,值不变。
torchvision.transforms.CenterCrop(size)
将给定的PIL.Image进行中心切割,得到给定的size,size可以是tuple,(target_height, target_width)。size也可以是一个Integer,在这种情况下,切出来的图片的形状是正方形。
torchvision.transforms.RandomCrop(size, padding=0)
切割中心点的位置随机选取。size可以是tuple也可以是Integer。
torchvision.transforms.RandomHorizontalFlip
随机水平翻转给定的PIL.Image,概率为0.5。即:一半的概率翻转,一半的概率不翻转。
torchvision.transforms.RandomSizedCrop(size, interpolation=2)
先将给定的PIL.Image随机切,然后再resize成给定的size大小。
torchvision.transforms.Pad(padding, fill=0)
将给定的PIL.Image的所有边用给定的pad value填充。 padding:要填充多少像素 fill:用什么值填充
torch.utils.data.DataLoader