这篇是一个汇总的博客:
主要参考:
1)http://wentaoma.com/2016/08/10/caffe-python-common-api-reference/
2)http://blog.csdn.net/c406495762/article/details/70306550
3)https://stackoverflow.com/questions/41344168/what-is-a-python-layer-in-caffe
4)在写Innerproduct层(全连接层)的时候,因为该层定义了两个param{lr_mult:1},因此在python编程环境当中会导致变量冲突
看了如下链接得到解决:https://github.com/gombru/pycaffeCNNTemplate/blob/master/create_net.py
frozen_weight_param = dict(lr_mult=0, decay_mult=0) |
frozen_bias_param = dict(lr_mult=0, decay_mult=0) |
weight_param = dict(lr_mult=1, decay_mult=1) |
bias_param = dict(lr_mult=2, decay_mult=0) |
#Attention to this multipliers |
boosted_weight_param = dict(lr_mult=10, decay_mult=1) |
boosted_bias_param = dict(lr_mult=20, decay_mult=0) |
learned_param = [weight_param, bias_param] |
boosted_param = [boosted_weight_param, boosted_bias_param] |
net.ip1 = caffe.layers.InnerProduct(net.train_data, param=froozen_param,#这里通过定义一个list,来整合到param的字典 num_output=100, weight_filler=dict(type='xavier'),bias_filler=dict(type='constant'))
将这些变量直接变成list形式
-------------------------------------------------------------------------------------------------
基于pycaffe接口生成《深度学习——caffe之经典模型详解与实战》P297的fk_train.prototxt
这里要进行说明:由于水平有限,不能生成train_val.prototxt,只能分别生成train.prototxt以及val.prototxt,主要原因是:在train以及val的变量当中遇到了同名变量问题:
net.data以及net.label,都表示train以及val文件,导致python当中第二层不能准确识别,因此我把它拆分成了两个文件:train.prototxt以及val.prototxt
import caffe
# from caffe import layers as L
# from caffe import params as P
frozen_weight_param = dict(lr_mult=1)#权重
frozen_bias_param = dict(lr_mult=2)#偏执值
froozen_param = [frozen_weight_param, frozen_bias_param]
def fk_layer():
net=caffe.NetSpec()
net.train_data,net.train_label=caffe.layers.HDF5Data(
ntop=2,#因为是两个输出值:net.train_data,net.train_label,因此需要指定ntop=2
name='fk-data',#这里指定的是层的名字
hdf5_data_param={
'source': './train.txt',
'batch_size': 64
},
include={
'phase': caffe.TRAIN
})
# net.val_data,net.val_label=caffe.layers.HDF5Data(
# ntop=2,
# name='fk-val',
# hdf5_data_param={
# 'source': './val.txt',
# 'batch_size': 100
# },
# include={
# 'phase': caffe.TEST
# })
net.ip1 = caffe.layers.InnerProduct(net.train_data,
param=froozen_param,#这里通过定义一个list,来整合到param的字典,也就是:param=[]
num_output=100,
weight_filler=dict(type='xavier'),bias_filler=dict(type='constant'))
net.relu1 = caffe.layers.ReLU(net.ip1
,in_place=True#如果不加这句话或者设置为false,那么该层的bottom是ip1,top是relu;如果加上这句话的话,bottom和top都是ip1
)
net.ip2=caffe.layers.InnerProduct(net.ip1,param=froozen_param,num_output=30, weight_filler=dict(type='xavier'),bias_filler=dict(type='constant'))
net.loss=caffe.layers.EuclideanLoss(net.ip2,net.train_label)
return net.to_proto()
with open('fk_train.prototxt', 'w') as f:
f.write(str(fk_layer()))