CNN经典网络模型(五):ResNet简介及代码实现(PyTorch超详细注释版)

目录

一. 开发背景

二. 网络结构

三. 模型特点

四. 代码实现

五. 参考内容

六. 代码及数据集下载


一. 开发背景

残差神经网络(ResNet)是由微软研究院的何恺明、张祥雨、任少卿、孙剑等人提出的, 斩获2015年ImageNet竞赛中分类任务第一名, 目标检测第一名。 残差神经网络的主要贡献是发现了“退化现象(Degradation)”,并针对退化现象发明了 “直连边/短连接(Shortcut connection)”,极大的消除了深度过大的神经网络训练困难问题。神经网络的“深度”首次突破了100层、最大的神经网络甚至超过了1000层。

二. 网络结构

ResNet的前两层为输出通道数为64、步幅为2的7×7卷积层,后接步幅为2的3×3的最大池化层。 不同于GoogLeNet,ResNet在每个卷积层后增加了批量规一化层。接着, ResNet使用4个由残差块组成的模块,每个模块使用若干个同样输出通道数的残差块。 第一个模块的通道数同输入通道数一致。 由于之前已经使用了步幅为2的最大池化层,所以无须减小高和宽。 之后的每个模块在第一个残差块里将上一个模块的通道数翻倍,并将高和宽减半。ResNet的一个重要设计原则是:当feature map大小降低一半时,feature map的数量增加一倍,这保持了网络层的复杂度。最后,输入全局平均汇聚层,以及全连接层输出。通过配置不同的通道数和模块里的残差块数可以得到不同的ResNet模型,例如更深的含152层的ResNet-152。34层ResNet如下图所示:

残差单元(残差块)

ResNet团队分别构建了带有“直连边(Shortcut Connection)”的ResNet残差块、以及降采样的ResNet残差块,区别是降采样残差块的直连边增加了一个1×1的卷积操作。对于直连边,当输入和输出维度一致时,可以直接将输入加到输出上,这相当于简单执行了同等映射,不会产生额外的参数,也不会增加计算复杂度。但是当维度不一致时,这就不能直接相加,通过添加1×1卷积调整通道数。这种残差学习结构可以通过前向神经网络+直连边实现, 而且整个网络依旧可以通过端到端的反向传播训练。结构如下图所示:

三. 模型特点

1.超深的网络结构(突破1000层)

网络深度为什么重要?因为CNN能够提取low/mid/high-level的特征,网络的层数越多,意味着能够提取到不同level的特征越丰富。并且,越深的网络提取的特征越抽象,越具有语义信息。

2.使用Batch Normalization

为什么不能简单地增加网络层数?对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。Batch Normalization可以解决该问题的,因此可以训练到几十层的网络。

3.残差块

随着网络层数增加,出现了新的问题:退化问题,在训练集上准确率饱和甚至下降了。这个不能解释为过拟合,因为过拟合表现为在训练集上表现更好才对。退化问题说明了深度网络不能很简单地被很好地优化。作者通过实验说明:通过浅层网络y=x 等同映射构造深层模型,结果深层模型并没有比浅层网络有更低甚至等同的错误率,推断退化问题可能是因为深层的网络很那难通过训练利用多层网络拟合同等函数。

怎么解决退化问题?深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。所以要解决的就是学习恒等映射函数。但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 此外,拟合残差会更加容易。

总的来说,一是其导数总比原导数加1,这样即使原导数很小时,也能传递下去,能解决梯度消失的问题; 二是y=f(x)+x式子中引入了恒等映射(当f(x)=0时,y=2),解决了深度增加时神经网络的退化问题。

4.结构简单

虽然ResNet的主体结构跟GoogLeNet类似,但ResNet结构更简单,修改也更方便,因此ResNet迅速被广泛使用。

四. 代码实现

  • model.py :定义ResNet网络模型
  • train.py:加载数据集并训练,计算loss和accuracy,保存训练好的网络参数
  • predict.py:用自己的数据集进行分类测试
  • spilit_data.py:划分给定的数据集为训练集和测试集

1. model.py

import torch.nn as nn
import torch


# 定义ResNet18/34的残差结构,为2个3x3的卷积
class BasicBlock(nn.Module):
    # 判断残差结构中,主分支的卷积核个数是否发生变化,不变则为1
    expansion = 1

    # init():进行初始化,申明模型中各层的定义
    # downsample=None对应实线残差结构,否则为虚线残差结构
    def __init__(self, in_channel, out_channel, stride=1, downsample=None, **kwargs):
        super(BasicBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,
                               kernel_size=3, stride=stride, padding=1, bias=False)
        # 使用批量归一化
        self.bn1 = nn.BatchNorm2d(out_channel)
        # 使用ReLU作为激活函数
        self.relu = nn.ReLU()
        self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,
                               kernel_size=3, stride=1, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(out_channel)
        self.downsample &
### 肿瘤放疗领域中的医学影像预训练模型 在肿瘤放疗领域,医学影像预训练模型的应用日益广泛。这些模型能够显著提升放射治疗计划的质量和效率,从而改善患者的治疗效果。 #### 自监督学习与合成数据生成 自改进的生成式基础模型(MINIM)展示了强大的能力,可以在不依赖大量标注数据的情况下进行高质量的医疗图像生成[^1]。这种特性使得该模型特别适合于处理稀缺且难以获取标签的数据集,如特定类型的癌症影像。通过这种方式,研究人员可以利用较少的真实世界样本创建更多的虚拟病例用于训练其他下游任务模型。 #### 特定应用场景下的迁移学习 对于脑部肿瘤这类复杂病症而言,已经有一些研究表明基于大规模通用医学影像数据库上预先训练好的网络结构能够在不同难度级别的分类任务中取得良好表现[^2]。具体来说,在预测是否存在脑肿瘤、区分不同类型以及进一步细化至分子层面特征等方面均显示出较高的准确性。这表明经过适当调整后的预训练权重可以直接应用于相似但更具体的临床挑战当中去解决实际问题。 #### 多模态融合增强决策支持系统 除了单独依靠视觉信息外,现代AI解决方案还倾向于整合来自多个渠道的信息源来构建更加全面可靠的诊疗建议体系[^3]。例如,在制定个性化放疗方案时不仅会考虑到CT/MRI扫描结果还会结合病理报告甚至是遗传背景等因素共同决定最佳策略组合。这种方法有助于克服单一模式下可能存在的局限性并最终实现精准医疗的目标。 ```python import torch from torchvision import models, transforms from PIL import Image def load_pretrained_model(): # 加载一个已经在大型公共数据集上预训练过的ResNet50模型作为例子 model = models.resnet50(pretrained=True) # 修改最后一层以适应新的类别数量(这里假设为两类:有无肿瘤) num_ftrs = model.fc.in_features model.fc = torch.nn.Linear(num_ftrs, 2) return model.eval() transform_pipeline = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), ]) image_path = 'path_to_medical_image' img = Image.open(image_path).convert('RGB') input_tensor = transform_pipeline(img).unsqueeze(0) # 添加批次维度 model = load_pretrained_model() output = model(input_tensor) _, predicted_class = output.max(dim=1) print(f'Predicted class index: {predicted_class.item()}') ``` 此代码片段展示了一个简单的流程:加载一个已在ImageNet等大数据集上预训练过的基础卷积神经网络,并针对二元分类任务修改其最后几层参数;接着定义好输入图片转换管道以便能被送入网络计算得到预测结果。
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华科附小第一名

您的支持对我的前行很重要!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值