首页 > 其他分享 >PyTorch 提高生产力的技巧

PyTorch 提高生产力的技巧

时间:2023-08-25 15:36:59浏览次数:50  
标签:技巧 nn 模型 batch PyTorch 生产力 model 数据

推荐:使用NSDT场景编辑器助你快速搭建3D应用场景

介绍

您是否曾经花费数小时调试机器学习模型,但似乎找不到准确性没有提高的原因?你有没有觉得一切都应该完美地工作,但由于某种神秘的原因,你没有得到模范的结果?

好吧,没有了。作为初学者探索 PyTorch 可能会令人生畏。在本文中,您将探索久经考验的工作流程,这些工作流程肯定会改善您的结果并提高模型的性能。

1. 过拟合单个批次

曾经在大型数据集上训练模型数小时只是为了发现损失没有减少,准确性只是扁平化?好吧,先做一个健全性检查。

在大型数据集上训练和评估可能非常耗时,并且首先在一小部分数据上调试模型更容易。一旦我们确定模型正常工作,我们就可以轻松地将训练扩展到完整的数据集。

与其在整个数据集上进行训练,不如始终在单个批次上进行训练以进行健全性检查

batch = next(iter(train_dataloader)) # Get a single batch

# For all epochs, keep training on the single batch.
for epoch in range(num_epochs):
    inputs, targets = batch    
    predictions = model.train(inputs)

考虑上面的代码片段。假设我们已经有一个训练数据加载器和一个模型。我们无需迭代完整的数据集,而是可以轻松获取第一批数据集。然后,我们可以对单个批次进行训练,以检查模型是否可以学习这一小部分数据中的模式和方差。

如果损失减少到一个非常小的值,我们知道模型可以过度拟合这些数据,并且可以确保它在短时间内学习。然后,我们可以通过简单地更改一行来在整个数据集上对其进行训练,如下所示:

# For all epochs, iterate over all batches of data.
for epoch in range(num_epochs):
    for batch in iter(dataloader):
        inputs, targets = batch    
        predictions = model.train(inputs)

如果模型可以过度拟合单个批次,它应该能够学习完整数据集中的模式。这种过拟合批处理方法使调试更容易。如果模型甚至不能过度拟合单个批次,我们可以确定模型实现而不是数据集存在问题。

2. 规范化和随机播放数据

对于数据序列不重要的数据集,对数据进行随机排序会很有帮助。例如,对于图像分类任务,如果在单个批次中馈送不同类的图像,则模型将更好地拟合数据。以相同的顺序传递数据,我们冒着模型根据传递的数据序列学习模式的风险,而不是学习数据中的内在方差。因此,最好传递随机数据。为此,我们可以简单地使用 PyTorch 提供的 DataLoader 对象并将 shuffle 设置为 True。

from torch.utils.data import DataLoader

dataset = # Loading Data
dataloder = DataLoader(dataset, shuffle=True)

此外,在使用机器学习模型时规范化数据非常重要。当我们的数据存在较大方差并且特定参数的值高于数据集中的所有其他属性时,这一点至关重要。这可能会导致其中一个参数主导所有其他参数,从而导致精度降低。我们希望所有输入参数都在同一范围内,最好有 0 均值和 1.0 方差。 为此,我们必须转换我们的数据集。知道数据集的均值和方差后,我们可以简单地使用torchvision.transforms.Normalize函数。

import torchvision.transforms as transforms

image_transforms = transforms.Compose([
	transforms.ToTensor(),
	# Normalize the values in our data
	transforms.Normalize(mean=(0.5,), std=(0.5))
])

我们可以在变换中传递每个通道的平均值和标准差。归一化函数,它将自动转换平均值为 0 且标准差为 1 的数据。

3. 渐变剪切

梯度爆炸是RNN和LSTM中的一个已知问题。但是,它不仅限于这些体系结构。任何具有深层的模型都可能遭受梯度爆炸的影响。高梯度上的反向传播会导致发散,而不是损耗逐渐减少。

请考虑以下代码片段。

