pytorch训练技巧(代码片段)

风信子的猫Redamancy 风信子的猫Redamancy     2022-11-30     725

关键词:

Pytorch 训练技巧

文章目录

1、指定GPU编号

  • 设置当前使用的GPU设备仅为0号设备,设备名称为 /gpu:0os.environ["CUDA_VISIBLE_DEVICES"] = "0"
  • 设置当前使用的GPU设备为0,1号两个设备,名称依次为 /gpu:0/gpu:1os.environ["CUDA_VISIBLE_DEVICES"] = "0,1" ,根据顺序表示优先使用0号设备,然后使用1号设备。

指定GPU的命令需要放在和神经网络相关的一系列操作的前面。

2、查看模型每层输出详情

Keras有一个简洁的API来查看模型的每一层输出尺寸,这在调试网络时非常有用。现在在PyTorch中也可以实现这个功能。

使用很简单,如下用法:

from torchsummary import summary
summary(your_model, input_size=(channels, H, W))

input_size 是根据你自己的网络模型的输入尺寸进行设置。

pytorch-summarygithub.com

3、梯度裁剪(Gradient Clipping)

import torch.nn as nn

outputs = model(data)
loss= loss_fn(outputs, target)
optimizer.zero_grad()
loss.backward()
nn.utils.clip_grad_norm_(model.parameters(), max_norm=20, norm_type=2)
optimizer.step()

nn.utils.clip_grad_norm_ 的参数:

  • parameters – 一个基于变量的迭代器,会进行梯度归一化
  • max_norm – 梯度的最大范数
  • norm_type – 规定范数的类型,默认为L2

4、扩展单张图片维度

因为在训练时的数据维度一般都是 (batch_size, c, h, w),而在测试时只输入一张图片,所以需要扩展维度,扩展维度有多个方法:

import cv2
import torch

image = cv2.imread(img_path)
image = torch.tensor(image)
print(image.size())

img = image.view(1, *image.size())
print(img.size())

# output:
# torch.Size([h, w, c])
# torch.Size([1, h, w, c])

import cv2
import numpy as np

image = cv2.imread(img_path)
print(image.shape)
img = image[np.newaxis, :, :, :]
print(img.shape)

# output:
# (h, w, c)
# (1, h, w, c)

或(感谢知乎用户coldleaf的补充)

import cv2
import torch

image = cv2.imread(img_path)
image = torch.tensor(image)
print(image.size())

img = image.unsqueeze(dim=0)  
print(img.size())

img = img.squeeze(dim=0)
print(img.size())

# output:
# torch.Size([(h, w, c)])
# torch.Size([1, h, w, c])
# torch.Size([h, w, c])

tensor.unsqueeze(dim):扩展维度,dim指定扩展哪个维度。

tensor.squeeze(dim):去除dim指定的且size为1的维度,维度大于1时,squeeze()不起作用,不指定dim时,去除所有size为1的维度。

5、独热编码

在PyTorch中使用交叉熵损失函数的时候会自动把label转化成onehot,所以不用手动转化,而使用MSE需要手动转化成onehot编码。

import torch
class_num = 8
batch_size = 4

def one_hot(label):
    """
    将一维列表转换为独热编码
    """
    label = label.resize_(batch_size, 1)
    m_zeros = torch.zeros(batch_size, class_num)
    # 从 value 中取值,然后根据 dim 和 index 给相应位置赋值
    onehot = m_zeros.scatter_(1, label, 1)  # (dim,index,value)

    return onehot.numpy()  # Tensor -> Numpy

label = torch.LongTensor(batch_size).random_() % class_num  # 对随机数取余
print(one_hot(label))

# output:
[[0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0.]]

Convert int into one-hot formatdiscuss.pytorch.org

6、防止验证模型时爆显存

验证模型时不需要求导,即不需要梯度计算,关闭autograd,可以提高速度,节约内存。如果不关闭可能会爆显存。

with torch.no_grad():
    # 使用model进行预测的代码
    pass

Pytorch 训练时无用的临时变量可能会越来越多,导致 out of memory ,可以使用下面语句来清理这些不需要的变量。

torch.cuda.empty_cache()

更详细的优化可以查看 优化显存使用显存利用问题

7、学习率衰减

import torch.optim as optim
from torch.optim import lr_scheduler

# 训练前的初始化
optimizer = optim.Adam(net.parameters(), lr=0.001)
scheduler = lr_scheduler.StepLR(optimizer, 10, 0.1)  # # 每过10个epoch,学习率乘以0.1

