在构建深度学习模型,尤其是[计算机视觉](人工智能: https://yunpan.plus/f/29-1)相关的模型时,`nn.Linear`(全连接层)和`nn.Conv2d`(二维卷积层)是PyTorch中最基础且核心的两个模块。本文将深入解析它们的基本用法、核心参数以及在`Python`代码中的实际应用。
nn.Linear 全连接层详解
nn.Linear 用于在网络中定义全连接层(Fully Connected Layer)。在图像处理任务中需要特别注意:全连接层期望的输入和输出通常是二维张量,其形状一般为 [batch_size, feature_size],这与卷积层要求输入输出为四维张量([batch_size, channels, height, width])不同。
- in_features: 指定输入二维张量特征维度的大小,即
[batch_size, size] 中的 size。
- out_features: 指定输出二维张量特征维度的大小,输出形状为
[batch_size, output_size]。同时,它也等同于该层所包含的神经元个数。
从张量形状变换的角度来理解,nn.Linear 层执行了一个从 [batch_size, in_features] 到 [batch_size, out_features] 的线性变换。
nn.Conv2d 二维卷积层详解
nn.Conv2d 是实现二维卷积操作的模块,其核心参数如下:
- in_channels: 输入特征图的通道数。
- out_channels: 输出特征图的通道数,也等同于本层使用的卷积核数量。
- kernel_size: 卷积核的尺寸,可以是一个整数(表示方形卷积核)或一个
(height, width)元组。
- stride: 卷积核滑动的步长,控制每次移动的间隔。
- padding: 在输入特征图边缘进行填充的像素数。
代码示例与应用
下面的代码展示了如何定义并使用一个nn.Conv2d层和一个nn.Linear层,模拟一个简单的卷积神经网络的前向过程。
import torch
from torch import nn
# 定义一个卷积层:输入3通道(如RGB图像),输出128个特征图,使用3x3卷积核,步长为1
conv1 = nn.Conv2d(
in_channels=3,
out_channels=128,
kernel_size=3,
stride=1,
)
# 定义一个全连接层:输入维度为128*26*26(由卷积层输出特征图展平得到),输出10个类别
fc1 = nn.Linear(
in_features=128*26*26,
out_features=10,
)
# 模拟一个批次的数据:32张3通道的28x28图像
x = torch.rand(size=(32, 3, 28, 28))
# 前向传播
x = conv1(x) # 形状变化:[32, 3, 28, 28] -> [32, 128, 26, 26]
x = torch.flatten(x, 1) # 将特征图展平为二维张量:[32, 128*26*26]
x = fc1(x) # 全连接层计算,输出形状:[32, 10]
print(x.shape)
输出结果:
torch.Size([32, 10])

总结
nn.Linear:作为网络中的全连接层,其核心在于对输入特征进行线性变换。关键参数in_features和out_features直接决定了输入与输出二维张量的特征维度。
nn.Conv2d:作为实现2D卷积的核心模块,其主要参数in_channels、out_channels和kernel_size需要根据任务手动设置,而stride、padding等参数均有合理的默认值,在需要时进行调整即可。
理解这两个基础模块的参数意义和输入输出形状变化,是使用[PyTorch](人工智能: https://yunpan.plus/f/29-1)构建更复杂神经网络模型的重要基石。