for epoch in range(num_epochs):
	for batch in iter(train_dataloader):
    	inputs, targets = batch
    	predictions = model(inputs)
   	 
   	 
    	optimizer.zero_grad() # Remove all previous gradients
    	loss = criterion(targets, predictions)
    	loss.backward() # Computes Gradients for model weights
   	 
    	# Clip the gradients of model weights to a specified max_norm value.
    	torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1)
   	 
    	# Optimize the model weights AFTER CLIPPING
    	optimizer.step()

为了解决梯度爆炸问题,我们使用渐变裁剪技术,将梯度值裁剪在指定范围内。例如,如果我们使用 1 作为上面的裁剪或范数值,则所有渐变都将在 [-1, 1] 范围内裁剪。如果我们的爆炸梯度值为 50,它将被裁剪为 1。因此,梯度裁剪解决了梯度爆炸问题,允许对模型进行缓慢的优化,使其趋同。

4.切换列车/评估模式

这一行代码肯定会提高模型的测试准确性。深度学习模型几乎总是使用辍学层和规范化层。这些只是稳定训练和确保模型不会因数据差异而过度拟合或发散时才需要的。BatchNorm 和 Dropout 等层在训练期间为模型参数提供正则化。但是,一旦经过培训,就不需要它们。将模型更改为评估模式将禁用仅训练所需的层,并且完整的模型参数用于预测。

For a better understanding, consider this code snippet.

for epoch in range(num_epochs):
    
	# Using training Mode when iterating over training dataset
	model.train()
	for batch in iter(train_dataloader):
    	    # Training Code and Loss Optimization
    
	# Using Evaluation Mode when checking accuarcy on validation dataset
	model.eval()
	for batch in iter(val_dataloader):
    	    # Only predictions and Loss Calculations. No backpropogation
    	    # No Optimzer Step so we do can omit unrequired layers.

评估时,我们不需要对模型参数进行任何优化。在验证步骤中,我们不计算任何梯度。为了更好地评估,我们可以省略 Dropout 和其他规范化层。例如,它将启用所有模型参数,而不是像 Dropout 图层中那样仅启用权重子集。这将大大提高模型的准确性,因为您将能够使用完整的模型。

5. 使用模块和模块列表

PyTorch 模型通常继承自 torch.nn.Module 基类。根据文档:

以这种方式分配的子模块将被注册,并在调用 to() 时转换其参数。

模块基类允许的是注册模型中的每个层。然后,我们可以使用 model.to() 和类似的函数,例如 model.train() 和 model.eval(),它们将应用于模型内的每一层。如果不这样做,将不会更改模型中包含的每个层的设备或训练模式。您必须手动执行此操作。一旦您仅在模型对象上使用函数,Module 基类将自动为您进行转换。

此外,一些模型包含类似的顺序层,可以使用 for 循环轻松初始化并包含在列表中。这简化了代码。但是,它会导致与上述相同的问题,因为简单 Python 列表中的模块不会在模型中自动注册。我们应该使用 ModuleList 来包含模型中类似的顺序层。

import torch
import torch.nn as nn


# Inherit from the Module Base Class
class Model(nn.Module):
      def __init__(self, input_size, output_size):
    	    # Initialize the Module Parent Class
    	    super().__init__()

    	     self.dense_layers = nn.ModuleList()

    	    # Add 5 Linear Layers and contain them within a Modulelist
    	    for i in range(5):
        	    self.dense_layers.append(
            	    nn.Linear(input_size, 512)
        	    )

    	    self.output_layer = nn.Linear(512, output_size)

	def forward(self, x):

    	    # Simplifies Foward Propogation.
     	    # Instead of repeating a single line for each layer, use a loop
    	    for layer in range(len(self.dense_layers)):
        	x = layer(x)

    	    return self.output_layer(x)

上面的代码片段显示了使用模型创建模型和子层的正确方法。使用模块和模块列表有助于避免在训练和评估模型时出现意外错误。

结论

上述方法是 PyTorch 机器学习框架的最佳实践。它们被广泛使用,并被 PyTorch 文档推荐。使用这样的方法应该是机器学习代码流的主要方式,并且肯定会改善你的结果。

原文链接:PyTorch 提高生产力的技巧 (mvrlink.com)

标签:技巧,nn,模型,batch,PyTorch,生产力,model,数据
From: https://www.cnblogs.com/mvrlink/p/17657067.html

