PyTorch中的参数类torch.nn.Parameter()详解

PyTorch中的参数类torch.nn.Parameter()详解

什么是torch.nn.Parameter()?

torch.nn.Parameter()类是Tensor的子类,用于在神经网络中定义可学习的参数。在定义神经网络模型时,我们通常需要考虑模型的参数这一概念。但是仅仅声明一个带参数的函数是远远不够的,这种方式使用的变量是普通的Python变量,而不是网络定义中的参数(参数必须是能够被自动求导并进行梯度下降优化的变量)。

Parameter是一种高效的、包含梯度信息的可优化的Tensor。它被设计用于在深度学习框架中方便地添加并优化参数。

如何使用torch.nn.Parameter()?

使用Parameter类定义网络参数的过程非常简单,我们只需要将需要定义为网络参数的张量转化为Parameter对象即可。可以像下面这样定义:

import torch.nn as nn
import torch

weight = torch.rand(3, 5)
bias = torch.rand(1, 3)

linear = nn.Linear(5, 3)

# 将weight和bias转化为Parameter对象,使其成为可训练参数
linear.weight = nn.Parameter(weight)
linear.bias = nn.Parameter(bias)

在上面示例中,我们首先通过torch.rand()函数生成两个随机张量weightbias,并使用nn.Linear(5, 3)定义了一个线性层linear。将weightbias转化为Parameter对象之后,它们就可以被认为是网络中的可训练参数了。

参数的初始化

在深度学习中,参数的选择和初始化是极其重要的,因为它会直接影响最终的算法表现。通常,需要使用合适的初始化方法为参数赋初值,这样可以加速模型的收敛和增加模型的精度。Parameter类提供了许多常用的初始化方法,如下面的示例:

import torch.nn.init as init

weight = torch.empty(3, 5)
bias = torch.empty(1, 3)

# 使用正态分布(均值为0,标准差为0.02)初始化weight
init.xavier_normal_(weight)

# 使用常量初始化bias
init.constant_(bias, 0.1)

linear = nn.Linear(5, 3)

# 将weight和bias转化为Parameter对象,使其成为可训练参数
linear.weight = nn.Parameter(weight)
linear.bias = nn.Parameter(bias)

示例1:自定义模型

下面示例展示了如何定义自己的模型,并使用网络参数进行前向传播计算。

import torch.nn as nn
import torch

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear1 = nn.Linear(784, 128)
        self.linear2 = nn.Linear(128, 10)

    def forward(self, x):
        x = self.linear1(x)
        x = nn.functional.relu(x)
        x = self.linear2(x)
        return x

# 使用自定义模型进行前向传播计算
net = Net()

input = torch.randn(16, 784)
output = net(input)
print(output.shape)

在上面的示例中,我们自定义了一个网络模型Net,该模型包含两个线性层,并使用nn.functional.relu()作为激活函数。在定义模型时,我们使用了nn.Linear构造函数创建了两个线性层。在前向传播计算时,我们使用自定义模型Net并传入一个16×784的张量input进行计算,并打印输出形状output.shape

示例2:手动更新参数

下面示例展示了如何手动更新网络参数。

import torch.nn as nn
import torch

linear = nn.Linear(1, 1)

# 将weight和bias转化为Parameter对象,使其成为可训练参数
linear.weight = nn.Parameter(torch.tensor([[0.5]]))
linear.bias = nn.Parameter(torch.tensor([[-0.5]]))

# 手动更新参数
optimizer = torch.optim.SGD(linear.parameters(), lr=0.01)
for i in range(100):
    x = torch.tensor([[2.0]])
    y = linear(x)
    loss = nn.functional.mse_loss(y, torch.tensor([[0.0]]))

    print("before step {}: w={}, b={}, loss={}".format(i, linear.weight.data, linear.bias.data, loss))

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

