nn模块

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)