Unet++网络

Dense connection

Unet++继承了Unet的结构,同时又借鉴了DenseNet的稠密连接方式(图1中各种分支)。

Unet++(pytorch实现)_人工智能

作者通过各层之间的稠密连接,互相连接起来,就像Denset那样,前前后后每一个模块互相作用,每一个模块都能看到彼此,那对彼此互相熟悉,分割效果自然就会变好。

在实际分割中,一次次的下采样自然会丢掉一些细节特征,在Unet中是使用skip connection来恢复这些细节,但能否做的更好呢?Unet++就给出了答案,这种稠密连接的方式,每一层都尽量多的保存这种细节信息和全局信息,一层层之间架起桥梁互相沟通,最后共享给最后一层,实现全局信息和局部信息的保留和重构。 

deep supervision

当然,简单的将各个模块连接起来是会实现很好的效果。而我们又能发现,一个Unet++其实是很多个不同深度的Unet++叠加。那么,每一个深度的Unet++是不是就都可以输出一个loss?答案自然是可以的。

所以,作者提出了deep supervision,也就是监督每一个深度的Unet++的输出,通过一定的方式来叠加Loss(比如加权的方式),这样就得到了一个经由1、2、3、4层的Unet++的加权Loss(图2 不同深度Unet++融合)。

Unet++(pytorch实现)_机器学习_02

那么,deep supervision又有什么用呢?-剪枝

既然Unet++由多个不同深度的Unet++叠加起来,那么随意去掉一层,前向传播的梯度不会受到任何变化,但你发现Unet++第三个输出的效果和第四个输出效果差不多时,那就可以毫不犹豫删去4层深度的Unet++。比如,直接删去图3中棕色部分,就可以实现剪枝。这样,就得到了更加轻量化的网络。

Unet++(pytorch实现)_pytorch_03

模型复现

Unet++

为了更直观一些,我把代码中的所有符号都和网络结构中对应上了。

Unet++(pytorch实现)_人工智能_04

Unet++(pytorch实现)_pytorch_05

Unet++(pytorch实现)_人工智能_06

Unet++(pytorch实现)_python_07

Unet++(pytorch实现)_pytorch_08

Unet++(pytorch实现)_深度学习_09

Unet++(pytorch实现)_深度学习_10

Unet++(pytorch实现)_python_11

数据集准备

数据集使用Camvid数据集,可在CamVid数据集的创建和使用-pytorch中参考构建方法。

Unet++(pytorch实现)_python_12

Unet++(pytorch实现)_机器学习_13

Unet++(pytorch实现)_机器学习_14

Unet++(pytorch实现)_python_15

Unet++(pytorch实现)_人工智能_16

Unet++(pytorch实现)_python_17

Unet++(pytorch实现)_python_18

Unet++(pytorch实现)_python_19

训练结果

Unet++(pytorch实现)_人工智能_20


机器学习算法AI大数据技术

 搜索公众号添加: datanlp

Unet++(pytorch实现)_python_21