# 训练过程中
for n in n_epoch:
    scheduler.step()
    ...

8、冻结某些层的参数

参考:Pytorch 冻结预训练模型的某一层

在加载预训练模型的时候,我们有时想冻结前面几层,使其参数在训练过程中不发生变化。

我们需要先知道每一层的名字,通过如下代码打印:

net = Network()  # 获取自定义网络结构
for name, value in net.named_parameters():
    print('name: 0,\\t grad: 1'.format(name, value.requires_grad))

假设前几层信息如下:

name: cnn.VGG_16.convolution1_1.weight,	 grad: True
name: cnn.VGG_16.convolution1_1.bias,	 grad: True
name: cnn.VGG_16.convolution1_2.weight,	 grad: True
name: cnn.VGG_16.convolution1_2.bias,	 grad: True
name: cnn.VGG_16.convolution2_1.weight,	 grad: True
name: cnn.VGG_16.convolution2_1.bias,	 grad: True
name: cnn.VGG_16.convolution2_2.weight,	 grad: True
name: cnn.VGG_16.convolution2_2.bias,	 grad: True

后面的True表示该层的参数可训练,然后我们定义一个要冻结的层的列表:

no_grad = [
    'cnn.VGG_16.convolution1_1.weight',
    'cnn.VGG_16.convolution1_1.bias',
    'cnn.VGG_16.convolution1_2.weight',
    'cnn.VGG_16.convolution1_2.bias'
]

冻结方法如下:

net = Net.CTPN()  # 获取网络结构
for name, value in net.named_parameters():
    if name in no_grad:
        value.requires_grad = False
    else:
        value.requires_grad = True

冻结后我们再打印每层的信息:

name: cnn.VGG_16.convolution1_1.weight,	 grad: False
name: cnn.VGG_16.convolution1_1.bias,	 grad: False
name: cnn.VGG_16.convolution1_2.weight,	 grad: False
name: cnn.VGG_16.convolution1_2.bias,	 grad: False
name: cnn.VGG_16.convolution2_1.weight,	 grad: True
name: cnn.VGG_16.convolution2_1.bias,	 grad: True
name: cnn.VGG_16.convolution2_2.weight,	 grad: True
name: cnn.VGG_16.convolution2_2.bias,	 grad: True

可以看到前两层的weight和bias的requires_grad都为False,表示它们不可训练。

最后在定义优化器时,只对requires_grad为True的层的参数进行更新。

optimizer = optim.Adam(filter(lambda p: p.requires_grad, net.parameters()), lr=0.01)

pytorch学习笔记:pytorch进阶训练技巧(代码片段)

PyTorch实战:PyTorch进阶训练技巧往期学习资料推荐:1.Pytorch实战笔记_GoAI的博客-CSDN博客2.Pytorch入门教程_GoAI的博客-CSDN博客本系列目录:PyTorch学习笔记(一):PyTorch环境安装PyTorch学习笔记(二)... 查看详情

pytorch训练深度学习小技巧收集(代码片段)

1、对不同的网络层配置不同的学习率importtorchoptimizer=torch.optim.Adam([dict(params=model.conv1.parameters(),weight_decay=5e-4),dict(params=model.conv2.parameters(),weight_decay=0)],lr=args.lr)#Onlyperformweight-decayonfirstconvolution. 查看详情

六pytorch进阶训练技巧(代码片段)

六、PyTorch进阶训练技巧文章目录六、PyTorch进阶训练技巧1.自定义损失函数1.1.函数定义1.2.类定义1.2.1.DiceLoss1.2.2.DiceBCELoss1.2.3.IoULoss1.2.4.FocalLoss2.动态调整学习率2.1.使用官方提供的scheduler2.2.自定义scheduler3.模型微调-torchvision3.1使用... 查看详情

把显存用在刀刃上!17种pytorch节约显存技巧(代码片段)

引导1.显存都用在哪儿了?2.技巧1:使用就地操作3.技巧2:避免中间变量4.技巧3:优化网络模型5.技巧4:减小BATCH_SIZE6.技巧5:拆分BATCH7.技巧6:降低PATCH_SIZE8.技巧7:优化损失求和9.技巧8:调整训... 查看详情

python示例pytorch训练循环(代码片段)

查看详情

pytorch基础训练库pytorch-base-trainer(支持模型剪枝分布式训练)(代码片段)

