前言

  • 本实验采用3D深度监督网络(DSN)对肝脏进行分割,因为使用3D的肝脏数据进行分割可以很好的体积上下文信息。
  • DSN的大致学习过程是:基于CNN,为了应对梯度消失和模型辨别能力问题,在隐藏层加入一些额外的监督来抵消梯度消失的不利影响。具体而言,使用一些额外的反卷积层来扩展一些低级和中级特征向量。然后使用softmax层来获得用于计算分类误差的dense预测(监督层的预测)。利用从这些分支预测和最后输出层得到的梯度,可以有效地减轻梯度消失的影响。
  • deeply- supervision 的优点包括:
    1. 能够减轻梯度爆炸或梯度消失,收敛速度更快(辅助 loss 将误差直接注入中间层,有点类似于 resnet 的机制,不同的是 loss 来源不同 );
    2. 辅助 loss 起到 regularization 的作用.

数据问题

one_hot处理

  • 在开始训练DSN网络之前要对数据进行一些预处理,首先将标签数据转成0 1值,即前景的像素值为1,背景的像素值为0。因为再算loss的时候,要将金标准标签转成one_hot值,想把标签处理成0 1方便做**one_hot处理。**
  • 简单解释一下什么是one_hot,one-hot code也称独热码,通常用于分类任务中作为最后的FC层的输出。在机器学习中对于离散型的分类型的数据,需要对其进行数字化,比如说对性别这一属性,只有男女两种值,用数字化表达,指定男性为0,女性为1,那么一个特征向量(1,0,1),转换成独热码(one_hot)就变成([1,0],[0,1],[1,0])。

内存不足问题

  • 因为3D肝脏数据,数据量庞大,如果一次性把整组的数据都加载进去可能导致计算内存不足的问题,所以在训练之前需要减少训练数据的size,本实验中将所有的数据都转换成了[16,512,512]大小。
  • 还有也是因为内存不足的问题,再加载数据的时候用到了yield迭代器,需要注意的是,它yield是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码开始执行。详细理解yield可以参考文章《彻底理解python中的yeild

代码解读

  • 网络的架构大致如下:
    layers = [['block0', [['conv', [9, 9, 7, 1, 8], [1, 1, 1, 1, 1], 'SAME', 0.7]]],
    ['block1', [['conv', [9, 9, 7, 8, 16], [1, 1, 1, 1, 1], 'SAME', 0.7],
    ['maxpool', [1, 2, 2, 2, 1], [1, 2, 2, 2, 1], 'SAME']]],
    ['block2', [['conv', [7, 7, 5, 16, 32], [1, 1, 1, 1, 1], 'SAME', 0.7]]],
    ['block3', [['conv', [7, 7, 5, 32, 32], [1, 1, 1, 1, 1], 'SAME', 0.7],
    ['maxpool', [1, 2, 2, 2, 1], [1, 2, 2, 2, 1], 'SAME']], ],
    ['block4', [['conv', [5, 5, 3, 32, 32], [1, 1, 1, 1, 1], 'SAME', 0.7]]],
    ['block5', [['conv', [1, 1, 1, 32, 32], [1, 1, 1, 1, 1], 'SAME', 0.7]]],
    ['block6', [['deconv', [3, 3, 3, 32, 32], [1, 2, 2, 2, 1], 'SAME']]],
    ['block7', [['deconv', [3, 3, 3, 2, 32], [1, 2, 2, 2, 1], 'SAME']]],
    ]
  • ['block0', [['conv', [9, 9, 7, 1, 8], [1, 1, 1, 1, 1], 'SAME', 0.7]]]中,[9, 9, 7, 1, 8]表示卷积核的大小为[9,9,7],当前深度为1,卷积核的深度为7.SAME表示在卷积之前加了padding是特征图在卷积前后特征不变。0.7是dropout系数。

整理并给出代码