pytorch零碎笔记

pytorch零碎笔记

  • 为什么要设置随机种子
  • 数据规范化
  • 数据扩充
  • 模型定义
  • 定义训练循环
  • 常用函数
    • reshape()
    • transforms.Compose()
    • data.DataLoader
    • torch.nn.Conv2d()
    • torch.nn.Linear()
    • torch.nn.Parameter()
    • torch.nn.Identity()

为什么要设置随机种子

模型搭建过程中,参数都需要进行初始化,如果每次初始化的结果不同,训练模型的结果就不一样
因此为了保证每次输出结果一致,就需要设置随机数种子,保证代码的可复现性

random.random() #这个方法生产每次产生的随机数都是不同的
random.seed(x) #只要设定了随机数种子x,那么得到的随机数序列就是相同的

随机数种子的值可以是任意数字

数据规范化

规范化后平均值为0,标准差为1

内置函数 .mean() 、 .std()函数可以分别用来计算平均值和标准差

数据扩充

导入torchvision.transforms模块,用于人工创建更多数据集的方式操纵可用的训练数据。

  • .RandomRotation(x):在(-x,+x)度之间随机旋转图像
  • .RandomCrop(a,b):在图像周围以b为大小填充,人为扩大,然后再按照a×a的大小裁剪
  • .ToTensor():将图像从PIL图像转换为PyTorch张量
  • .Normalize(mean=[mean], std=[std]):规范化,减去平均值mean,然后除以给定的标准差std

模型定义

class 模型名称(nn.Model):
	def __init__ (self,input_dim,output_dim):
		super().__init__()
		self.input_fc = nn.连接方式(input_dim,输出维度)
		self.hidden_fc1 = nn.连接方式(输入维度,输出维度)
		#多个隐藏层
		self.output_fc = nn.连接方式(输入维度,output_dim)
	def foward(self,x)
		h_1 = F.激活函数(self.input_fc(x))
		h_2 = F.激活函数(self.hidden_fc1(h_2))
		#...
		h_n = F.激活函数(self.hidden_fcn(h_n-1))
		y_pred = self.output_fc(h_n)

定义训练循环

#定义优化器
optimizer = optim.优化器名(model.parameters())
#定义损失函数,如:criterion = nn.CrossEntropyLoss()
LossFunction = nn.损失函数名()
def train(model,iterator,optimizer,LossFuction):
	epoch_loss = 0	#损失总和
	epoch_acc = 0	#精确度总和
	model.train()
	for (x,y) in iterator:
		optimizer,zero_grad()#自动清除梯度
		y_pred = model(x)
		loss = LossFunction(y_pred,y)	#计算loss
		acc = calculate_accuarcy(y_pred,y)	#计算准确度
		loss.backward()	#梯度下降
		optimizer.step()
		
		epoch_loss += loss.item()
		epoch_acc += acc.item()
	return epoch_loss/len(iterator), epoch_acc/len(iterator)

常用函数

reshape()

用于转变数组或矩阵的的形状,常用,特此记录一下
reshape()的默认排列方式是"按行"排列,即行优先,reshape(m,n)=reshape(m,n,order=‘c’);若要改为“按列”排列,可通过修改order参数进行改变,即reshape(m,n,order=‘f’)
参数-1表示无意义
reshape(-1,n)代表将数组重整为n列的二维数组
reshape(n,-1)代表将数组重整为n行的二维数组

transforms.Compose()

torchvision 是pytorch的一个图形库,常用函数有:

  • torchvision.datasets: 一些加载数据的函数及常用的数据集接口;
  • torchvision.models: 包含常用的模型结构(含预训练模型),例如AlexNet、VGG、ResNet等;
  • torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;
  • torchvision.utils: 其他的一些有用的方法。

在这其中,transforms.Compose()用于串联多个图片变换的操作,transform中的常用操作:

  • Resize:把给定的图片resize到给定size
  • Normalize:用均值和标准差归一化张量图像
  • ToTensor:将PIL图像转换为[0,255]范围内的张量(HWC),[0.0,1.0]范围内的张量(CHW)
  • ToPILImage:将张量转换为PIL图像
  • Scale:目前已经不用了,推荐用Resize
  • CenterCrop:在图片的中间区域进行裁剪
  • RandomCrop:在一个随机的位置进行裁剪
  • RandomHorizontalFlip:以0.5的概率水平翻转给定的PIL图像
  • RandomVerticalFlip:以0.5的概率竖直翻转给定的PIL图像
  • RandomResizedCrop:将PIL图像裁剪成任意大小和纵横比
  • Grayscale:将图像转换为灰度图像
  • RandomGrayscale:将图像以一定的概率转换为灰度图像
  • FiceCrop:把图像裁剪为四个角和一个中心
  • TenCrop
  • Pad:填充
  • ColorJitter:随机改变图像的亮度对比度和饱和度。

data.DataLoader

DataLoader 是PyTorch读取数据的一个重要接口,基本上用PyTorch训练模型都会用到。这个接口的目的是:将自定义的Dataset根据batch size大小、是否shuffle等选项封装成一个batch size大小的Tensor,后续只需要再包装成Variable即可作为模型输入用于训练。

class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
	batch_sampler=None, num_workers=0, collate_fn=<function default_collate>, 
	pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None)

