前言
最终结果是进决赛拿了二等奖
话说一等奖分数比我低很多诶,凭啥他一等= =
这个比赛其实从头水到尾,都没干啥事…
不过还是挑一些重点的有价值的东西讲讲
很多比赛总结其实一直好像是一个比较流水线的报告
从预处理到最后的集成
即便trick百出,仍似千篇一律
但我仍然喜欢有人能相对于trick提出更多的问题
下面只讲一下个人感觉有价值的东西
就不千篇一律的从数据预处理数据增强的一步步介绍了
比赛介绍
这个比赛是一个3D医学图像分割问题
目标是对大脑中的左右海马体进行分割
数据特点
132组样本
3D图像,4D张量,5D一个batchsize
十分吃显存
卷积核数稍微大一点就给你爆0.1T显存
训练不稳定
模型对海马体的差异十分敏感,不同的海马体dice loss差距对比有0.85 , 0.42
验证集阈值浮动
由于模型对海马体差异十分敏感
所以所以验证集分数经常会从几十跳成0
海马体强度不均
一些海马体体素强度在0至200的范围,部分在0至两千的范围
问题的解决方式
吃显存是真的没法子了
只能减通道数
毕竟换tesla P40是不可能的,这辈子都不可能换的
写插值压小图片又不想写,只能随随便便改改卷积核数才适合我
训练不稳定和验证集阈值浮动提供几个很棒的解决方案
- 改batchsize
将batchsize设置为8问题就被缓解很多了,简单粗暴,但要牺牲一些通道数 - 将sigmoid激活改成tanh + score map MinMax归一化 + diceLoss
这个方式超级显著,可以说完全解决了这个问题,小batchsize大概要几千轮的样子才能让loss和验证集稳定
这个配合8 batchsize在仅仅600轮即可收敛到88的分数
score map MinMax归一化是利用了图片中必定存在海马体的先验信息,即必定存在正例体素 - 一堆后处理trick(基于梯度,类间方差,类内方差,knn+先验等
在这里我创了很多方法,这个方法有点慢,效果是有的,不如2+1 - ConvLSTM
将3D图片的一个轴作为循环轴,利用循环单元拟合,这种结构契合了海马体的形态变化
这个结构分数真的很稳,鲁棒性棒棒哒 - 在像素级的任务中尽量少用Pool,因为像素级的不对齐任务似乎还是有点影响的
summary
其他的事不想说了,毕竟水过来的,很不认真hh
一些数据增强,预处理都不想说了
我的几个模型结构也懒得聊,看多了只觉得模型结构要么是拍脑袋拿到的,要么是暴力搜素
毕竟缺乏理论性,马后炮式的分析结构是很抗拒的