机器学习这么多模型,从事医学图像分析应该学哪些?|个人观点·24-08-24

小罗碎碎念

无论是临床的还是工科的同学,读完一定量的文献以后,都会产生一个问题——可以应用于医学AI领域的模型这么多,我需要学哪些?

之前其实我也有同样的困惑,昨天参加会议的时候趁着自己不感兴趣的议题,我翻了一下Transformer的原理,然后我惊喜的发现我得到了问题的答案:先学CNN,然后学ResNet,接着学UNet,最后学Tranformer

我这里说的学,不是让你去了解每层网络是如何计算的,你只需要知道网络的架构,工作的原理以及输入输出所需要的数据特征维度即可。(因为很多中间的网络结构都封装在pytorch里了,你直接调用即可;预训练模型也大都提供了对应的权重文件,可以直接使用)

这一期推文先解决前面两个网络(CNN&ResNet),你把我推文中提到的内容弄懂了,也就足够了,后面跟着我复现几个项目,你的思路就会更加的清晰。


一、CNN架构

在正式介绍ResNet之前,你需要先了解有关CNN的一些基础知识,了解了ResNet之后,你才能掌握后面的Transformer。

1-1:卷积层

卷积操作究竟执行了什么功能?卷积操作在某一位置上,若检测到卷积特征存在,则输出高值;反之,则输出低值。

具体而言,在卷积核的某一给定位置,我们对每个核细胞值与其对应的图像像素值进行元素级别的乘法运算,这些像素值与核细胞重叠,然后将这些乘积求和。

具体的数值根据以下公式确定(m代表卷积核的宽度和高度,h代表卷积输出,x代表输入,w代表卷积核)。
h i , j = ∑ k = 1 m ∑ l = 1 m w k , l x i + k − 1 , j + l − 1 \begin{equation} \mathrm{h}_{i,j}=\sum_{k=1}^{m}\sum_{l=1}^{m}w_{k,l}x_{i+k-1,j+l-1} \end{equation} hi,j=k=1ml=1mwk,lxi+k1,j+l1
卷积操作在图像上的过程,可以形象化地理解为如下步骤。

仅仅了解卷积操作的作用是不够的,我们还需要理解卷积输出的含义。可以设想将卷积输出中的值赋予颜色(0代表黑色,100代表白色)。如果你将这个图像可视化,它将呈现为一个二值图像,在眼睛所在的位置亮起。

卷积操作亦可视为对给定图像执行某种变换。此变换可产生多种效果(例如提取边缘、模糊等)。让我们更具体地理解卷积操作对图像的作用。


1-2:池化层

接下来,我们探讨池化操作的作用。池化层(有时也称为子采样层)使得卷积神经网络在卷积输出方面具有一定的平移不变性。

实践中使用了两种不同的池化机制(最大池化和平均池化)。我们将以最大池化为例进行讨论,因为与平均池化相比,最大池化更为广泛使用。具体来说,池化操作在给定位置上,输出的是落在池化核范围内的输入值的最大值。因此,从数学角度上讲,
h i , j = m a x { x i + k − 1 , j + l − 1 ∀ 1 ≤ k ≤ m   a n d   1 ≤ l ≤ m } \begin{equation} \mathrm{h}_{i,j}=max\{x_{i+k-1,j+l-1}\forall1\leq k\leq m\mathrm{~and~}1\leq l\leq m\} \end{equation} hi,j=max{xi+k1,j+l1∀1km and 1lm}
让我们通过将池化操作应用于之前观察到的卷积输出,来理解池化是如何工作的。

如你所见,我们使用了同一图像的两个变体;一个是原始图像,另一个是在x轴上轻微平移的图像。

然而,池化操作对于这两个图像输出的是完全相同的特征图(黑色—0,白色—100)。因此,我们说池化操作使得卷积神经网络中的知识具有平移不变性。需要注意的是,我们并不是每次移动1个像素,而是每次移动2个像素。这被称为步进池化(strided-pooling),意味着我们执行的是步长为2的池化操作。


1-3:全连接层

全连接层将不同卷积核学习的特征进行组合,使得网络能够构建关于整体图像的全局表示。我们可以以下列方式理解全连接层。

全连接层中的神经元将根据卷积特征所表示的各个实体是否实际存在于输入中而被激活。随着全连接神经元的激活,它将根据输入图像中存在的特征产生不同的激活模式。这为输出层提供了图像内容的紧凑表示,输出层可以轻松地利用这一表示来正确地对图像进行分类。


