Linear 层,通常也被称为全连接层,是神经网络中一种经典且基础的层结构。它的核心特点是每一个神经元都与上一层的所有神经元相连接,这种全连接的方式使得信息能够在层与层之间充分传递和整合
Linear 层在神经网络中主要承担着特征整合与输出映射的重任。在经过卷积、池化等层提取出数据的局部特征后,Linear 层能够将这些分散的局部特征进行整合,挖掘出特征之间的深层关联。同时,在网络的最后部分,Linear 层会将整合后的特征映射到具体的输出空间
Linear 层有明确的输入维度和输出维度,输入维度对应上一层输出特征的数量,输出维度则根据具体任务需求来设定
Linear层的运算涉及权重矩阵和偏置向量。权重矩阵的维度为(输入维度,输出维度),它决定了上一层每个神经元对当前层每个神经元的影响程度;偏置向量的维度为(输出维度),用于调整输出结果,增加模型的灵活性
Linear 层的运算本质上是一种线性变换,对于输入特征向量 x,经过 Linear 层后的输出 y 可以表示为 y = x * W + b,其中 W 是权重矩阵,b 是偏置向量
import torch
import torch.nn as nn
# 定义一个输入特征数为100,输出特征数为10的Linear层
linear_layer = nn.Linear(in_features=100, out_features=10)
# 随机生成一个输入张量,形状为(batch_size=2, in_features=100)
input_tensor = torch.randn(2, 100)
# 通过Linear层得到输出
output_tensor = linear_layer(input_tensor)
print("输出张量形状:", output_tensor.shape) # 输出应为(2, 10)
在深度学习中,很多层的输出往往是多维的张量,例如卷积层输出的特征图通常是(batch_size, channels, height, width)的四维张量。而 Linear 层需要的输入是一维的特征向量,此时 Flatten 层就发挥了关键作用,它能够将多维张量展平为一维向量,为后续的 Linear 层处理做好准备
Flatten 层的核心作用就是数据格式转换。它将多维的输入张量按照一定的顺序(通常是从后往前依次拼接)展平成一个一维的向量。这种转换不会改变数据的本质信息,只是改变了数据的组织形式,使得多维特征能够被 Linear 层等需要一维输入的层所处理
在展平过程中,Flatten 层会保留输入张量的批量维度(batch_size),只对其他维度进行展平操作。这是非常重要的,因为批量维度用于表示一次处理的样本数量,不能被改变
不同的深度学习框架可能采用不同的展平顺序,但通常都是按照自然的维度顺序进行展平,即先展平最后一个维度,再依次向前
import torch
import torch.nn as nn
# 定义一个Flatten层
flatten_layer = nn.Flatten()
# 随机生成一个四维输入张量,形状为(2, 3, 4, 4)
input_tensor = torch.randn(2, 3, 4, 4)
# 通过Flatten层得到展平后的张量
flattened_tensor = flatten_layer(input_tensor)
print("展平前形状:", input_tensor.shape) # 输出(2, 3, 4, 4)
print("展平后形状:", flattened_tensor.shape) # 输出(2, 3*4*4)=(2, 48)