浅谈语义分割网络U-Net
theme: cyanosis
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
我一个做NLP的本来是用不到U-Net的,但是现在我在搞扩散模型嘛,扩散模型中神经网络部分用的是U-Net,所以我就得浅浅地学习一下子。
U-Net出自 U-Net: Convolutional Networks for Biomedical Image Segmentation
这个网络和别的自编码(autoe第二步是就是ncoder)模型一样,在中间有一个bottleneck,以确保网络只学习最重要的信息。和他之前的模型的一个区别是它引入了编码器和解码器之间的残差连接,大大改善了梯度流。
看下图,看这个形状你们应该就知道它为什么叫U-Net了。
可以看出,U-Net模型首先对输入进行downsamples即在空间分辨率上使输入变小,进行特征提取,然后再进行updownsamples,用于精确定位,文中使用的是bilinear双线性插值。
该网络由收缩路径(contracting path)和扩张路径(expanding path)组成。我们可以将两部分认为是encoder-decoder结构。
接下来介绍一下图像的处理过程。 看一下右下角的图例: - 蓝色箭头代表3*3的卷积+ReLU - 灰色箭头代表复制裁剪 - 红色箭头是池化 - 绿色箭头是upsampling上采样 - 青色箭头是坐了个1*1的卷积
- 而图中的蓝色框框就是feature map了。
第一步接收到图像之后是将图像从1通道转化成64通道,顺便做了一个卷积,用的是3x3 的卷积核,padding 为 0 ,striding 为 1,所以每次计算之后图像H、W两个维度都会减2。
第二步是进行一次 stride 为 2 的 max pooling。
之后就是一直重复直到最底下那三个,你先是得到一个32*32通道数为512的features map,然后再进行两次卷积最后得到通道数1024的28*28的features map。
看一下这一部分是怎么来的。白色部分是从左边直接裁剪出来的,用于残差连接,直接拼接到原来的维度上。右边蓝色部分就是通过一个反卷积插值扩大维度。
虽然我们认为U-Net属于 FCN 的一种变体,但是在这一步中体现出了FCN和U-Net很重要的一个区别。在这里处理的时候U-Net使用的是concat,将两部分拼接到一起,但是传统的FCN在这一步中是将二者相加。
至于向上的绿色箭头进行反卷积,我们可以简单地理解为使用公式进行定位,以原来features map中的点为核心将图像补全。
将一个 2x2 的矩阵通过插值的方式得到 4x4 的矩阵,那么将 2x2 的矩阵称为源矩阵,4x4 的矩阵称为目标矩阵。双线性插值中,目标点的值是由离他最近的 4 个点的值计算得到的。
计算公式如下:
$$ \begin{aligned} &X_{后}=\left(X_{前}+0.5\right) \left(\frac{\text { Width }{后}}{\text { Width }{前}}\right)-0.5\ &Y_{后}=\left(Y_{前}+0.5\right) \left(\frac{\text { Height }{后}}{\text { Height }{前}}\right)-0.5 \end{aligned} $$
举个例子,假设我们现在要计算这个黑色格子,那根据公式:
$$ \begin{aligned} &0=\left(X_{前}+0.5\right) 2-0.5\ &1=\left(Y_{前}+0.5\right) 2-0.5 \end{aligned} $$
得到
$$ \begin{aligned} X_{前}&=-0.25\ Y_{前}&=0.25 \end{aligned} $$
源矩阵长这样,肯定不能找到$(-0.25,0.25)$的位置,所以我们将其扩充,找到这个位置周围的四个点即可。
所以对应的四个位置是$(-1,0) \quad (-1,1)\quad (0,0)\quad (0,1)$
然后使用公式 $$ \begin{aligned} f(x + u, y + v) =& (1 - u) (1 - v) f(x, y) + (1 - u) v f(x, y+ 1) \ &+ u (1 - v) f(x + 1, y) + u v f(x + 1, y+ 1) \end{aligned} $$
带入计算得到:
$$ \begin{aligned} &(1 - 0.75) (1 - 0.25) 6+ (1 - 0.75) 0.25 6 + 0.75 (1 - 0.25)5 + 0.75 0.25 5\ &= 0.250.756+0.250.256+0.750.755+0.750.255 \ &=5.25 \end{aligned} $$
最终计算得到黑色格子为5.25。
其他过程以此类推。U-Net就是这样,不断使特征变短的过程叫下采样,不断恢复特征长度叫上采样,上下采样两部分共同组成一个U-Net。
- 【翻译】最近兴起的扩散模型
- 深扒torch.autograd原理
- 用一个图像分类实例拿捏Pytorch使用方法
- 带你了解自然语言处理文本生成方向
- 你们居然还在用负样本做对比学习?
- 4个例子帮你梳理PyTorch的nn module
- 几个例子帮你梳理PyTorch知识点(张量、autograd)
- SimCSE,丹琦女神把对比学习用到了NLP中了!
- 两个视角给你解读 熵、交叉熵、KL散度
- 你们那种对比学习是辣鸡,我SwAV今天就要打开新局面!
- “军备竞赛”时期的对比学习
- 怎么用PyTorch实现一个Encoder-Decoder框架?
- 公式代码都有了,速来学LSTM 长短期记忆网络
- 【翻译】图解自注意力机制
- 用pytorch写个RNN 循环神经网络
- 用pytorch写个 GRU 门控循环单元
- 手把手教你实现 seq2seq
- 突然火起来的diffusion model是什么?
- TensorBoard 一行代码实现指标可视化
- 【翻译】图解transformer