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

基于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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Halostudio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值