caffe实践总结
定义模型写solver文件需要注意的点 需要导入的包: from caffe.proto import caffe_pb2
声明solver结构 s = caffe_pb2.SolverParameter()
保存solver with open(slover_file, 'w') as f:
f.wirte(str(s))
参数 net / {train_net/test_net}:指定定义模型的prototxt文件 test_iter:这个次数和测试批量大小的乘积应该为测试集的大小 test_interval:迭代test_interval次进行一次测试 display:每迭代display次显示一次结果 max_iter:最大迭代次数 lr_policy:学习率策略 caffe框架中的策略包括:fixed、step、exp、inv、multistep、poly、sigmoid 1、找最佳学习率:从学习率从小到大变化(每个epoch后提高学习率),过程中寻找最佳学习率 此方法在遇到鞍点时损失很难减少 2、无需找最佳学习率,即无需固定学习速率并随着时间的推移令它下降。可以根据一些周期函数f来改变每次迭代的学习速率,显然,每个epoch的迭代次数是固定的,这就让学习速率在合理的边界值之间周期变化 deploy.prototxt:用来定义模型结构 采用这种侧率的常见方法有:三角法(最小值最大值差不变/减半)、预热重启(Warm Restarts)随机梯度下降 解释预热重启:该方法采用余弦函数作为周期函数,并在每个周期的最大值时重新开始学习率周期,之所以是预热重启,是由于每次重启不是从头开始,而是由模型在最后一步收敛的参数决定的。 gamma:学习率调整过程中的一个参数 momentum:动量参数 weight_decay:权重衰减,可以防止过拟合 snapshot:迭代多少次存储一次模型 anapshot_prefix: slover_mode:GPU/CPU device_id:GPU id type:学习策略,如梯度下降fine_tuning: 差别性的精调(差异学习):在训练期间为网络设置不同的学习速率。 前几个层通常会包含非常细微的数据细节,比如线和边,我们一般不希望改变这些细节并想保留它的信息启动一个caffe训练需要的文件: train_val.prototxt solver.prototxt:假设在路径path下 运行:/caffe-master/build/tools/caffe --solver=path/solver.prototxt使用模型 构建网络: #需要指定:
#模型定义文件(.prototxt)、模型参数文件 (.caffemodel)
net = caffe.Net(model_def, model_weights, caffe.TEST)
将binMean文件转化为npyMean def convert_mean(binMean, npyMean):
blob = caffe.proto.caffe_pb2.BlobProto()
bin_mean = open(binMean, 'rb').read()
blob.ParseFromString(bin_mean)
arr = np.array(caffe.io.blobproto_to_array(blob))
npy_mean = arr[0]
np.save(npyMean, npy_mean)
将数据转变为caffe中需要的格式 transformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape})
transformer.set_transpose('data',(2,0,1))#改变维度顺序:例如将(277,277,3)改为(3,277,277)
transformer.set_mean('data',np.load(npyMean).mean(1).mean(1))
transformer.set_raw_scale('data',255)
transformer.set_channel_swap('data',(2,1,0))#caffe中通道顺序为GBR
下面是将一张图片喂给网络进行预测的代码 image=caffe. io. load_image(data_root +' tst/'+image_name)#caffe中加载一张图片的代码
transformed_image=transformer. preprocess(' data', image)#按预设的转换,将图片转换为caffe需要的格式
net. blobs[' data']. data[...]=transformed_image net. blobs[' data']. reshape(1,3,224,224)#改变图片尺寸,符合网络的输入
output=net. forward()#前向传播
output_prod=net. blobs[' prob']. data[e]#提取结果
caffe能使用几种数据源 数据库:LevelDB、LMDB 数据层为Data 必须配置的参数有: source:数据库名称(带路径) batch_size:每次处理的数据个数(受内存限制) 可选参数: rand_skip:在开始的时候路过某个数据的输入。在异步SGD很有用 backend:选择是采用LevelDB还是LMDB 磁盘:HDF5 内存 图片 windows