Pytorch训练笔记(更新中)

1.配置环境时可以利用配置文件,采用命令:pip install -r requirement.txt

方法:首先在pycharm中利用tools->deployment-configuration连接服务器设置mappings,再利用upload将工程代码上传到服务器指定位置

随后在服务器的.conda文件夹内创建自己的工程环境

在pycharm内打开工程,利用settings将工程的解释器选择为ssh对应工程的解释器

选择tools->start ssh sessions与服务器发起远程会话:

首先进入我们自己的环境,并且在远程终端内调整路径到我们的工程文件下(要让pycharm能找到requirements.txt的位置),否则如图所示找不到requirement文件位置

 改变路径到工程文件夹下,输入命令pip install -r requirement.txt即可

并输入pip install -r requirement.txt

2.设置自己的环境的pytorch以及CUDA版本

例如代码要求环境配置为pytorch版本1.0.1 CUDA版本10.0.130  进入环境后输入代码

conda install pytorch=1.0.1 cudatoolkit=10.0.130 -c pytorch

 下载完成后我们可以打开python交互模式来查询pytorch以及CUDA的版本

source activate HTCN-env   #首先进入环境
python3                    #打开python交互
import torch               #导入torch
print(torch.version.cuda)  #输出cuda版本
>>>10.0.130                #输出正确版本

3.在transform操作中常常会出现transform.ToTensor以及transform.Normalize操作

transform.ToTensor(),
transform.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))

ToTensor操作会把一张图片的值从0-255转换成0-1的小数,并把数据转化成Tensor格式。目的是0-1的像素值在训练的过程中更好收敛。

Normalize的参数为两个tuple,依次代表均值与标准差。而每个tuple由三个元素构成,分别代表图像得RGB三个通道。标准化操作就是图片像素值减去均值除以标准差。

我们在Normalize看到的均值与方差都是0-1内的数,正是因为我们一般先使用ToTensor将像素值转化为0-1了,这样均值和标准差也是0-1。

在还原图片的时候我们首先还原Normalize操作:像素值乘标准差再加均值

再还原ToTensor操作:像素值乘255

4.model.train以及model.eval

在使用pytorch构建神经网络的时候,训练过程中会在程序上方添加一句model.train(),作用是启用batch normalization和drop out。

测试/验证过程中会使用model.eval(),这时神经网络会沿用batch normalization的值,并不使用drop out,并且关闭梯度的计算(因为测试的时候不需要反向传播来更新参数),因此减少了计算量。

5.pytorch的transform等图片处理操作都是基于PIL来处理的,因此我们在重写dataset的时候也要尽量用PIL来读取图片。

6.常用的几个小技巧(更新)

(1)torch.stack(list,dim=0)  可以把一个列表的元素合并成一个大的tensor,多出来的维度在dim=0

例:我有一个图像的list,一共16张图片,每张图片的大小是3x224x224(CHW)。训练过程中batchsize的大小就是16,我想把这个列表里的所有图片合成一个batch。实际上dataloader生成的一个batch就是一个大小为NxCxHxW的tensor,即16x3x224x224。dataloader将所有的训练数据打包成一个一个的batch输送到网络中去。

我们就可以使用torch.stack(image_list,dim=0),原list每一个tensor的大小是3x224x224,在dim=0的位置上添加N=16(list的长度),构成tensor(16x3x224x224)

(2)numpy.transpose(1,2,0)    用numpy来调转图片的通道

假设我的原图片的通道(0,1,2)分别对应着CHW,现在我想把通道顺序改成HWC(1对应H,2对应W,0对应C),则可以使用transpose操作

7.torch.Tensor.item() 与 torch.Tensor.detach()

torch.Tensor.item()将一个tensor转换成标准的python数字类型,注意被转换的tensor必须是只含有一个元素的,即将一个元素的tensor转换为数字,用于画图输出等。对于不是一个数字的tensor,可以使用tolist命令。

torch.Tensor.detach()将一个tensor从当前pytorch的计算图中分离出来。分离之后这个tensor不再参与当前计算图的梯度反向传播。

举个例子,一个网络A输出了一个tensor:a,再将a传到网络B中通过反向传播进行训练。如果我们不使用detach操作,那么在计算图就是A->a->B,在反向传播的过程中我们不但会更新网络B的参数也会更新网络A的参数。如果我们对a使用a.detach,那么计算图改为A->a   a->B,在反向传播时梯度到张量a就停止了,因此只会更新B网络的参数,训练不会影响到A网络。

8.collate_fn: 用于对单个样本生成batch的函数(本质上是dataloader的一个参数)

在我们重写dataset的过程中,我们会发现我们利用dataset生成了单个样本的数据以及标签。所谓collate_fn就是我们如何把这些单样本以及标签打包成dataloader的一个batch。通常来说我们不写的话pytorch可以自动帮我们实现,但是如果我们有特殊需求就必须自己写collate_fn。

重写collate_fn的位置:dataset的一个方法  使用重写的collate_fn的位置:dataloader的一个参数

我们通过dataset与dataloader生成数据的过程是这样的:

首先我们重写dataset生成单个样本与标签,然后dataloader读取batchsize并生成一个batch。batch由batchsize个tuple构成,每个tuple有两个元素构成:图片以及对应的标签。collate_fn接受一个batch,返回一个列表[images,labels]:images是batch所有的图片(一共batchsize个)单独构成的元组,labels是由batch所有的标签(一共batchsize个)单独构成的元组。我们可以借助zip(*batch)命令来实现这个分离(见我的文章Python工程代码学习笔记)。

9.epoch与iteration的关系

 在训练的时候我们绘制loss曲线的时候,横坐标是epoch,纵坐标是mean_loss.item()

通常我们也会提前实现一个epoch的训练函数以及验证函数,然后在epoch循环内反复调用即可。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值