torch.nn.Parameter()

一文通俗理解torch.nn.Parameter()

一、起源

首先,我写这篇文章的起源是因为,我突然看到了一段有关torch.nn.Parameter()的代码。

因此就去了解了一下这个函数,把自己的一些理解记录下来,希望可以帮到你。

二、官方文档

网址如下:https://pytorch.org/docs/stable/generated/torch.nn.parameter.Parameter.html#torch.nn.parameter.Parameter

具体参数解释如下:

torch.nn.parameter.Parameter(data=None, requires_grad=True)

  • data:代表一个tensor类似的数据
  • requires_grad:是否需要进行梯度计算,默认为True

三、个人理解

  • 这个函数的主要作用就是把一个不可训练的Tensor数据转换成可以训练的Tensor数据。

那么这个这个函数怎么实现的呢。

这个函数可以将你输入的数据(你想训练的数据)加入到你模型的参数里面(因为requires_grad=True,如果为False就是不加入),跟着你模型的参数一起训练,一起学习,逐渐达到最优解。

代码实现

self.w = nn.Parameter(torch.tensor(0.5, dtype=torch.float), requires_grad=True)
"""
初始数据为0.5,且为float类型,进行训练。
"""

四、示例程序

# -*- coding: UTF-8 -*-
# Project :python 
# File    :test_1.py
# IDE     :PyCharm 
# Author  :小李同学
# Date    :2023/10/21 13:44

import torch
import torch.optim as optim
import matplotlib.pyplot as plt

# 创建一个可学习的权重参数,初始值为0.5
weight = torch.nn.Parameter(torch.tensor(0.5, requires_grad=True))
# 定义一个优化器,用于更新权重
optimizer = optim.SGD([weight], lr=0.01)
# 目标值
target = torch.tensor(20.0)
# 存储损失和权重的列表,用于绘制学习曲线
losses = []
weights = []
# 训练循环
for epoch in range(10):
    # 模型的预测值
    prediction = weight * 5.0  # 假设模型的预测是输入值乘以权重

    # 计算损失,这里使用均方误差损失
    loss = (prediction - target) ** 2
    losses.append(loss.item())
    weights.append(weight.item())
    # 梯度清零
    optimizer.zero_grad()
    # 反向传播和权重更新
    loss.backward()
    optimizer.step()
    print(f'Epoch {epoch + 1}: Loss={loss.item():.2f}, Weight={weight.item():.2f}')

# 绘制学习曲线
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Loss Curve')

plt.subplot(1, 2, 2)
plt.plot(weights)
plt.xlabel('Epoch')
plt.ylabel('Weight')
plt.title('Weight Curve')

plt.show()

输出结果如下:

Epoch 1: Loss=306.25, Weight=2.25
Epoch 2: Loss=76.56, Weight=3.12
Epoch 3: Loss=19.14, Weight=3.56
Epoch 4: Loss=4.79, Weight=3.78
Epoch 5: Loss=1.20, Weight=3.89
Epoch 6: Loss=0.30, Weight=3.95
Epoch 7: Loss=0.07, Weight=3.97
Epoch 8: Loss=0.02, Weight=3.99
Epoch 9: Loss=0.00, Weight=3.99
Epoch 10: Loss=0.00, Weight=4.00

学习曲线如下:

在这里插入图片描述

如果想获得本文的的pdf,请在公众号“冬天的李同学”上回复“2023.10.22”即可获得。

五、补充部分(2023.10.29)

我在实际应用中遇到了一些问题,希望可以帮助到你们

如果按照一下方式去定义这个权重的话

self.w = nn.Parameter(torch.tensor(0.5, dtype=torch.float), requires_grad=True)

可以会导致一个问题,如果你的数据类型是[1, 64, 320,320]这种的话,会出现一个错误

RuntimeError: output with shape [] doesn't match the broadcast shape [1]

当你debug是确实会发现,self.w的shape为0,这是为什么呢
这是因为,其实self.w是一个标量,不能直接与向量或者矩阵相乘。那么我们需要把其定义成一个相应形状的参数,以便于模型在前向传播过程中能够与数据相乘。具体定义如下:

self.w = nn.Parameter(torch.tensor([0.5], dtype=torch.float), requires_grad=True)

参考文章:

1.https://mp.weixin.qq.com/s/ryfSof2OrGQdJauqmTpK0A

2.https://blog.csdn.net/weixin_44878336/article/details/124733598?

ps://mp.weixin.qq.com/s/ryfSof2OrGQdJauqmTpK0A

2.https://blog.csdn.net/weixin_44878336/article/details/124733598?

3.https://blog.csdn.net/weixin_43145941/article/details/114757673?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WinterWanderer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值