相关文章

  • 【pandas小技巧】--DataFrame的显示样式
    上一篇介绍了DataFrame的显示参数,主要是对DataFrame中值进行调整。本篇介绍DataFrame的显示样式的调整,显示样式主要是对表格本身的调整,比如颜色,通过颜色可以突出显示重要的值,观察数据时可以更加高效的获取主要信息。下面介绍一些针对单个数据和批量数据的样式调整方式,让DataFram......
  • 讲解pytorch的tensor没有移除某个元素的操作
    在PyTorch中,要从一个Tensor中移除一个元素,您需要使用索引操作来选择保留的元素,然后重新创建一个新的Tensor。由于PyTorch的Tensor是不可变的,所以无法直接在原Tensor上移除元素。下面是一个示例,展示了如何从一个PyTorchTensor中移除指定位置的元素:importtorch#......
  • 提升网站排名:SEO优化的实用策略和技巧
    导言:搜索引擎优化(SEO)是提高网站在搜索引擎中排名的关键策略,有助于提升网站的可见性和流量。本文将分享一些实用的SEO优化策略和技巧,帮助您在竞争激烈的网络世界中脱颖而出。一、关键词研究和优化关键词选择: 选择与您网站内容相关且受众搜索频率较高的关键词。关键词密度: 在......
  • 小技巧——Win10篇
    快捷键Win+D切换到桌面Win+E打开文件资源管理器Win+I设置Win+L锁屏Win+M一键最小化Win+Shift+M还原最小化的窗口Win+R打开运行Win+V历史剪贴板Win+方向键电脑分屏Win+数字键打开任务栏的第N个程序Win++/-放大镜最后说个如何快捷键......
  • Java编码技巧
    1.常量&变量1.1.直接赋值常量值,禁止声明新对象直接赋值常量值,只是创建了一个对象引用,而这个对象引用指向常量值。反例:Longi=newLong(1L);Strings=newString("abc");正例:Longi=1L;Strings="abc";1.2.当成员变量值无需改变时,尽量定义为静态常量在类的每个对象实例中,......
  • 默笙の挂分小技巧
    挂分小技巧:计数题没开longlong快速幂底数没取模爆longlong对快速幂指数取模\(dp\)省去一维后没有反向\(check\)函数内一种情况不行直接return0把默认堆(大顶堆)当成小顶堆区间\(dp\)的断点\(k\)取到了\(r\),导致\(k+1>r\)环形\(dp\)没开双倍空间栈没放标兵......
  • c# .NET 高级编程 高并发必备技巧(二) - 分布式锁
    上一篇文章简单的介绍了单机的情况下如何进行加锁,防止高并发带来的问题。然而现实中,一般会高并发的应用,很少会单机部署。当用户量达到一定的程度,分布式、集群部署是必然的选择。在分布式部署的情况下,之前的单机锁还会有效吗?代码还是之前的代码:privatestaticobjectlck=......
  • h5开发流程中的关键要点(掌握h5开发的关键技巧)
    h5开发是结合了HTML、CSS和JavaScript等技术,可以实现丰富多样的交互效果和动画效果,同时也兼容多种终端设备。那么在进行h5开发时,我们需要掌握一些关键要点和技巧。下面广州名锐讯动总结了一些h5开发流程中的关键要点,帮助大家掌握h5开发的关键技巧。1.需求分析和界面设计需求分析时......
  • 新加坡服务器租用技巧
    租用新加坡服务器时,以下是一些技巧可以帮助你做出明智的决策:确定需求:首先明确你的需求,包括带宽、存储、CPU性能、内存等方面的要求。不同的应用需要不同的服务器配置。选择可靠的供应商:选择信誉良好、有经验的供应商。查看供应商的客户评价和口碑,了解他们的技术支持和服务质量。考......
  • Lnton羚通视频算法算力云平台【PyTorch】教程:学习基础知识如何保存和加载模型
    保存和加载模型是指将训练好的神经网络模型保存到文件中,以便在需要时重新加载该模型进行预测、推断或继续训练。保存模型的过程是将模型的参数和其他相关信息(如优化器状态等)保存到文件中。通过保存模型,我们可以在不重新训练的情况下保留模型的状态,方便后续使用。加载模型的过程是从......