FCN经验总结

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)

交叉熵损失函数的应用:

  1. 在使用交叉熵求解损失函数softmax_cross_entropy_with_logits时,如果输入的logits维度非platten的[如:shape = (-1,3000)],而是经过折叠的shape = (-1, 50, 60),得到的交叉熵计算输出结果是全部元素都为0。可以简单的从源码输出解释:根据softmax_cross_entropy_with_logits源码分析,loss输出的shape是[batch_size, 分类数].
  2. 交叉熵运算过程及比较

预测结果的处理:

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,实际可以达到很理想的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值