栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Pytorch训练笔记(更新中)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Pytorch训练笔记(更新中)

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

2.在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

3.model.train以及model.eval

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

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

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

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

(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操作

6.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网络。

7.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工程代码学习笔记)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/313759.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号