常用参数有:

  • dataset (Dataset):定义要加载的数据集。
  • batch_size (int, optional):定义batch_size大小,也就是一次加载样本的数量,默认是1。
  • shuffle (bool, optional):在每个epoch开始的时候,是否进行数据重排序,默认False.
  • sampler (Sampler, optional):定义从数据集中取样本的策略,如果进行了指定,那么shuffle必须是False。
  • batch_sampler (Sampler, optional):与上一个参数sampler相似,但是一次只返回一个batch索引(indices),另外batch_sampler与batch_size,shuffle,sampler,drop_last互斥,也就是说设定了这个,其他四个就不能设定了。
  • num_workers (int, optional):定义加载数据使用的进程数,0代表所有的数据都被装载进主进程,默认是0。
  • collate_fn (callable*, *optional):将一个list的sample组成一个mini-batch的函数.
  • pin_memory (bool, optional):如果设定为True,那么data loader将会在返回之前,将tensors拷贝到CUDA中的固定内存。
  • drop_last (bool, optional): 这个是对最后的未完成的batch来说的,比如你的batch_size设置为64,而一个epoch只有100个样本,如果设置为True,那么训练的时候后面的36个就被扔掉了。如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点。
  • timeout (numeric, optional): 如果是正数,表明从worker进程中收集一个batch等待的时间,若超出设定的时间还没有收集到,那就不收集这个内容了。这个numeric总是大于等于0。默认为0。
  • worker_init_fn (callable, optional):每个worker的初始化函数,如果设置成None, 则在数据加载之前,在每个worker子进程上调用它,并将worker id ([0, num_workers - 1])作为输入。(默认值:无)

torch.nn.Conv2d()

Conv2d(in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1,bias=True, padding_mode=‘zeros’)

对由多个输入平面组成的输入信号进行二维卷积,常用参数有:

  • in_channels (int) : 输入图像通道数
  • out_channels (int) :卷积产生的通道数
  • kernel_size (int or tuple) : 卷积核尺寸,可以设为1个int型数或者一个(int, int)型的元组。例如(2,3)是高2宽3卷积核
  • stride (int or tuple, optional) : 卷积步长,默认为1。可以设为1个int型数或者一个(int, int)型的元组。
  • padding (int, tuple or str, optional) : 填充操作,控制padding_mode的数目,默认为0
    设置在所有边界增加 值为 0 的边距的大小(也就是在feature map 外围增加几圈 0 ),例如当 padding =1 的时候,如果原来大小为 3 × 3 ,那么之后的大小为 5 × 5 。即在外围加了一圈 0
  • padding_mode (string, optional) :padding模式,默认为Zero-padding 。 字符串类型,接收的字符串只有 “zeros” 和 “circular”
  • dilation (int or tuple, optional) : 扩张操作:控制kernel点(卷积核点)的间距,默认值:1。
  • groups (int, optional) : group参数的作用是控制分组卷积,默认不分组,为1组。
    groups 为1,那么所有的输入都会连接到所有输出
    当 groups 为 2的时候,相当于将输入分为两组,并排放置两层,每层看到一半的输入通道并产生一半的输出通道,并且两者都是串联在一起的。这也是参数字面的意思:“组” 的含义。
    需要注意的是,in_channels 和 out_channels 必须都可以整除 groups,否则会报错
    pytorch零碎笔记_第1张图片
  • bias (bool, optional) :为真,则在输出中添加一个可学习的偏差。默认:True。

torch.nn.Linear()

用于设置网络中的全连接层

torch.nn.Linear(in_features,out_features,bais=True)

in_features:输入样本的大小
out_features:输出样本的大小
从输入输出的张量的shape角度来理解,相当于一个输入为[batch_size, in_features]的张量变换成了[batch_size, out_features]的输出张量。

torch.nn.Parameter()

将一个固定不可训练的tensor转换成可以训练的类型parameter,并将这个parameter绑定到这个module里面(net.parameter()中就有这个绑定的parameter,所以在参数优化的时候可以进行优化的),所以经过类型转换这个self.v变成了模型的一部分,成为了模型中根据训练可以改动的参数了。
nn.Parameter()添加的参数会被添加到Parameters列表中,会被送入优化器中随训练一起学习更新
在nn.Module类中,pytorch 也是使用 nn.Parameter来对每一个module的参数进行初始化的

self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size))

torch.nn.Identity()

源码如下:

class Identity(Module):
    r"""A placeholder identity operator that is argument-insensitive.
    Args:
        args: any argument (unused)
        kwargs: any keyword argument (unused)
    Examples::
        >>> m = nn.Identity(54, unused_argument1=0.1, unused_argument2=False)
        >>> input = torch.randn(128, 20)
        >>> output = m(input)
        >>> print(output.size())
        torch.Size([128, 20])
    """
    def __init__(self, *args, **kwargs):
        super(Identity, self).__init__()
 
    def forward(self, input: Tensor) -> Tensor:
        return input

identity模块不改变输入,直接return input
不区分参数的占位符标识运算符。其实意思就是这个网络层的设计是用于占位的,即不干活,只是有这么一个层,放到残差网络里就是在跳过连接的地方用这个层,显得没有那么空虚!
比如我们要加深网络,有些层是不改变输入数据的维度的,在增减网络的过程中我们就可以用identity占个位置,这样网络整体层数永远不变

你可能感兴趣的:(pytorch,深度学习,python)