目录
torch.nn.Identity
类在 PyTorch 中提供了一个占位的恒等操作符,该操作符对传入的参数不敏感。它基本上是一个通过层,不对数据进行任何改变。
Identity
类用作一个占位符,允许数据无修改地通过。*args, **kwargs
),但这些参数不会被使用。(?)
,其中 ?
表示任意数量的维度。(?)
,与输入形状相同。import torch
import torch.nn as nn
# 创建 Identity 实例
m = nn.Identity()
# 输入数据
input = torch.randn(128, 20)
# 通过 Identity 层
output = m(input)
# 输出形状
print(output.size()) # torch.Size([128, 20])
在这个例子中,Identity
层被用作一个简单的传递层,输入和输出形状完全相同。torch.nn.Identity
类是一个非常简单但有时非常有用的工具,特别是在需要保持网络结构但又不想改变数据流的情况下。它的存在使得网络架构的调整变得更加灵活和方便。
torch.nn.Linear
类在 PyTorch 中实现了一个全连接层,也被称为线性层或密集层。它对输入数据应用一个线性变换。
(?, H_in)
,其中 ?
表示任意数量的额外维度,H_in
是 in_features
。(?, H_out)
,除最后一维外,其他维度与输入相同,H_out
是 out_features
。(out_features, in_features)
的可学习权重。值从均匀分布 ?初始化,其中 ?用于初始化神经网络中 Linear
(全连接) 层的权重。这里的 k 是一个根据输入特征数 (in_features) 计算出的值,用于确定权重初始化时均匀分布的范围。在这个公式中:????????in_featuresin_features 指的是输入层的特征数量。
????????k 的值是 in_featuresin_features 的平方根的倒数。
(out_features)
的可学习偏置。如果 bias
为 True,则值从相同的均匀分布初始化。import torch
import torch.nn as nn
# 创建 Linear 实例
m = nn.Linear(20, 30)
# 输入数据
input = torch.randn(128, 20)
# 前向传播
output = m(input)
# 输出形状
print(output.size()) # torch.Size([128, 30])
这段代码展示了如何创建并使用 Linear
层。在这个例子中,输入数据的形状是 (128, 20)
,Linear
层将其转换为形状 (128, 30)
的输出。?
torch.nn.Bilinear
类在 PyTorch 中实现了一个双线性变换层。这个层对两个不同的输入执行双线性变换,这种变换涉及到两个输入的元素乘积。
?
(?, H_{in1})
,其中 H_{in1} = in1_features
,?
表示任意数量的额外维度。(?, H_{in2})
,其中 H_{in2} = in2_features
。(?, H_{out})
,其中 H_{out} = out_features
,除最后一维外,其他维度与输入形状相同。(out_features, in1_features, in2_features)
的可学习权重。值从均匀分布?初始化,其中 ?。(out_features)
的可学习偏置。如果 bias
为 True,则值从相同的均匀分布初始化。import torch
import torch.nn as nn
# 创建 Bilinear 实例
m = nn.Bilinear(20, 30, 40)
# 输入数据
input1 = torch.randn(128, 20)
input2 = torch.randn(128, 30)
# 前向传播
output = m(input1, input2)
# 输出形状
print(output.size()) # torch.Size([128, 40])
这段代码展示了如何创建并使用 Bilinear
层。在这个例子中,有两个不同形状的输入数据,Bilinear
层根据这两个输入生成形状为 (128, 40)
的输出。
torch.nn.Bilinear
类是一种特殊的神经网络层,它通过将两个输入数据的特征结合起来,提供了一种模拟复杂关系的有效方式。这种层在需要考虑两组不同特征之间交互的情况下特别有用。
torch.nn.LazyLinear
类在 PyTorch 中提供了一种“懒加载”版本的线性层(Linear
)。在这个模块中,in_features
(输入特征的数量)是从第一次执行前向传播时输入数据的形状推断出来的。
in_features
: 这个类允许用户在初始化时不指定输入特征的大小(in_features
),该值会在模块第一次前向传播时自动推断。LazyLinear
模块就会变成常规的 torch.nn.Linear
模块。(out_features, in_features)
的可学习权重。在第一次前向传播后,值将从均匀分布初始化。(out_features)
的可学习偏置。如果 bias
为 True,则值也将在第一次前向传播后从均匀分布初始化。import torch
import torch.nn as nn
# 创建 LazyLinear 实例
lazy_linear = nn.LazyLinear(out_features=30)
# 输入数据
input = torch.randn(128, 20) # 注意,这里没有指定 in_features
# 前向传播
output = lazy_linear(input)
# 输出形状
print(output.size()) # torch.Size([128, 30])
这段代码展示了如何创建并使用 LazyLinear
层。在这个例子中,初始时并不需要指定输入特征的大小,它会在第一次调用 forward
方法时自动确定。torch.nn.LazyLinear
类是一种方便的工具,特别适合于在模型设计阶段不确定输入大小的场景。它简化了模型初始化过程,允许更灵活的设计,并在确定实际输入大小后自动完成参数初始化。
?本篇博客探索了 PyTorch 中 torch.nn
子模块中的几种关键线性层,包括 Identity
, Linear
, Bilinear
, 和 LazyLinear
。每个类别都被详细解析,强调了它们在神经网络中的独特角色和应用场景。从基础的 Linear
层,负责标准的线性变换,到更复杂的 Bilinear
层,用于建模两组输入特征间的交互关系,再到灵活而方便的 LazyLinear
层,自动推断输入特征大小,每种层都提供了不同的机制来处理和学习数据。