PyTorch中定义可学习参数时的坑

这篇具有很好参考价值的文章主要介绍了PyTorch中定义可学习参数时的坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当需要在模型运行时定义可学习参数时(常见场景:参数的维度由每一层的维度定),我们就需要用这样的写法来实现:

class model(torch.nn.Module):
	def __init__(self):
		super().__init__()
		self.alpha = None

	def forward(self, x):
		if self.alpha is None:
			self.alpha = torch.nn.Parameter(torch.ones(x.shape[0]), requires_grad=True)
		...

采用这种写法的话,必须要在正式训练模型之前进行一次预推理,该预推理可以是伪输入数据的推理,目的是预推理时构建好每一层所需要的self.alpha可学习参数。我常用的写法如下:

dummy_input = torch.randn(1, 3, 32, 32)
# 1:batch size为1,只推理单个样本;3:数据集的图像通道数;32:数据集的图像大小
model(dummy_input)

必须要注意的是,新定义的self.alpha必须要放入optimizer中才可以训练,因此,上面这段预推理的代码必须要放在声明optimizer之前!!!原因很简单,声明optimizer时,有个传入参数就是模型参数列表:

optimizer = torch.optim.SGD(model.parameters(), xxx)

但是这里会出现一个问题:由于self.alpha时在模型运行(预推理)时构建的,所以尚未放入cuda中。因此,需要手动将self.alpha放入cuda中。于是,有如下两种可能的写法:

# 写法1(错误)
self.alpha = torch.nn.Parameter(torch.ones(x.shape[0]), requires_grad=True).to(x.device)

# 写法2(正确)
self.alpha = torch.nn.Parameter(torch.ones(x.shape[0]).to(x.device), requires_grad=True)

试问这两种写法都正确吗?思考一分钟…
时间到!实际上,只有写法2是正确的!

写法1先定义nn.Parameter,后放入cuda,会导致参数重新变回到tensor,从而不可学习;
写法2先放入cuda,后定义nn.Parameter,可以成功定义参数,可以学习。

总之,记住就好,这确实也是一个一找可以找一整晚的BUG了文章来源地址https://www.toymoban.com/news/detail-804523.html

到了这里,关于PyTorch中定义可学习参数时的坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PyTorch深度学习实战(3)——使用PyTorch构建神经网络

    我们已经学习了如何从零开始构建神经网络,神经网络通常包括输入层、隐藏层、输出层、激活函数、损失函数和学习率等基本组件。在本节中,我们将学习如何在简单数据集上使用 PyTorch 构建神经网络,利用张量对象操作和梯度值计算更新网络权重。 1.1 使用 PyTorch 构建神

    2024年02月08日
    浏览(43)
  • 卷积神经网络——上篇【深度学习】【PyTorch】

    5.1.1、理论部分 全连接层后,卷积层出现的意义? 一个足够充分的照片数据集,输入,全连接层参数,GPU成本,训练时间是巨大的。 (convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法,需要更少的参数,在处理图像和其他类型的结构化数据

    2024年02月12日
    浏览(32)
  • Pytorch深度学习-----神经网络之线性层用法

    PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Compose,RandomCrop) Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10) Pytorch深度学习--

    2024年02月14日
    浏览(34)
  • 动手学深度学习-pytorch版本(二):线性神经网络

    参考引用 动手学深度学习 神经网络的整个训练过程,包括: 定义简单的神经网络架构、数据处理、指定损失函数和如何训练模型 。经典统计学习技术中的 线性回归 和 softmax 回归 可以视为线性神经网络 1.1 线性回归 回归 (regression) 是能为一个或多个自变量与因变量之间关系建

    2024年02月12日
    浏览(47)
  • 《Pytorch深度学习和图神经网络(卷 2)》学习笔记——第一章

    PyTorch深度学习和图神经网络(卷2)——开发应用一书配套代码: https://github.com/aianaconda/pytorch-GNN-2nd- 百度网盘链接:https://pan.baidu.com/s/1dnq5IbFjjdekAR54HLb9Pg 提取码:k7vi 压缩包密码:dszn 2012年起,在ILSVRC竞赛中获得冠军的模型如下 2012年:AlexNet 2013年:OverFeat 2014年:GoogLeNet、

    2024年02月16日
    浏览(43)
  • 《Pytorch深度学习和图神经网络(卷 1)》学习笔记——第七章

    这一章内容有点丰富,多用了一些时间,实例就有四五个。 这章内容是真多啊!(学完之后又回到开头感叹) 将图像从基础像素到局部信息再到整体信息 即将图片由低级特征到高级特征进行逐级计算,逐级累计。 计算机中对图片的处理可以理解为离散微积分的过程。 利用

    2024年02月12日
    浏览(46)
  • PyTorch深度学习实战(1)——神经网络与模型训练过程详解

    人工神经网络 ( Artificial Neural Network , ANN ) 是一种监督学习算法,其灵感来自人类大脑的运作方式。类似于人脑中神经元连接和激活的方式,神经网络接受输入,通过某些函数在网络中进行传递,导致某些后续神经元被激活,从而产生输出。函数越复杂,网络对于输入的数据拟

    2024年02月06日
    浏览(47)
  • 《动手学深度学习 Pytorch版》 9.4 双向循环神经网络

    之前的序列学习中假设的目标是在给定观测的情况下对下一个输出进行建模,然而也存在需要后文预测前文的情况。 数学推导太复杂了,略。 双向循环神经网络(bidirectional RNNs)添加了反向传递信息的隐藏层,以便更灵活地处理此类信息。 前向和反向隐状态的更新如下:

    2024年02月07日
    浏览(43)
  • 卷积神经网络——下篇【深度学习】【PyTorch】【d2l】

    5.10.1、理论部分 批量归一化可以解决深层网络中梯度消失和收敛慢的问题,通过固定每个批次的均值和方差来加速收敛,一般不改变模型精度。批量规范化已经被证明是一种不可或缺的方法,它适用于几乎所有图像分类器。 批量规划是一个线性变换 ,把参数的均值方差给拉

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包