1-4:综合构建

现在,我们需要做的是将这些部分综合起来,形成一个从原始图像到决策的端到端模型。

一旦连接起来,卷积神经网络将呈现如下结构。概括来说,卷积层将在数据中学习各种局部特征(例如眼睛的外观),然后池化层将使卷积神经网络对这些特征的平移具有不变性(例如,如果两个图像中的眼睛出现轻微的平移,卷积神经网络仍然能够识别它为眼睛)。

最后,我们拥有全连接层,它们会说:“我们发现了两只眼睛、一个鼻子和一张嘴巴,这一定是一个人”,并激活正确的输出。


1-5:增加更多层的作用是什么?

增加更多层显然能够提升深度神经网络的性能。实际上,深度学习中最引人注目的突破性研究往往与解决以下问题有关:如何在不破坏模型训练的情况下增加更多层? 因为模型越深,训练难度就越大。

但是,拥有更多层有助于卷积神经网络以分层的方式学习特征。例如,第一层学习图像中的各种边缘方向,第二层学习基本形状(如圆形、三角形等),第三层学习更高级的形状(例如眼睛的形状、鼻子的形状),以此类推。

与只使用单层就必须学习所有这些特征的卷积神经网络相比,这种方式能够提供更好的性能。


1-6:训练卷积神经网络(即反向传播)

现在,需要牢记的一点是,当你实现一个卷积神经网络时,这些卷积特征(如眼睛、鼻子、嘴巴)并不会神奇地出现。目标是在给定数据的情况下学习这些特征。为此,我们定义一个成本函数,该函数对正确识别的数据给予奖励,对错误分类的数据给予惩罚。例如,成本函数可以是均方根误差或二元交叉熵损失。

定义了损失之后,我们可以优化特征的权重(即特征的每个单元格值),以反映导致卷积神经网络正确识别一个人的有用特征。

更具体地说,我们通过沿着每个参数相对于损失的梯度的相反方向采取一个小步骤,来优化每个卷积核和全连接神经元。然而,实现卷积神经网络时,你不需要知道如何实现梯度传播的确切细节。这是因为,大多数深度学习库(例如TensorFlow、PyTorch)在你定义前向计算时,会内部实现这些微分操作,这是自动完成的。


二、ResNet架构

image-20240823181940108

2-1:概述

ResNet(残差网络)是一种深度卷积神经网络架构,它通过引入残差学习来解决深度网络训练中的退化问题。

ResNet的核心思想是让网络去拟合残差映射,而不是直接拟合潜在映射,即学习恒等映射的方式,让输入通过深层网络后尽可能保持其原有的特征 。ResNet的基本构建块是残差块(Residual Block),每个残差块包含两个或三个卷积层,以及一个跨层的恒等映射,确保输入可以直接传递到输出,从而避免了信息的丢失 。

ResNet在多个领域都取得了显著的成功,尤其是在图像识别、目标检测、语义分割等关键任务中展现出卓越性能。ResNet通过残差连接允许梯度直接回流到较早的层,缓解了梯度消失的问题,并且通过降采样和全局平均池化提取关键特征,最后通过全连接层进行分类或回归 。

ResNet的不同版本,如ResNet-18、ResNet-34、ResNet-50、ResNet-101、ResNet-152等,主要区别在于网络深度和宽度,但基本构建块是相同的。例如,ResNet-34包含34层,其中包括一个7x7的卷积层,然后是16个残差块(每个残差块包含两层卷积),最后连接上一个全连接层 。

ResNet的实现通常包括批量归一化(Batch Normalization)和ReLU激活函数,这些技术用于加速训练并提高模型的泛化能力。在PyTorch中,可以使用预定义的模型如torchvision.models.resnet18torchvision.models.resnet50等,这些模型内部封装了相应的ResNet模块 。


2-2:如何快速理解ResNet的作用

节选自:https://blog.csdn.net/m0_62919535/article/details/132384303

想象一张经过神经网络处理后的低分辨率图像。为了提高图像的质量,我们引入了一个创新的思想:将原始高分辨率图像与低分辨率图像之间的差异提取出来,形成了一个残差图像。这个残差图像代表了低分辨率图像与目标高分辨率图像之间的差异或缺失的细节。

635dccaf2bf84a109765be975a4212cd.png

然后,我们将这个残差图像与低分辨率图像相加,得到一个结合了低分辨率信息和残差细节的新图像。这个新图像作为下一个神经网络层的输入,使网络能够同时利用原始低分辨率信息和残差细节信息进行更精确的学习。

