pytorch 中 drop_last与 nn.Parameter

1. drop_last

在使用深度学习,pytorch 的DataLoader 中,

from torch.utils.data import DataLoader

# Define your dataset and other necessary configurations
# Create DataLoader
train_loader = DataLoader(dataset, batch_size=batch_size, drop_last=True)

drop_last=True :DataLoader 中的此设置会删除不完整的最后一批(如果它小于指定的批量大小)。这确保了训练期间处理的每个批次包含相同数量的样本。

1.1 drop_last = True

dataset_size = 100
batch_size = 32
train_loader = DataLoader(dataset, batch_size=batch_size, drop_last=True)

使用 drop_last=True ,DataLoader 确保每个批次包含 32 个样本,删除不完整的最终批次。例如,在这种情况下,训练期间将处理 3 个批次(32、32、32),其余 4 个样本将不会用于训练。

适用情况:

当网络模型的初始化中,需要用到batch size 时, 这种情况下, 需要注意的是此时, drop_last = False , 会影响网络模型结构, 由于模型的初始化过程中,使用了batch size 参数, 所有此时应该设置为 True;

1.2 drop_last = False

而当 drop_last = False, 当最后一个批次中, 剩余的样本个数不足 batch 样本数目时, 会保留这剩余的样本,使用剩余的样本进行训练。

当数据不均衡, 并且某一类中样本数量很少时, 此时 drop_last = True 会严重影响到模型的精度,此时应该使用 False;

原因是,本身的某个类别中训练集和测试集的数量就已经小于batch size 时, 此时使用 drop last, 会严重该类别的训练和测试效果。

如下面的情况:

遇到了这样的问题。一共16类,第15 16类的训练集数量是15、15,测试集分别为14、5。其他1-14类训练集分别有50个,测试集均为200左右。

当我在pytorch的dataloader中设置了drop_last=True时,无论怎么训练,使用怎么样的数据增强,第15 16类才测试集上的准确率永远为0.

原因分析:
当dataloader设置了drop_last=True时,在训练时如果数据总量无法整除batch_size,那么这个dataloader就会丢掉最后一个batch,也就是说训练的时候有部分数据是被丢掉的。而我遇到的情况可能是正好把第15 16类的测试数据给丢掉了部分,导致模型很好的学习到这两类的特征。

解决方案:
将drop_last改为False,即可解决该问题。

2. nn.Parameter

在深度学习训练过程中, 通常需要自己创建出一个初始化的张量, 并且希望通过模型训练过程中, 更新该张量。

torch.randn(bt, 3, 256)

而普通的使用torch 随机初始化的方式,如上面的这种方式,
在大多数情况下,随机初始化张量不会使其参数变得可学习。在没有任何相关学习过程或梯度更新的情况下随机初始化的张量在网络训练期间不会适应或改变。

2.1 可学习参数

为了使得创建的张量,在网络训练过程中,可以得到更新。

在 PyTorch 中, nn.Parameter 是一个继承自 torch.Tensor 的类。它允许您向框架指示该张量应被视为模型参数的一部分。当您将其分配为 nn.Module 中的属性时,它在优化过程中变得可训练。

import torch
import torch.nn as nn

# Creating a tensor as a learnable parameter
param_tensor = nn.Parameter(torch.randn(1, 3))

param_tensor 将在训练过程中进行优化因为它们被视为模型可学习参数的一部分。

放到 cuda 设备上

 self.cuda_param = nn.Parameter(torch.randn(1, 2).cuda())

2.2 nn.ParameterList

同样, 当想创建一个列表都是可学习的参数时, 使用如下的方式;

self.parameters = nn.ParameterList([nn.Parameter(torch.randn(256)) for _ in range(5)])
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值