pytorch api文档:torch.nn.Module神经网络基类

介绍

nn.Module 是 PyTorch 中所有神经网络模块的 基类,自定义的任何神经网络层、整个模型,都需要 继承这个类。
它提供了一系列核心功能,无需手动处理参数管理、设备迁移、前向传播、模型保存/加载等繁琐工作。

简单来说:nn.Module 就像一个“神经网络工具箱”,封装了构建模型的所有基础能力。

功能与使用方法

基础使用步骤

自定义模型的标准流程是:

  1. 继承 nn.Module
  2. 在 __init__ 中定义网络层(如卷积、全连接层)
  3. 实现 forward 方法(定义前向传播逻辑)

例子

import torch
import torch.nn as nn

# 自定义一个简单的全连接网络,继承 nn.Module
class MyNet(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        # 必须先调用父类的 __init__ 方法
        super(MyNet, self).__init__()

        # 定义网络层(nn.Module 会自动管理这些层的参数)
        self.fc1 = nn.Linear(input_size, hidden_size)  # 全连接层1
        self.relu = nn.ReLU()                          # 激活函数
        self.fc2 = nn.Linear(hidden_size, output_size) # 全连接层2

    # 必须实现 forward 方法,定义数据的前向传播路径
    def forward(self, x):
        out = self.fc1(x)   # 第一层线性变换
        out = self.relu(out)# ReLU激活
        out = self.fc2(out) # 第二层线性变换
        return out

# ---------------------- 测试使用 ----------------------
# 1. 创建模型实例
model = MyNet(input_size=10, hidden_size=20, output_size=5)
print("模型结构:")
print(model)

# 2. 前向传播(直接调用模型实例,无需手动调用 forward 方法)
input_data = torch.randn(3, 10)  # 3个样本,每个样本10维特征
output = model(input_data)
print("\n输入形状:", input_data.shape)
print("输出形状:", output.shape)

# 3. 查看模型参数(nn.Module 自动管理参数)
print("\n模型参数:")
for name, param in model.named_parameters():
    print(f"参数名:{name},形状:{param.shape}")

# 4. 设备迁移(nn.Module 一键移到 GPU/CPU)
if torch.cuda.is_available():
    model = model.cuda()
    input_data = input_data.cuda()
    output = model(input_data)
    print("\n迁移到 GPU 后的输出设备:", output.device)

关键功能解释

功能 说明
__init__ 继承 必须通过 super().__init__() 初始化父类,否则无法使用 nn.Module 的所有功能
forward 方法 定义数据的前向传播逻辑,调用模型时(如 model(x))会自动执行该方法(无需手动调 forward)
参数自动管理 所有在 __init__ 中定义的 nn.Module 子类(如 nn.Linear、nn.Conv2d)的参数,都会被 parameters()/named_parameters() 收集,用于后续的梯度下降
设备迁移 通过 model.to(device) 可以一键将模型所有参数移到 CPU/GPU,无需逐个处理层
模型保存/加载 torch.save(model.state_dict(), "model.pth") 保存参数,model.load_state_dict(torch.load("model.pth")) 加载参数,这是 nn.Module 推荐的保存方式
子模块管理 可以通过 nn.Sequential 或直接定义子模块(如 self.feature = nn.Conv2d(3, 16, 3)),nn.Module 会自动管理所有子模块

常见误区

  1. 不要在 forward 外定义层:如果层定义在 forward 里,nn.Module 无法收集其参数,会导致参数无法更新;
  2. 不要手动调用 forward:直接 model(x) 即可,PyTorch 会在调用时自动触发 forward,并处理梯度计算等底层逻辑;
  3. 区分 nn.Module 和 nn.functional:nn.Module(如 nn.ReLU)是类,自带参数管理;nn.functional(如 F.relu)是函数,无参数,需手动管理(适合无参数的激活函数/池化)。

总结

  1. nn.Module 是 PyTorch 构建神经网络的基类,所有模型/层都必须继承它;
  2. 核心用法是:继承 nn.Module → 在 __init__ 定义层 → 实现 forward 定义前向传播;
  3. 它提供了参数管理、设备迁移、模型保存/加载等核心功能,极大简化了神经网络开发。

掌握 nn.Module 是学好 PyTorch 的关键,所有复杂模型(如 ResNet、Transformer)本质上都是基于 nn.Module 构建的。


原文出处:/show_1GW2d1fZRbo1.html