用自制数据训练修改过的基于caffe的fcn网络时loss在一个较大值震荡的解决方法

来源:互联网 发布:剑灵天族女捏脸数据韩 编辑:程序博客网 时间:2024/06/06 03:29

基于caffe的fcn网络训练自制数据时loss在一个较大值震荡的解决方法

用自己数据训练修改后的fcn网络,可能会遇到loss在一个较大值附近震荡。通过查询资料和借助网络资源,初步有两个比较好的方法来处理这个问题;训练网络时初始化权重对训练的影响比较大。做过这样的测试,训练网络数据利用默认初始化方式,loss降到一个较大值附近就不下降了。通过已有网络赋值,或者其他初始化权重方式可以获得不错的训练效果。具体操作如下

1.就是利用已有的网络来初始化网络权重,具体修改solve.py文件是


import caffe
import surgery, score


import numpy as np
import os
import sys


try:
    import setproctitle
    setproctitle.setproctitle(os.path.basename(os.getcwd()))
except:
    pass


weights = '../ilsvrc-nets/fcn32s-heavy-pascal.caffemodel'


vgg_weights = '../ilsvrc-nets/vgg16-fcn.caffemodel'  
vgg_proto = '../ilsvrc-nets/VGG_ILSVRC_16_layers_deploy.prototxt'  
weights = '../ilsvrc-nets/vgg16-fcn.caffemodel' 


# init
caffe.set_device(0)
caffe.set_mode_gpu()


solver = caffe.SGDSolver('solver.prototxt')
#solver.net.copy_from(weights)
vgg_net=caffe.Net(vgg_proto,vgg_weights,caffe.TRAIN)  
surgery.transplant(solver.net,vgg_net)  
del vgg_net 


# surgeries
interp_layers = [k for k in solver.net.params.keys() if 'up' in k]
surgery.interp(solver.net, interp_layers)


# scoring
val = np.loadtxt('F:/data/paopao/seg11valid.txt', dtype=str)


for _ in range(25):
    solver.step(4000)
    score.seg_tests(solver, False, val, layer='score')


2.在net.py修改网络初始化权重方法,我选用的是具体是

weight_filler=dict(type='xavier')

bias_filler=dict(type='constant',value=0)

Deconvolution层用的是

weight_filler=dict(type='gaussian',std=0.01),

bias_filler=dict(type='constant',value=0.1),

之后再生成训练和测试的prototxt文件。

网络中有个offset的计算参考

https://zhuanlan.zhihu.com/p/22976342


修改的文件放在了这里,需要的可以下载:

http://download.csdn.net/download/xuezhi1001/10102789

阅读全文
0 0