Pytorch基础训练库Pytorch-Base-Trainer(支持模型剪枝分布式训练)目录Pytorch基础训练库Pytorch-Base-Trainer(PBT)(支持分布式训练)1.Introduction2.Install3.训练框架 (1)训练引擎(Engine)(2)回调函数(Callback)4.使用方法5.Example:构建自己的分类Pipeline6.可... 查看详情

pytorch自定义数据集模型训练流程(代码片段)

文章目录Pytorch模型自定义数据集训练流程1、任务描述2、导入各种需要用到的包3、分割数据集4、将数据转成pytorch标准的DataLoader输入格式5、导入预训练模型,并修改分类层6、开始模型训练7、利用训好的模型做预测Pytorch模... 查看详情

pytorch(网络模型训练)(代码片段)

上一篇目录标题网络模型训练小插曲训练模型数据训练GPU训练第一种方式方式二:查看GPU信息完整模型验证网络模型训练小插曲区别importtorcha=torch.tensor(5)print(a)print(a.item())importtorchoutput=torch.tensor([[0.1,0.2],[0.05,0.4]])print(ou... 查看详情

动物数据集+动物分类识别训练代码(pytorch)(代码片段)

动物数据集+动物分类识别训练代码(Pytorch)目录 动物数据集+动物分类识别训练代码(Pytorch)1.前言2.Animals-Dataset动物数据集说明(1)Animals90动物数据集(2)Animals10动物数据集(3)自定义数据集3.动物分... 查看详情

训练技巧详解含有部分代码bagoftricksforimageclassificationwithconvolutionalneuralnetworks

训练技巧详解【含有部分代码】BagofTricksforImageClassificationwithConvolutionalNeuralNetworks置顶 2018-12-1122:07:40 Snoopy_Dream 阅读数1332更多分类专栏: 计算机视觉 pytorch 深度学习tricks 版权声明:本文为博主原创 查看详情

pytorch单机多卡训练(代码片段)

pytorch单机多卡训练训练只需要在model定义处增加下面一行:model=model.to(device)#device为0号model=torch.nn.DataParallel(model)载入模型如果是多GPU载入,没有问题如果训练时是多GPU,但是测试时是单GPU,会出现报错解决办法 查看详情

pytorch笔记-开发技巧与爱因斯坦标示法(einops)(代码片段)

欢迎关注我的CSDN:https://blog.csdn.net/caroline_wendy本文地址:https://blog.csdn.net/caroline_wendy/article/details/128222398NLPseq2seq代码编写技巧数据tokenization,离散符号,翻译,划分tokentoken2idx,将token变成idxaddSoS&EoS,开头和结尾添加标识符... 查看详情

pytorch预训练(代码片段)

前言最近使用PyTorch感觉妙不可言,有种当初使用Keras的快感,而且速度还不慢。各种设计直接简洁,方便研究,比tensorflow的臃肿好多了。今天让我们来谈谈PyTorch的预训练,主要是自己写代码的经验以及论坛PyT... 查看详情

pytorch技巧(代码片段)

one-hotencoding和常规label的转化常规label指0,1,2,3,4,5,......(一个数代表一类)#常规label转one-hot向量defencode_onehot(labels):#用单位矩阵来构建onehot向量classes=set(labels)classes_dict=c:np.identity(len(classes))[i,:]fori,cin#单位矩阵e 查看详情

pytorch多卡分布式训练distributeddataparallel使用方法(代码片段)

PyTorch多卡分布式训练DistributedDataParallel 使用方法目录PyTorch多卡分布式训练DistributedDataParallel 使用方法1.DP模式和DP模式(1)单进程多GPU训练模式:DP模式(2)多进程多GPU训练模式:DDP模式2.Pytorch分布式训练方法3.Pytorch-Base-Trainer(PBT)... 查看详情

python使用pytorch微调预先训练的模型(代码片段)

查看详情

pytorch在gpu上训练模型(代码片段)

PyTorch在GPU上训练模型为了真正利用Pytorch中Tensor的优秀属性,加速模型的训练,我们可以将训练过程转移到GPU上进行.1.首先要定义设备,如果CUDA是可用的则被定义成GPU,否则被定义成CPU.device=torch.device("cuda:0"iftorch.cuda.is_availabl... 查看详情

pytorch教程-4:pytorch中网络的训练与测试(代码片段)

PyTorch教程系列:https://blog.csdn.net/qq_38962621/category_10652223.htmlPyTorch教程-4:PyTorch中网络的训练与测试基本原理对于要训练的模型,首先我们需要定义其结构,实例化一个用于计算Loss的loss_function和一个用于更新参数... 查看详情