c6d88e4dde544113a6562f338579a089.jpeg

通过这种方式,我们的神经网络能够逐步地从低分辨率图像中提取信息,并通过残差图像的相加操作将遗漏的细节加回来。这使得网络能够更有效地进行图像恢复或其他任务,提高了模型的性能和准确性。


2-3:residual(残差)结构

image-20240823230553971

左边的结构是针对于网络结构较少的网络使用的,比如34层。而右边是对50层,101层,152层提出来的结构。

左图

主线是将输入特征矩阵经过两个3*3的的卷积层。右边有一个弧线,直接从输入连接到输出。

主分支上得到的特征矩阵再与输入特征矩阵相加,相加之后再通过ReLU函数。既然是相加,需要注意,主分支与shortcut的输出特征矩阵shape(w、h、c)必须是相同的。

参数个数:3×3×64×64 + 3×3×64×64


右图

依次通过 1 ∗ 1 1*1 11的卷积层, 3 ∗ 3 3*3 33的卷积层, 1 ∗ 1 1*1 11的卷积层。

参数个数:1×1×256×64 + 3×3×64×64 + 1×1×64(输入卷积核的通道数)×256(卷积核个数)


右图比左图比起来,到底节省了多少参数呢?

假设左图也是输入256维的向量,第一个卷积层是 3 ∗ 3 ∗ 256 3*3*256 33256,第二个卷积层也是 3 ∗ 3 ∗ 256 3*3*256 33256,那么第一个卷积层需要$33256(注:输入图像通道数)*256(注:卷积核个数) $;第二个卷积层也需要 3 ∗ 3 ∗ 256 ∗ 256 个 3*3*256*256个 33256256参数。共需要1,179,648个参数。而右图需要: 1 ∗ 1 ∗ 256 ∗ 64 + 3 ∗ 3 ∗ 64 ∗ 64 + 1 ∗ 1 ∗ 64 ∗ 256 = 69632 个参数 1*1*256*64+3*3*64*64+1*1*64*256 = 69632个参数 1125664+336464+1164256=69632个参数

img

一个118万,一个7万。明显少了很多。而且,在网络搭建的过程中可不止一个残差结构,而是十几个、几十个残差结构。


2-4:ResNet模型结构

根据layer的不同,ResNet模型分为5个版本:18/34(浅层)50/101/152(深层)

image-20240823231633113

我们可以看到这几个网络的整个网络框架是类似的。同样是经过 7 ∗ 7 7*7 77的池化层,然后经过 3 ∗ 3 3*3 33的最大下采样。再经过一系列的残差结构。最后平均下采样、全连接层、输出层。


将残差结构分为 conv2_x、conv3_x、conv4_x、conv5_x 这四部分的一系列结构。表格中的个数表示了有几个残差结构。

img

img

img


浅层网络

1、第一个3 x 3的卷积层,步距stride变为了2 ,将高和宽缩减为原来的一半,通过128个卷积核改变特征矩阵的深度。

2、shortcut部分加上了1x1的卷积核,通过步距为2,高和宽缩减为原来的一半,通过128个卷积核改变特征矩阵的深度,这样保证主分支与shortcut分支的shape一样,从而进行相加。

img

右边图中对应的 conv3_x的输入矩阵为 56 x 56 x 64,而输出矩阵为 28 x 28 x 128,通过虚线残差结构得到输出后,再将输出输入到实线残差结构中,才能保证他的输入特征矩阵与输出特征矩阵的shape是相同的。

img

无论是浅层网络还是深层网络,conv3_x、conv4_x、conv5_x的第一层都为虚线残差结构,因为需要将上一层输出特征矩阵的高、宽、深度调整为当前层所需输入特征矩阵的高、宽、深度(Down-sampling is performed by conv3_1、conv4_1 and conv5_1 with a stride of 2)


深层网络

image-20240823233528668

右边图中对应的 conv3_x的输入矩阵为 56 x 56 x 256,而输出矩阵为 28 x 28 x 512.

在主线上:通过 1x1,128的卷积层进行降维,将深度由256降到128,不改变高和宽。

第二个3x3的卷积层,stride为2将高和宽缩减为原来的一半,变成28x28x128.

第三个1x1,512的卷积层,进行升维,增加深度,变为28x28x512

shortcut 采用 1x1,512,stride=2的卷积层将高和宽减半,深度变为原来的2倍。

img


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值