torch.nn.Linear的使用方法

简介: torch.nn.Linear的使用方法

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

Linear类是torch.nn中最基础的模块之一,其作用是用于构建线性全连接神经元网络。本文说明其计算原理及使用方法。

在PyTorch中,全连接层(Fully Connected Layer)通常通过torch.nn.Linear模块来实现。全连接层是神经网络中的基本构建块之一,它将输入数据与一组可学习的权重进行矩阵乘法,然后可能添加一个偏置项,生成输出。

1. torch.nn.Linear定义

torch.nn.Linear的工作原理基于线性代数中的矩阵乘法和向量加法。在神经网络中,一个线性层可以表示为输入数据与权重矩阵的乘积,再加上一个可选的偏置项。数学上,对于一个输入向量x和一个权重矩阵A,以及一个偏置向量b,线性层的输出y可以通过以下公式计算:

此部分也可以参见PyTorch官网:

Linear的作用是用于线性计算: 其中 为输出, 为输入, 为权重, 为偏置。

在调用Linear模块时,需要输入的参数有3个:

- in_features:输入数据的size(关于这个size的定义后面还会提到)

- out_features:输出数据的size

- bias:设定为True则会生成偏置,如果设定为False偏置为0

关于权重和偏置的初始值,设定为从 的随机值。

2. 使用实例

在PyTorch中,使用torch.nn.Linear的步骤如下:

2.1 导入模块

首先需要导入PyTorch的相关模块。

import torch
from torch import nn
2.2 实例化Linear对象

使用nn.Linear类创建一个线性层对象。在实例化时,需要指定两个参数:in_featuresout_featuresin_features表示输入数据的特征维度(或说是上一层神经元的个数),out_features表示输出数据的特征维度(或说是这一层神经元的个数)。

linear_layer = nn.Linear(in_features=5, out_features=3)

这将创建一个从5维输入到3维输出的线性层。

2.3 前向传播(Forward)

在模型的前向传播过程中,我们将输入数据传递给线性层以得到输出。

input_data = torch.randn(10, 5)  # 假设我们有10个样本,每个样本有5个特征
output_data = linear_layer(input_data)
2.4 训练和优化

线性层通常作为更大的神经网络的一部分进行训练。在训练过程中,我们会使用优化器(如torch.optim.SGDtorch.optim.Adam)来更新线性层的权重和偏置。

optimizer = torch.optim.SGD(linear_layer.parameters(), lr=0.01)
 
for epoch in range(num_epochs):
    # 前向传播
    output = linear_layer(input_data)
 
    # 计算损失
    loss = some_loss_function(output, target_data)
 
    # 反向传播和优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

需要注意的是,在实际使用中,可能还需要考虑将模型和数据移动到GPU上以加速计算,这可以通过.to(device)方法实现,其中device是代表GPU的torch.device对象。

这里可以通过.state_dict()方法打印出权重数据,用手算验证PyTorch输出结果。

这里值得注意的一点是:in_features和out_features并不是真正的输入输出数据的“大小”,而是输入输出数据的“最后一个维度的大小”,例如下面这段代码:

import torch
 
linear = torch.nn.Linear(in_features=3, out_features=1, bias=False)
 
b = torch.tensor([[1,1,1]], dtype=torch.float32)
c = torch.tensor([[1,1,1],
                  [1,1,1],
                  [1,1,1]], dtype=torch.float32)
 
out2 = linear(b)
out3 = linear(c)
 
print(out2)
print(out3)
 
------------------输出-----------------------
tensor([[0.3057]], grad_fn=<MmBackward0>)
tensor([[0.3057],
        [0.3057],
        [0.3057]], grad_fn=<MmBackward0>)


相关文章
|
机器学习/深度学习 自然语言处理
自然语言处理Transformer模型最详细讲解(图解版)
自然语言处理Transformer模型最详细讲解(图解版)
12190 1
自然语言处理Transformer模型最详细讲解(图解版)
|
机器学习/深度学习 PyTorch TensorFlow
Pytorch学习笔记(二):nn.Conv2d()函数详解
这篇文章是关于PyTorch中nn.Conv2d函数的详解,包括其函数语法、参数解释、具体代码示例以及与其他维度卷积函数的区别。
3245 0
Pytorch学习笔记(二):nn.Conv2d()函数详解
|
7月前
|
存储 缓存 测试技术
阿里云服务器经济型e实例怎么样?性能、价格与适用场景全解析
阿里云服务器经济型e实例2核2G3M带宽40G ESSD Entry云盘价格只要99元1年,而且续费不涨价。经济型e实例是阿里云面向个人开发者、学生以及小微企业推出的一款入门级云服务器。这款实例以其高性价比和灵活的配置,迅速赢得了市场的青睐。那么,阿里云服务器经济型e实例到底怎么样?是否值得购买呢?本文将为您解析经济型e实例的性能、价格与适用场景,以供参考。
|
10月前
|
机器学习/深度学习 并行计算 PyTorch
【pytorch】【202504】关于torch.nn.Linear
小白从开始这段代码展示了`nn.Linear`的使用及其背后的原理。 此外,小白还深入研究了PyTorch的核心类`torch.nn.Module`以及其子类`torch.nn.Linear`的源码。`grad_fn`作为张量的一个属性,用于指导反向传播 进一步地,小白探讨了`requires_grad`与叶子节点(leaf tensor)的关系。叶子节点是指在计算图中没有前驱操作的张量,只有设置了`requires_grad=True`的叶子节点才会在反向传播时保存梯度。 最后,小白学习了PyTorch中的三种梯度模式 通过以上学习小白对PyTorch的自动求导机制有了更深刻的理解。
440 6
|
11月前
|
弹性计算 网络协议 应用服务中间件
自学软硬件工程师第751天域名和公网ip怎么绑定
自学软硬件工程师第751天域名和公网ip怎么绑定
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch学习笔记(八):nn.ModuleList和nn.Sequential函数详解
PyTorch中的nn.ModuleList和nn.Sequential函数,包括它们的语法格式、参数解释和具体代码示例,展示了如何使用这些函数来构建和管理神经网络模型。
2348 1
|
机器学习/深度学习 自然语言处理 PyTorch
Transformers入门指南:从零开始理解Transformer模型
【10月更文挑战第29天】作为一名机器学习爱好者,我深知在自然语言处理(NLP)领域,Transformer模型的重要性。自从2017年Google的研究团队提出Transformer以来,它迅速成为NLP领域的主流模型,广泛应用于机器翻译、文本生成、情感分析等多个任务。本文旨在为初学者提供一个全面的Transformers入门指南,介绍Transformer模型的基本概念、结构组成及其相对于传统RNN和CNN模型的优势。
13247 1
|
存储 缓存 文件存储
NAS怎么用?
【6月更文挑战第30天】NAS怎么用?
1199 58
|
机器学习/深度学习 算法 Python
【Python】已解决:ModuleNotFoundError: No module named ‘sklearn‘
【Python】已解决:ModuleNotFoundError: No module named ‘sklearn‘
9927 0
|
XML 数据可视化 算法
目标检测YOLO数据集的三种格式及转换
目标检测YOLO数据集的三种格式及转换