🎯 学习目标

  • 掌握nn.Module的基本使用方法
  • 学会定义自定义神经网络类
  • 理解常用神经网络层的作用和用法
  • 掌握激活函数的选择与应用
神经网络结构

torch.nn模块简介

torch.nn是PyTorch的核心神经网络模块,提供了构建神经网络所需的各种组件, 包括线性层、卷积层、循环层、激活函数、损失函数等。所有神经网络模块都继承自nn.Module基类。

🏗️ nn.Module基础

import torch import torch.nn as nn # 自定义神经网络类 class SimpleNet(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super(SimpleNet, self).__init__() # 定义网络层 self.fc1 = nn.Linear(input_size, hidden_size) # 全连接层1 self.relu = nn.ReLU() # 激活函数 self.fc2 = nn.Linear(hidden_size, num_classes) # 全连接层2 def forward(self, x): # 定义前向传播 out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out # 创建模型实例 model = SimpleNet(input_size=784, hidden_size=128, num_classes=10) print(model)

📊 常用神经网络层

线性层 (Linear)

# y = xW^T + b linear = nn.Linear( in_features=784, out_features=128 ) # 输入形状: (N, 784) # 输出形状: (N, 128)

卷积层 (Conv2d)

# 2D卷积层 conv = nn.Conv2d( in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1 )

池化层

# 最大池化 maxpool = nn.MaxPool2d( kernel_size=2, stride=2 ) # 平均池化 avgpool = nn.AvgPool2d(2)

归一化层

# 批归一化 bn = nn.BatchNorm2d(64) # 层归一化 ln = nn.LayerNorm(128) # Dropout dropout = nn.Dropout(0.5)

激活函数

激活函数 公式 特点 适用场景
ReLU max(0, x) 计算简单,缓解梯度消失 隐藏层默认选择
Sigmoid 1/(1+e^-x) 输出(0,1),有梯度消失问题 二分类输出层
Tanh (e^x-e^-x)/(e^x+e^-x) 输出(-1,1),零中心 RNN隐藏层
Softmax e^xi/Σe^xj 输出概率分布 多分类输出层
LeakyReLU x if x>0 else αx 解决ReLU死神经元问题 深层网络
GELU x·Φ(x) 平滑,Transformer首选 Transformer架构

🧱 使用nn.Sequential构建模型

# 方式1: 直接传入模块 model = nn.Sequential( nn.Linear(784, 256), nn.ReLU(), nn.Dropout(0.2), nn.Linear(256, 128), nn.ReLU(), nn.Linear(128, 10) ) # 方式2: 使用OrderedDict命名 from collections import OrderedDict model = nn.Sequential(OrderedDict([ ('fc1', nn.Linear(784, 256)), ('relu1', nn.ReLU()), ('dropout', nn.Dropout(0.2)), ('fc2', nn.Linear(256, 10)) ])) # 访问特定层 print(model.fc1) # 第一层

🔧 模型参数管理

# 查看模型参数 for name, param in model.named_parameters(): print(f'{name}: {param.shape}') # 获取所有参数 params = list(model.parameters()) print(f'参数数量: {len(params)}') # 计算模型总参数量 total_params = sum(p.numel() for p in model.parameters()) trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad) print(f'总参数: {total_params}, 可训练参数: {trainable_params}') # 冻结参数 for param in model.parameters(): param.requires_grad = False
💡
最佳实践

使用nn.Module子类定义复杂模型,使用nn.Sequential构建简单顺序模型。在forward方法中实现复杂的前向传播逻辑,如残差连接、多分支结构等。

深度学习网络
图:神经网络由多个层堆叠而成

📝 本节小结

  • • nn.Module是所有神经网络模块的基类
  • • __init__中定义网络层,forward中定义前向传播
  • • 常用层包括Linear、Conv2d、MaxPool2d、BatchNorm等
  • • 激活函数为网络引入非线性,ReLU是最常用的选择
  • • nn.Sequential适合构建简单的顺序模型