本文主要是介绍Unet++(pytorch实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Unet++网络
Dense connection
Unet++继承了Unet的结构,同时又借鉴了DenseNet的稠密连接方式(图1中各种分支)。
作者通过各层之间的稠密连接,互相连接起来,就像Denset那样,前前后后每一个模块互相作用,每一个模块都能看到彼此,那对彼此互相熟悉,分割效果自然就会变好。
在实际分割中,一次次的下采样自然会丢掉一些细节特征,在Unet中是使用skip connection来恢复这些细节,但能否做的更好呢?Unet++就给出了答案,这种稠密连接的方式,每一层都尽量多的保存这种细节信息和全局信息,一层层之间架起桥梁互相沟通,最后共享给最后一层,实现全局信息和局部信息的保留和重构。
deep supervision
当然,简单的将各个模块连接起来是会实现很好的效果。而我们又能发现,一个Unet++其实是很多个不同深度的Unet++叠加。那么,每一个深度的Unet++是不是就都可以输出一个loss?答案自然是可以的。
所以,作者提出了deep supervision,也就是监督每一个深度的Unet++的输出,通过一定的方式来叠加Loss(比如加权的方式),这样就得到了一个经由1、2、3、4层的Unet++的加权Loss(图2 不同深度Unet++融合)。
那么,deep supervision又有什么用呢?-剪枝
既然Unet++由多个不同深度的Unet++叠加起来,那么随意去掉一层,前向传播的梯度不会受到任何变化,但你发现Unet++第三个输出的效果和第四个输出效果差不多时,那就可以毫不犹豫删去4层深度的Unet++。比如,直接删去图3中棕色部分,就可以实现剪枝。这样,就得到了更加轻量化的网络。
模型复现
Unet++
为了更直观一些,我把代码中的所有符号都和网络结构中对应上了。
数据集准备
数据集使用Camvid数据集,可在CamVid数据集的创建和使用-pytorch中参考构建方法。
https://blog.csdn.net/yumaomi/article/details/124786867
这篇关于Unet++(pytorch实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!