Github | github.com/wonderseen
Owner | wonderseen
Univ. | Xiamen University
Date | 2018.1.26
一开始认为fcn是一种回归过程,设计模型收敛比较慢,后来想通了,fcn本质还是分类过程。想通这点,写训练网络网络就比较轻松了。以下是手写图像语义分割网络的小结。
提升训练样本的读取速率:
对于数据的预处理常常会在get batch data的时候浪费时间,
如果是在内存能够承受的范围内,采用下述方法,可以大大加快训练速度:
方法1.
- 先加载数据到内存中,包括预处理过程。不要懒惰,虽然这种方法要花时间写一下脚本,但是那牺牲的十几分中绝对可以帮助你节省几个小时的训练时间。
方法2:
- 使用pipeline、直接用IO口queeze方法从文件地址读取数据; 但是这种放那方法有局限性,facenet采用了后者方法。这种从文件地址IO读取的方法只能用循环队列读jpg/png,其他pgm、txt、bin等都无法直接读取,需要做其他数据预处理才能读取。
方法3:
- 对于bin文件的输入输出快速方法,可以自己写用BinaryDbReader(参考hand3d)
交叉熵损失函数的应用:
- 在使用交叉熵求解损失函数softmax_cross_entropy_with_logits时,如果输入的logits维度非platten的[如:shape = (-1,3000)],而是经过折叠的shape = (-1, 50, 60),得到的交叉熵计算输出结果是全部元素都为0。可以简单的从源码输出解释:根据softmax_cross_entropy_with_logits源码分析,loss输出的shape是[batch_size, 分类数].
- 交叉熵运算过程及比较
- tf4种交叉熵区别:
tensorflow的softmax_cross_entropy_with_logits运行过程 - 总结softmax_cross_entropy_with_logits求损失函数过程,如有错请指正:
- tf4种交叉熵区别:
预测结果的处理:
softmax_cross_entropy_with_logits过程,先softmax对logist经过指数归一。所以在softmax_cross_entropy_with_logits中输入的logits虽然可以不是标准概率分布,但是建议先人工做缩放,否则指数计算量成本太大。
全连接不能少:
如果是用浅层网络做语义分割,全连接层的编码作用比较重要,尝试用卷积代替,效果很差。而且对于整副图像的像素标记label建议做标准化,否则loss太容易发散,难以控制。但是对于深层网络,比如u-net,不仅够深,而且特征图由细到粗再到细,结构合理,仅使用上下卷积层已经可以获得好的结果,并且保留了空间位置信息,这种情况下是可以不用全连接层的。
合理设置低维结构:
如果电脑配置不够高,像我只有一块gpu,就要合理设计网络结构。宁可多几层低维的隐藏层,也不要太高维度的中间层。假设原来某中间层的维度设置在256,提升到了512,对内存的消耗可不止2倍,为了提高鲁棒性,后续再接一层512。内存成本就是4倍的增长,时间成本上前向和后向传播的过程的迭代寻址耗时增加更多,如此训练效率是极低的。
上采样简单替代:
上采样不一定要采用卷积进行(全连接->全连接维->折叠),其实在scale控制在一定比例的情况下,分辨率变化不大,用简单的三线性等方式resize也可以达到效果,事实上,hand3d里就是这样简单处理的。有视觉功底的同学,结合fcn,实际可以达到很理想的效果。