如何将基于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
相关产品推荐
相关产品推荐

