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()函数更新参数。最终,每一步结束后打印出参数及其对应的损失。

阅读剩余 59%

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

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

相关文章

  • 卷积公式 相关证明

    对给定函数f(t),g(t)拉普拉斯变换得 将上面二式相乘,并建立下面的等式 这意味着两个函数分别进行拉普拉斯变换的结果相乘等于某个未知函数h(t)进行一次拉普拉斯变换的结果, 现在问题变成了求解h(t),过程如下: 上面推理过程,主要考虑到定积分可以看作是数列求和的极限,比如两个数列相乘可以进行如下转化:      

    卷积神经网络 2023年4月7日
    00
  • CNN中feature map、卷积核、卷积核个数、filter、channel的概念解释,以及CNN 学习过程中卷积核更新的理解

    具体可以看这篇文章,写的很详细。https://blog.csdn.net/xys430381_1/article/details/82529397

    卷积神经网络 2023年4月6日
    00
  • [转载]全卷积网络与图像分割

    从图像分类到图像分割 卷积神经网络(CNN)自2012年以来,在图像分类和图像检测等方面取得了巨大的成就和广泛的应用。 CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从…

    2023年4月8日
    00
  • 手写数字识别-卷积神经网络cnn(06-2)

    卷积和池化在深度学习中的作用是对图像和文本信息提取特征的常用方式,特别是在分类领域 卷积:通过不同的卷积核与图像或文本数据矩阵 进行矩阵相乘,得到不同特征的若干组训练特征数据 池化:池化通常有两种最大池化(max-pooling)和平均池化,最大池化就是在一块矩阵区域(比如2X2,4个像素点),取最大的那个值作为输出,平均池化就是取四个像素点的平均值作为输出…

    2023年4月8日
    00
  • 浅析PyTorch中nn.Module的使用

    当我们使用PyTorch进行深度学习模型的构建时,我们会涉及到很多不同模块的调用和拼接。而nn.Module是实现PyTorch中模型组件化的核心模块之一。在这篇文章中,我们将会介绍如何使用nn.Module来实现深度学习中的常见操作,并使用两个示例来说明。 一、 nn.Module简介 nn.Module是PyTorch中模型组件化的核心模块之一。简单来说…

    卷积神经网络 2023年5月15日
    00
  • 用numpy实现CNN卷积神经网络

    为了加深对卷积神经网络底层原理的理解,本文通过使用numpy来搭建一个基础的包含卷积层、池化层、全连接层和Softmax层的卷积神经网络,并选择relu作为我们的激活函数,选择多分类交叉熵损失函数,最后使用了mnist数据集进行了训练和测试。 关于卷积网络的详细原理和实现可参考下列文章: 刘建平Pinard:卷积网络前向反向传播算法 卷积层的反向传播 手把手…

    卷积神经网络 2023年4月8日
    00
  • 卷积深层网络+图像定位

    卷积: 前层先识别线条等低级单位, 后层从卷积核抽象出形状等高级单位, 前层每一块卷积, 映射后层一个特征点。 input:   7*7*3        filter(kernel):  3*3*3    stride:  2         padding:  1 输出为:    (7-3+2*1)  / 2   +  1  =   4*4  如果有3个…

    2023年4月6日
    00
  • 解读等值线图的Python绘制方法

    下面是关于解读等值线图的Python绘制方法的完整攻略。 等值线图介绍 等值线图是一种用于可视化二维数据的图表,通常用于表示地形高度、气压、温度等连续变量的分布情况。等值线图将数据分成若干个等值区域,每个等值区域的数值相同,通过连续的等值线将这些区域连接起来,形成一张图表。 示例1:使用Matplotlib绘制等值线图 以下是一个使用Matplotlib绘制…

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