nn
- neural network:神经网络
torch.nn.Conv2d
- Convolution:卷积操作
torch.nn.Conv2d是 PyTorch 中用于 2D 卷积操作 的核心模块,广泛应用于图像处理、计算机视觉任务(如 CNN 网络)中。它的作用是从输入的二维数据(通常是图像)中提取局部特征。-
对一个 4D 输入张量(
[N, C_in, H, W])进行 2D 卷积,输出另一个 4D 张量([N, C_out, H_out, W_out]):- N: batch size(样本数)
- C_in: 输入通道数(如 RGB 图像为 3,灰度图为 1)
- H, W: 输入高度和宽度
- C_out: 输出通道数(即卷积核/滤波器的数量)
- 在线交互演示:
- https://ezyang.github.io/convolution-visualizer/
- 拖动卷积核,实时看输出变化
- 入参
torch.nn.Conv2d( in_channels, # 必填,输入张量的通道数(channel)。 out_channels, # 必填,输出通道数,即**卷积核(滤波器)的数量**。 kernel_size, # 必填,卷积核的高度和宽度。 stride=1, # 卷积核滑动的步长。 padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', # PyTorch 1.4+ device=None, dtype=None ) - 参数数量为:
$$
Params=(kernel_size_h×kernel_size_w×in_channel_s)×out_channels+bias
$$ - 卷积在概念上不是矩阵乘法,但在计算机里,它被高效地实现为矩阵乘法(im2col)。
- 对输入图像 X 和卷积核 K ,输出 Y的每个元素是:
$$
Y_{i,j}=∑{m,n}X{i+m,j+n}⋅K_{m,n}
$$
- 这是一个局部加权求和,涉及滑动窗口,不是两个完整矩阵相乘。
torch.relu
- ReLU(Rectified Linear Unit,修正线性单元)是深度学习中最常用、最重要的激活函数之一。它在神经网络中扮演着引入非线性的关键角色,对模型的表达能力、训练效率和性能有深远影响。
- 如果神经网络只使用线性变换(如全连接层 + 矩阵乘法),无论堆叠多少层,整个网络仍然等价于一个单层线性模型。
- ReLU 通过
max(0, x)的非线性操作,使网络能够拟合复杂的非线性函数,从而解决现实世界中的非线性问题(如图像识别、语音识别等)。 - ReLU 函数的公式为:
$$
ReLU(x)=max(0,x)
$$
即:
import torch
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
y = torch.relu(x)
print(y) # 输出: tensor([0., 0., 0., 1., 2.])
激活函数
- 激活函数(Activation Function)是神经网络中的一个核心组件,它的作用是在每一层神经元的线性变换之后引入非线性,从而使整个网络能够学习和表示复杂的非线性关系。
- 激活函数是神经网络实现“智能”的关键——它让网络从一堆线性运算变成一个强大的非线性函数逼近器。没有激活函数,深度学习就不存在。
- 在一个典型的神经元中,激活函数作用于加权求和 + 偏置之后:
$$
a=f(Wx+b)
$$
其中:
$$
\begin{flalign}
& W:权重矩阵 & \
& b:偏置 & \
& f(⋅):激活函数 & \
& a:该层的输出(激活值) &
\end{flalign}
$$
torch.max_pool2d
torch.max_pool2d是 PyTorch 中用于对 4D 输入张量(通常是图像或特征图)执行 二维最大池化(Max Pooling) 操作的函数。- 示例
import torch import torch.nn.functional as F # 输入:batch=1, channel=1, height=4, width=4 x = torch.tensor([[[[1., 2., 3., 4.], [5., 6., 7., 8.], [9.,10.,11.,12.], [13,14.,15.,16.]]]]) # 2x2 最大池化,步长=2 y = F.max_pool2d(x, kernel_size=2, stride=2) print(y) tensor([[[[ 6., 8.], [14., 16.]]]]) - 左上 `[1,2;5,6]` → 6 - 右上 `[3,4;7,8]` → 8 - 左下 `[9,10;13,14]` → 14 - 右下 `[11,12;15,16]` → 16 - 在 CNN 架构(如 LeNet、AlexNet、VGG)中,
MaxPool2d通常跟在卷积层之后。
用途
- 降低特征图空间维度(减小 H 和 W),减少计算量和参数数量。
- 增强平移不变性:即使目标在图像中轻微移动,池化后响应仍相似。
- 保留显著特征:最大池化倾向于保留最活跃的局部特征(如边缘、纹理)。
nn.Dropout2d
nn.Dropout2d是 PyTorch 中用于二维特征图(如卷积神经网络中的 feature maps)的 Dropout 正则化层。它在训练过程中随机将整个通道(channel) 置零,以防止神经元之间的共适应(co-adaptation),从而提升模型的泛化能力。- 在 CNN 中,一个通道代表一种特征检测器(如边缘、纹理)。
Dropout2d鼓励网络不依赖于某几个特定通道,从而增强鲁棒性。 - 在卷积层之后、激活函数之后或批归一化之后插入。
- 常见于 CNN 架构(如早期的 AlexNet、VGG)中用于正则化。
- 现代 CNN(如 ResNet)更倾向于使用 BatchNorm + 数据增强 而非 Dropout,但在某些场景(如小数据集)下
Dropout2d仍有效。 - 在训练时,某些通道会被整体置零,并且其余通道会除以
(1 - p)进行缩放(以保持期望值不变)。 - 在评估(
model.eval())时,不执行 dropout,直接返回原输入。 - 举例
import torch import torch.nn as nn # 创建 Dropout2d 层,丢弃概率 50% dropout = nn.Dropout2d(p=0.5) # 模拟一个 batch=2, channel=4, 3x3 的特征图 x = torch.ones(2, 4, 3, 3) # 训练模式(默认) x_train = dropout(x) print("训练模式输出:") print(x_train[0, :, 0, 0]) # 某些通道为 0,其余为 2.0(因为 1 / (1 - 0.5) = 2) # 切换到评估模式 dropout.eval() x_eval = dropout(x) print("评估模式输出:") print(x_eval[0, :, 0, 0]) # 全为 1.0,无 dropout 训练模式输出: tensor([0., 2., 0., 2.]) 评估模式输出: tensor([1., 1., 1., 1.])
torch.flatten
torch.flatten是 PyTorch 中用于将张量(Tensor)展平为一维或指定维度范围的连续张量的函数。它常用于神经网络中,在卷积层之后、全连接层之前,将多维特征图转换为向量。- 这是在 CNN 中连接卷积层和全连接层的标准操作。
- 举例
x = torch.randn(32, 64, 8, 8) # batch=32, channels=64, H=8, W=8 y = torch.flatten(x, start_dim=1) # 从第1维开始展平(即 C, H, W) print(y.shape) # torch.Size([32, 4096]) → 64×8×8 = 4096
nn.Linear
nn.Linear是 PyTorch 中用于实现全连接层(Fully Connected Layer),也称为线性层(Linear Layer) 或 仿射变换(Affine Transformation) 的核心模块。它在神经网络中扮演着特征组合与维度映射的关键角色。- 作用:
- 将特征从 din映射到 dout(升维/降维)
- 通过权重矩阵学习输入特征的线性组合,提取高层语义
- 在 CNN/Transformer 末尾,常用于将特征映射到类别数(如
Linear(512, 10)用于 10 分类) - 在 NLP 中用于词向量变换、注意力计算等
torch.log_softmax
torch.log_softmax是 PyTorch 中用于计算输入张量的对数softmax函数的函数。它结合了 Softmax 和 Log 两个操作,常用于多分类问题中的输出层,特别是在与负对数似然损失(NLLLoss)一起使用时非常有效。torch.log_softmax是一个多用途的工具,在需要将神经网络的输出转换为对数概率分布的情况下非常有用。它不仅提高了数值计算的稳定性,还与特定的损失函数(如NLLLoss)无缝配合,广泛应用于分类任务中。
可视化显示torch当前神经网络的结构
torchsummary.summary()
from torchsummary import summary
model = Net().cuda() # 如果用 GPU
summary(model, (3, 32, 32)) # 输入 shape 不含 batch 维度
使用 torchviz 可视化计算图(图形化)
from torchviz import make_dot
x = torch.randn(1, 3, 32, 32)
y = model(x)
dot = make_dot(y, params=dict(model.named_parameters()))
dot.render("model_graph", format="png") # 保存为 PNG
- 需要安装 Graphviz:
sudo apt-get install graphviz(Linux)或从官网安装(Windows/macOS)