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

yizhihongxing

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日

相关文章

  • CNN中卷积的意义

      在传统的神经网络中,比如多层感知机(MLP),其输入通常是一个特征向量。需要人工设计特征,然后将用这些特征计算的值组成特征向量。在过去几十年的经验来看,人工找的特征并不总是好用。有时多了,有时少了,有时选的特征根本就不起作用(真正起作用的特征在浩瀚的未知里)。这就是为啥过去几十年神经网络一直被SVM等完虐的原因。  如果有人说,任何特征都是从图像中提取的…

    2023年4月5日
    00
  • 空洞卷积-膨胀卷积

    在图像分割领域,图像输入到CNN,FCN先像传统的CNN那样对图像做卷积再pooling,降低图像尺寸的同时增大感受野,但是由于图像分割预测是pixel-wise的输出,所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测,之前的pooling操作使得每个pixel预测都能看到较大感受野信息。因此图像分割FCN中有两个关键,一个…

    2023年4月8日
    00
  • 【原创 深度学习与TensorFlow 动手实践系列 – 4】第四课:卷积神经网络 – 高级篇

    【原创 深度学习与TensorFlow 动手实践系列 – 4】第四课:卷积神经网络 – 高级篇           提纲: 1. AlexNet:现代神经网络起源 2. VGG:AlexNet增强版 3. GoogleNet:多维度识别 4. ResNet:机器超越人类识别 5. DeepFace:结构化图片的特殊处理 6. U-Net:图片生成网络 7. …

    2023年4月6日
    00
  • PyTorch 中的傅里叶卷积实现示例

    下面是关于PyTorch中的傅里叶卷积实现示例的攻略,包含两个示例说明。 PyTorch中的傅里叶卷积 傅里叶卷积是一种基于傅里叶变换的卷积方法,可以有效地处理周期性信号。在PyTorch中,我们可以使用torch.fft模块中的函数实现傅里叶卷积。 具体来说,PyTorch中的傅里叶卷积分为两步:首先,我们需要将输入数据进行傅里叶变换;然后,我们将傅里叶变…

    卷积神经网络 2023年5月16日
    00
  • Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类

    去年研一的时候想做kaggle上的一道题目:猫狗分类,但是苦于对卷积神经网络一直没有很好的认识,现在把这篇文章的内容补上去。(部分代码参考网上的,我改变了卷积神经网络的网络结构,其实主要部分我加了一层1X1的卷积层,至于作用,我会在后文详细介绍) 题目地址:猫狗大战 同时数据集也可以在上面下载到。 既然是手把手,那么就要从前期的导入数据开始: 导入数据 #i…

    2023年4月6日
    00
  • 图解卷积神经网络(二)(转)

    卷积神经网络采用了三种基本概念:局部感受野(local receptive fields),共享权重(sharedweights),和混合(pooling)。 局部感受野: 在之前看到的全连接层的网络中,输入被描绘成纵向排列的神经元。但在一个卷积网络中,把输入看作是一个 28 × 28 的方形排列的神经元更有帮助,其值对应于我们用作输入的 28 × 28 的…

    2023年4月7日
    00
  • 验证码进阶(TensorFlow–基于卷积神经网络的验证码识别)

    本人的第一个深度学习实战项目,参考了网络上诸多牛人的代码,在此谢过,因时间久已,不记出处,就不一一列出,罪过罪过。 我的数据集是我用脚本在网页上扒的,标签是用之前写的验证码识别方法打的。大概用了4000+多张图训练。  我的数据集都经过处理了,降噪,二值化,最后裁剪为18*60的大小,详细见我之前的验证码简单识别那篇随笔。 #coding:utf-8 imp…

    卷积神经网络 2023年4月8日
    00
  • Tensorflow中使用cpu和gpu有什么区别

    TensorFlow是一款非常流行的深度学习框架,它支持在CPU和GPU上运行,那么在TensorFlow中使用CPU和GPU有什么区别呢?下面我们来详细讲解。 CPU和GPU的区别 CPU和GPU都是计算设备,但是它们的设计目标不同。CPU的设计目标是全能,适合运行复杂、分支较多的任务,比如浏览器、办公软件等。而GPU的设计目标是专业的并行计算,它采用了大…

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