- 🍨本文为🔗365天深度学习训练营中的学习记录博客
- 🍖原作者:K同学啊
一、前期准备
1. 模块导入与GPU设置
2. 导入数据
3. 划分数据集
二、ResNet34模型
1. 调用模型
2. 查看模型详情
3.手动搭建ResNet34
三、训练模型
1. 编写训练函数
2. 编写测试函数
4. 正式训练
四、结果可视化
1. Loss与Accuracy图
2. 模型评估
四、学习心得ResNet 的核心是残差连接。残差块的输出是 ReLU(F(x) + x),卷积层只需要学习输入和输出之间的差值,梯度还能顺着捷径直接传回前面的层,所以网络加深后不容易退化。
读懂官方代码的结构输出,就能手动搭出 ResNet34。整体结构是:7×7 卷积 + 最大池化,然后 4 个 stage 分别堆叠 3、4、6、3 个 BasicBlock,最后接全局平均池化和全连接层,一共 1 + 16×2 + 1 = 34 层。搭建时有三个要点:
layer 2~4 的第一个块会把尺寸减半、通道翻倍,这时捷径上要加 1×1 卷积 + BN(也就是 downsample)来对齐形状;
卷积后面紧跟 BN,所以卷积层不需要 bias;
用 _make_layer 按个数堆叠 BasicBlock,代码会简洁很多。
搭好后打印出的结构和官方完全对应。
迁移学习效果很明显。调用官方 ResNet34 并加载 ImageNet 预训练权重,只要把最后的 fc 换成 2 类输出。第 1 轮测试准确率就到了 97.4%,20 轮后最佳测试准确率是 98.8%。
ResNet34 比 VGG-16 更深,参数却少得多。它的层数是 VGG-16 的两倍多,参数量只有 2129 万,而上周的 VGG-16 约 1.34 亿。主要原因是 ResNet 用全局平均池化代替了 VGG 那几个巨大的全连接层。
深度学习-- RestNet34实现X光肺炎识别