这周主要尝试的是裁剪中间320x320区域,输入网络后使用focal loss作为loss function进行训练。一开始也尝试了BCE loss,因为**兄发的focal loss有一些小小的python版本兼容问题,而我之前在GitHub上看的一个UNet是用BCE loss,然后就一边弄focal loss的代码一边服务器上先跑着torch自带的BCE loss看看效果。但是BCE loss的结果出来并不是很好,后面就都用focal loss跑了

尝试了学习率lr=0.0001和lr=0.00001,因为图片被裁剪的相对原图比较小,所以也尝试了batch size=8的训练。在此之前我只知道这个超参数是指每次喂入网络的样本数,并不知道其对训练轮数有什么样的影响,查了相关资料后知道了epoch、 iteration和batch size这三者的关系:

  1. batch size:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batch size个样本训练;
  2. iteration:1个iteration等于使用batch size个样本训练一次;
  3. epoch:1个epoch等于使用训练集中的全部样本训练一次;

以及一篇比较好的讲解:
深度学习中的batch的大小对学习效果有何影响? - 程引的回答 - 知乎
https://www.zhihu.com/question/32673260/answer/71137399

最后训练出来lr=0.00001时后面迭代次数比较高的checkpoint比较好,下面是batch size=4时迭代第30000次的结果中的一张图,大部分分割结果都和下图类似:

16.png

lr=0.00001,batch size=4,第30000次迭代的模型经过验证在先前的22个验证集上的44个嗅球命中了43个,命中率已经达到了97.7%,唯一一个严格意义上说没有命中的嗅球是下面这张图左边的那个(输出图片编号是6):

6.png

但同时这张图也暴露出另一个问题:错误率。为了精确量化命中率和错误率,我写了一个python脚本来比对正确标签和预测值,这个脚本的基本思路是用dfs搜索分别找出预测值、正确值和预测值&正确值(两幅图按像素进行与运算 即这个像素是否预测正确)这三张图片的区域数,就可以判断出是否命中嗅球

对于这个表现较好的模型,结果如下:

1 focal loss: 0.001
  predict total:4    hit bulb:2/2    err:2
2 focal loss: 0.001
  predict total:3    hit bulb:2/2    err:1
3 focal loss: 0.001
  predict total:4    hit bulb:2/2    err:2
4 focal loss: 0.001
  predict total:3    hit bulb:2/2    err:1
5 focal loss: 0.001
  predict total:3    hit bulb:2/2    err:1
6 focal loss: 0.001
  predict total:7    hit bulb:2/2    err:5
7 focal loss: 0.001
  predict total:2    hit bulb:2/2    err:0
8 focal loss: 0.001
  predict total:2    hit bulb:2/2    err:0
9 focal loss: 0.001
  predict total:2    hit bulb:2/2    err:0
10 focal loss: 0.001
  predict total:2    hit bulb:2/2    err:0
11 focal loss: 0.001
  predict total:2    hit bulb:2/2    err:0
12 focal loss: 0.000
  predict total:2    hit bulb:2/2    err:0
13 focal loss: 0.001
  predict total:2    hit bulb:2/2    err:0
14 focal loss: 0.000
  predict total:3    hit bulb:1/1    err:2
15 focal loss: 0.000
  predict total:2    hit bulb:2/2    err:0
16 focal loss: 0.000
  predict total:2    hit bulb:2/2    err:0
17 focal loss: 0.001
  predict total:2    hit bulb:2/2    err:0
18 focal loss: 0.001
  predict total:2    hit bulb:2/2    err:0
19 focal loss: 0.000
  predict total:2    hit bulb:2/2    err:0
20 focal loss: 0.000
  predict total:2    hit bulb:2/2    err:0
21 focal loss: 0.000
  predict total:2    hit bulb:2/2    err:0
22 focal loss: 0.001
  predict total:2    hit bulb:2/2    err:0

嗅球的命中率基本没有问题了,但是有的时候会有误判现象,上面的图6依然是最严重的一个,不太清楚是因为组织特征和嗅球太像了还是因为图像噪点的原因。

感觉这周最大的收获是减小了学习率,增加了迭代次数,这样获得了更准确的模型。还有就是关于batch size的取值,在lr=0.00001的情况下我总共取了2、4、8三种batch size,这三者大约都是训练到第20000~30000轮左右的时候收敛变慢,focal loss稳定在0.001上下浮动。然后我都取第30000轮迭代模型,使用上面说的比对程序评估三种不同batch size的命中率和误判率,结果如下图,从左至右分别是batch size取2、4、8的情况:

Snipaste_2019-07-18_20-49-43.png

可以看到batch size=2和4的时候在先前验证集的22个图片上命中率都是100%,batch size=8时丢失了一个目标。但三者都有误判的情况,关于误判的解决,和面积准确率的像素级验证,可能是后面工作的重点。

误判的解决有个初步的简单想法就是取预测区域中面积最大的两块,因为嗅球最多只会在图像上出现两个,而小面积的预测值很有可能是噪点;而有关面积更准确的预测,打算先继续优化超参数训练模型,因为我感觉近几次训练的模型在分割面积精度上比之前要好上一些,然后到优化效果不明显的时候再辅以传统的图像处理算法精修嗅球那一块区域的具体面积,因为嗅球特征明显,周围有一圈白色组织环绕,配合已经分割出的比较精确的位置,经过传统算法的修剪应该可以达到一个比较好的效果。

标签: 深度学习

仅有一条评论

  1. syf syf

    初始验证集上做到了95%以上的正确率,还是非常开心的。今天聊天的时候老师说本来计划是到八月底达到70%的正确率的,哈哈~~ 这两周以来经历了很多,生活上工作上的变动;这学期也经历了很多,酸甜苦辣个中滋味,真是难以忘怀。本想写一篇流水账记录一下最近的点点滴滴,想想还是算了。谨以此周报,记录我初入职场的这半个月。

添加新评论