使用 nn.Sequential 按层顺序构建模型(OrderedDict方法)
代码中导入了 torch 、 nn 以及 OrderedDict ,通过 OrderedDict 来定义模型的各层,包括 Flatten 层、 Linear 层、 BatchNorm1d 层、 ReLU 激活函数层和 Softmax 层。这样做的好处是可以给每一层指定一个名称,方便查看和管理模型结构。
继承 nn.Module 基类并应用模型容器构建模型
1. 使用 nn.Sequential 模型容器
定义了一个名为 Model_lay 的类,继承自 nn.Module 。在 __init__ 方法中初始化模型的各层,包括 Flatten 层、两个由 Linear 和 BatchNorm1d 组成的 Sequential 模块以及最后的输出层。 forward 方法定义了数据在模型中的流动方向。运行结果展示了模型的结构,包括每一层的名称和参数信息。
2. 使用 nn.ModuleList 模型容器
虽然图片中这部分代码没有完整展示,但 nn.ModuleList 通常用于将多个模块组合在一起,不过它不像 nn.Sequential 那样会自动按照顺序执行模块,更多是用于管理模块集合,在自定义 forward 方法中手动指定各模块的执行逻辑。
自定义网络模块——残差块
第一种残差块(正常模块方式):
通过代码定义了 ResNetBasicBlock 类,继承自 nn.Module 。其结构包括两个 3x3 卷积层,每个卷积层后接批量规范化层和ReLU激活函数。在 forward 方法中,输入数据依次经过这些层的处理,最后将输入与输出相加,再经过ReLU激活函数得到最终输出。这种方式能让网络学习输入与输出的残差部分,有助于训练更深的网络。
第二种残差块(调整形状):
定义了 ResNetDownBlock 类,也是继承自 nn.Module 。当输入与输出形状不一致时,通过添加 1x1 卷积层和批量规范化层来调整通道数和分辨率,使它们能顺利相加。在 forward 方法中,输入数据经过卷积、批量规范化、ReLU激活等操作,同时对输入进行形状调整,最后相加并经过ReLU激活函数输出。
组合模块构建ResNet18网络结构
定义了 ResNet18 类,在 __init__ 方法中初始化网络的各层,包括初始的卷积层、最大池化层,以及由不同残差块组成的四个Sequential模块,还有自适应平均池化层和全连接层。 forward 方法描述了数据在网络中的前向传播过程,依次经过各层处理后输出结果。