2-更改baseline到resnet18.md
约 892 字大约 3 分钟
2026-03-27
根据观察,在0-baseline.py的结果中,我们发现训集、测试集表现浮动很大不稳定,且效果并不好,所以,我们使用resnet18作为新的主干网络,也就是老师提供的1-resnet.py
1.resnet18网络
Resnet18作为深度残差网络(ResNet)家族的一员,因其优秀的性能和简洁的结构,受到了广大研究者和开发者的青睐。本文将对Resnet18的网络结构进行详细的解析,带您从输入到输出,一探究竟。
我们的图像篡改定位任务是一个分割任务,所以在最大池化之前的特征
| 层级 | 操作 | 输出尺寸 | 尺度变化 | 通道数 | 说明 |
|---|---|---|---|---|---|
| 输入图像 | - | [B, 3, 256, 256] | 1× | 3 | RGB 原始图像 |
| conv1 | 7×7 卷积,stride=2 | [B, 64, 128, 128] | 1/2 | 64 | 第一次降采样 |
| bn1 + relu | BatchNorm + ReLU | [B, 64, 128, 128] | 1/2 | 64 | 激活,尺寸不变 |
| maxpool | 3×3 最大池化,stride=2 | [B, 64, 64, 64] | 1/4 | 64 | 第二次降采样 |
| layer1 | ResNet Block1 (×2) | [B, 64, 64, 64] | 1/4 | 64 | 无下采样 |
| layer2 | ResNet Block2 (×2) | [B, 128, 32, 32] | 1/8 | 128 | stride=2 降采样 |
| layer3 | ResNet Block3 (×2) | [B, 256, 16, 16] | 1/16 | 256 | stride=2 降采样 |
| layer4 | ResNet Block4 (×2) | [B, 512, 8, 8] | 1/32 | 512 | stride=2 降采样 ⬅️ 最深层 |
可以观察到resnet18网络在提取特征的过程中,尺度变化也由256*256->8*8。所以我们要设计一个网络在逐步上采样到原有的尺度,最简单的方法就是使用ConvTranspose2d进行反卷积操作
# Stage 1: 512 -> 256 (1/32 -> 1/16) - 第一次上采样
nn.ConvTranspose2d(512, 256, kernel_size=4, stride=2, padding=1),
nn.BatchNorm2d(256),
nn.ReLU(inplace=True),
# Stage 2: 256 -> 128 (1/16 -> 1/8) - 第二次上采样
nn.ConvTranspose2d(256, 128, kernel_size=4, stride=2, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(inplace=True),
# Stage 3: 128 -> 64 (1/8 -> 1/4) - 第三次上采样
nn.ConvTranspose2d(128, 64, kernel_size=4, stride=2, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
# Stage 4: 64 -> 32 (1/4 -> 1/2) - 第四次上采样
nn.ConvTranspose2d(64, 32, kernel_size=4, stride=2, padding=1),
nn.BatchNorm2d(32),
nn.ReLU(inplace=True),
# Stage 5: 32 -> 16 (1/2 -> 1) - 第五次上采样
nn.ConvTranspose2d(32, 16, kernel_size=4, stride=2, padding=1),
nn.BatchNorm2d(16),
nn.ReLU(inplace=True),
# 最终输出层
nn.Conv2d(16, 1, kernel_size=3, padding=1) 通过上述的不断上采样过程,我们的特征尺度可以逐步恢复至256*256:
| 层级 | 操作 | 输入尺寸 | 输出尺寸 | 尺度变化 | 通道数 | 说明 |
|---|---|---|---|---|---|---|
| Stage 1 | ConvTranspose2d | [B, 512, 8, 8] | [B, 256, 16, 16] | 1/16 | 256 | 第一次上采样 |
| Stage 2 | ConvTranspose2d | [B, 256, 16, 16] | [B, 128, 32, 32] | 1/8 | 128 | 第二次上采样 |
| Stage 3 | ConvTranspose2d | [B, 128, 32, 32] | [B, 64, 64, 64] | 1/4 | 64 | 第三次上采样 |
| Stage 4 | ConvTranspose2d | [B, 64, 64, 64] | [B, 32, 128, 128] | 1/2 | 32 | 第四次上采样 |
| Stage 5 | ConvTranspose2d | [B, 32, 128, 128] | [B, 16, 256, 256] | 1× | 16 | 第五次上采样 |
| 输出层 | Conv2d (1×1) | [B, 16, 256, 256] | [B, 1, 256, 256] | 1× | 1 | 二值分割掩码 |
2.主要结果:
Epoch 18/20
Train Loss: 0.0978 | Val Loss: 0.3874
Train F1: 0.9475 | Val F1: 0.7043
Train P/R: 0.9291/0.9666
Val P/R: 0.7904/0.6352
提示:可能有明显过拟合
已保存最佳模型:best_model_resnet18_无预训练_简单数据集.pth
Epoch 19/20
Train Loss: 0.0910 | Val Loss: 0.3861
Train F1: 0.9440 | Val F1: 0.7117
Train P/R: 0.9187/0.9707
Val P/R: 0.7442/0.6819
提示:可能有明显过拟合
已保存最佳模型:best_model_resnet18_无预训练_简单数据集.pth
Epoch 20/20
Train Loss: 0.0767 | Val Loss: 0.4217
Train F1: 0.9579 | Val F1: 0.6927
Train P/R: 0.9488/0.9672
Val P/R: 0.7910/0.6161
提示:可能有明显过拟合
============================================================
训练完成
============================================================
模型:resnet18_无预训练
最佳验证 F1:0.7117 我们可以发现,其在训练集和测试集的F1分数相差巨大,说明模型陷入了过拟合的情况。
