对 torch.nn.Linear 的理解

本文详细介绍了PyTorch中的torch.nn.Linear层,该层用于实现线性变换,不仅限于常见的二维输入,而是可以接受任意维度的张量,只要最后一维对应`in_features`。通过一个实例展示了即使输入张量为三维,依然能正确应用Linear层,并得到期望的输出形状。这表明Linear层的灵活性,可以在各种复杂的神经网络结构中发挥作用。
PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

torch.nn.Linear 是 pytorch 的线性变换层,定义如下:

Linear(in_features: int, out_features: int, bias: bool = True, device: Any | None = None, dtype: Any | None = None)

全连接层 Fully Connect 一般就就用这个函数来实现。因此在潜意识里,变换的输入张量的 shape 为 (batchsize, in_features),输出张量的 shape 为 (batchsize, out_features)。

当然这是常用的方式,但是 Linear 的输入张量的维度其实并不需要必须为上述的二维,多维也是完全可以的,Linear 仅是对输入的最后一维做线性变换,不影响其他维。

可以看下官网的解释:Linear — PyTorch 1.11.0 documentation

一个例子如下:

import torch
input = torch.randn(30, 20, 10)  # [30, 20, 10]
linear = torch.nn.Linear(10, 15)  # (*, 10) --> (*, 15)
output = linear(input)
print(output.size()) # 输出 [30, 20, 15]

 

您可能感兴趣的与本文相关的镜像

PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### `torch.nn.Linear` 模块的作用 在深度学习中,`torch.nn.Linear` 是 PyTorch 提供的一个模块,用于实现线性变换操作。这种变换通常用于神经网络的层与层之间的连接,即对输入数据进行加权求和并加上偏置项。其数学表达式为: $$ y = xA^T + b $$ 其中: - $ x $ 是输入数据。 - $ A $ 是权重矩阵。 - $ b $ 是偏置项。 - $ y $ 是输出结果。 该模块属于 `torch.nn` 模块的一部分,能够自动创建可训练参数(权重和偏置),并且适用于构建需要进行训练的神经网络模型 [^3]。 ### 使用方法 #### 定义线性层 `torch.nn.Linear` 的构造函数需要三个主要参数: - `in_features`:输入特征的大小。 - `out_features`:输出特征的大小。 - `bias`:是否包含偏置项,默认为 `True`。 例如,定义一个从 5 个输入特征到 3 个输出特征的线性层: ```python import torch.nn as nn linear_layer = nn.Linear(in_features=5, out_features=3) ``` #### 输入数据 输入数据通常是一个张量(Tensor),其形状为 `(batch_size, in_features)`,其中 `batch_size` 是批量大小,`in_features` 是每个样本的特征数量。 ```python input_data = torch.randn(2, 5) # 2个样本,每个样本5个特征 ``` #### 应用线性变换 将输入数据传递给线性层即可进行前向传播计算: ```python output = linear_layer(input_data) ``` #### 权重和偏置访问 可以通过 `.weight` 和 `.bias` 属性访问线性层的权重和偏置: ```python print("Weight matrix:", linear_layer.weight) print("Bias:", linear_layer.bias) ``` ### `nn.Linear` 与 `F.linear` 的区别 虽然 `torch.nn.functional.linear` 也可以用于线性变换,但两者有明显区别: - `nn.Linear` 创建的是一个具有可训练参数的模块,适合在模型中定义层。 - `F.linear` 是一个函数,用于直接计算线性变换,不创建可训练参数,适合临时计算或测试 [^3]。 示例使用 `F.linear`: ```python import torch.nn.functional as F x = torch.randn(2, 4) # 输入数据 weight = torch.randn(3, 4) # 自定义权重矩阵 bias = torch.randn(3) # 自定义偏置项 output = F.linear(x, weight, bias) # 计算 y = xW^T + b ``` ### 适用场景 `torch.nn.Linear` 广泛应用于各种深度学习架构中,包括但不限于: - **MLP(多层感知机)**:全连接神经网络。 - **CNN 分类层**:卷积神经网络的最后分类层。 - **Transformer(注意力机制)**:在注意力机制中进行特征变换。 - **自动编码器(AutoEncoder)**:用于编码器和解码器中的特征映射 。 ### 结合其他层 `torch.nn.Linear` 通常与激活函数(如 ReLU)、归一化层(如 BatchNorm)等结合使用,以构建更复杂的神经网络模型。例如: ```python import torch.nn as nn model = nn.Sequential( nn.Linear(10, 50), nn.ReLU(), nn.Linear(50, 1) ) ``` ### 总结 `torch.nn.Linear` 是深度学习中实现线性变换的重要模块,能够自动管理可训练参数,并广泛应用于各种神经网络结构中。它与 `F.linear` 的区别在于是否创建可训练参数,因此推荐在模型定义中使用 `nn.Linear`,而在临时计算中使用 `F.linear` [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

地球被支点撬走啦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值