在上面示例中,我们使用nn.Linear(1, 1)定义一个线性层,并手动设置其权重和偏置项。在后面的循环中,我们手动进行参数更新,使用torch.optim.SGD()定义了一个梯度下降优化器,并设置学习率为0.01。每一步中,我们首先用已知的样本输入x计算输出值y并计算损失,然后使用backward()函数计算梯度并使用step()函数更新参数。最终,每一步结束后打印出参数及其对应的损失。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch中的参数类torch.nn.Parameter()详解 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • opencv图像处理8-卷积

    卷积是本章所讨论的很多转换的基础。 先看看效果: 抽象的说,这个术语意味着我们对图像的每一个部分所做的操作。从这个意义上讲,我们在第五章所看到 的许多操作可以被理解成普通卷积的特殊情况。一个特殊的卷积所实现的功能是由所用的卷积核的形式决定的。这个核本质上是一个大小固定, 由数值参数构成的数组,数组的标定点通常位于数组的中心。数组的大小被称为核支撑。单就技术而…

    2023年4月8日
    00
  • [DeeplearningAI笔记]卷积神经网络3.6-3.9交并比/非极大值抑制/Anchor boxes/YOLO算法

    觉得有用的话,欢迎一起讨论相互学习~ 吴恩达老师课程原地址 3.6交并比intersection over union 交并比函数(loU)可以用来评价对象检测算法,可以被用来进一步改善对象检测算法的性能。 如何评价一个算法的好坏,即如图中假设红色框线表示 真实的对象所在边界框,紫色框线表示 模型预测的对象所在边界框.通过计算两个边界框交集和并集的比用于评价…

    2023年4月8日
    00
  • 图像处理之基础—卷积去噪

    讨论如何使用卷积作为数学工具来处理图像,实现图像的滤波,其方法包含以下几种,均值 滤波,中值滤波,最大最小值滤波,关于什么是卷积以及理解卷积在图像处理中作用参见这 里–http://blog.csdn.net/jia20003/article/details/7038938   均值滤波: 均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低…

    卷积神经网络 2023年4月8日
    00
  • 如何将卷积神经网络中的全连接层变成卷积层

    卷积由feature map到全连接层的设置节点个数也为一个超参数,可以进行设置;同时,这个过程也可以看作是一个卷积的过程。 全连接层实际就是卷积核大小为上层特征大小的卷积运算,一个卷积核卷积后的结果为一个节点,就对应全连接层的一个神经元。假设: 最后一个卷积层的输出为7×7×512,连接此卷积层的全连接层为1×1×4096(相当于全连接网络有4096个神经…

    卷积神经网络 2023年4月8日
    00
  • 深度学习之卷积模型应用

    声明 本文参考Deep-Learning-Specialization-Coursera/Convolution_model_Application.ipynb at main · abdur75648/Deep-Learning-Specialization-Coursera · GitHub,力求理解。 资料下载 链接:https://pan.baidu…

    2023年4月6日
    00
  • 图像处理——卷积原理、二维卷积python实现

    一:什么是卷积 离散卷积的数学公式可以表示为如下形式: f(x) =  – 其中C(k)代表卷积操作数,g(i)代表样本数据, f(x)代表输出结果。 举例如下: 假设g(i)是一个一维的函数,而且代表的样本数为G = [1,2,3,4,5,6,7,8,9] 假设C(k)是一个一维的卷积操作数, 操作数为C=[-1,0,1] 则输出结果f(x)可以表示为 F…

    2023年4月6日
    00
  • CNN5 调用 C实现pool2d im2col col2im Python 调用 C/C++实现卷积

    1. swig实现 在Python 调用 C/C++实现卷积中,尝试了python通过swig调用c提高性能的方法。 以下为pool2d im2col col2im三个函数在swig下的配置。 %module t %include <stdint.i> %typemap(in,numinputs=0,noblock=1) size_t *l1 {…

    卷积神经网络 2023年4月8日
    00
  • Tensorflow实现在训练好的模型上进行测试

    TensorFlow是最流行的开源机器学习框架之一,它可以帮助广大的开发者们实现各种不同的深度学习模型来解决复杂的计算机视觉、语音识别、自然语言处理等问题。本文将详细讲解如何在训练好的模型上进行测试,包含两条示例说明: 准备工作 在开始测试之前,首先必须有一个已经训练好的模型,可在TensorFlow中通过SavedModel或Checkpoint形式保存。…

    卷积神经网络 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部