You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将基于nn.Sequential的FashionMNIST模型转为nn.Linear实现?

关于替换nn.Sequential的说明

首先得明确:nn.Sequential是用来按顺序堆叠层的容器,nn.Linear是具体的全连接层,两者不是同一类东西,没法直接互相转换。你代码里的block_1和block_2都是卷积、激活、池化的组合,这些层负责提取图像的空间特征,和全连接层(nn.Linear)的作用完全不同,不能用nn.Linear替换这些卷积/池化层。

但如果你的真实需求是去掉nn.Sequential容器,把里面的层单独定义,手动控制前向传播流程(这样确实更灵活,能插入自定义逻辑),那完全可以实现,修改后的代码如下:

import torch
from torch import nn

class FashionMNISTModelV2(nn.Module):
    def __init__(self, input_shape: int, hidden_units: int, output_shape: int):
        super().__init__()
        # 拆分block_1里的层
        self.block1_conv1 = nn.Conv2d(in_channels=input_shape, 
                                      out_channels=hidden_units, 
                                      kernel_size=3,
                                      stride=1,
                                      padding=1)
        self.block1_relu1 = nn.ReLU()
        self.block1_conv2 = nn.Conv2d(in_channels=hidden_units, 
                                      out_channels=hidden_units,
                                      kernel_size=3,
                                      stride=1,
                                      padding=1)
        self.block1_relu2 = nn.ReLU()
        self.block1_pool = nn.MaxPool2d(kernel_size=2,
                                        stride=2)
        
        # 拆分block_2里的层
        self.block2_conv1 = nn.Conv2d(hidden_units, hidden_units, 3, padding=1)
        self.block2_relu1 = nn.ReLU()
        self.block2_conv2 = nn.Conv2d(hidden_units, hidden_units, 3, padding=1)
        self.block2_relu2 = nn.ReLU()
        self.block2_pool = nn.MaxPool2d(2)
        
        # 拆分classifier里的层
        self.flatten = nn.Flatten()
        self.classifier_linear = nn.Linear(in_features=hidden_units*7*7, 
                                           out_features=output_shape)

    def forward(self, x: torch.Tensor):
        # 手动执行block_1的流程
        x = self.block1_conv1(x)
        x = self.block1_relu1(x)
        x = self.block1_conv2(x)
        x = self.block1_relu2(x)
        x = self.block1_pool(x)
        
        # 手动执行block_2的流程
        x = self.block2_conv1(x)
        x = self.block2_relu1(x)
        x = self.block2_conv2(x)
        x = self.block2_relu2(x)
        x = self.block2_pool(x)
        
        # 手动执行分类器流程
        x = self.flatten(x)
        x = self.classifier_linear(x)
        return x

这样修改后,模型的功能和原代码完全一致,但你可以在forward的任意步骤插入自定义操作(比如打印张量形状、添加正则化逻辑等),比用nn.Sequential更灵活。

内容的提问来源于stack exchange,提问作者Daniel Tobi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:35:20