caffe实践总结
- 定义模型
- 写solver文件需要注意的点
需要导入的包:
声明solver结构from caffe.proto import caffe_pb2
保存solvers = caffe_pb2.SolverParameter()
参数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 - 使用模型
构建网络:
将binMean文件转化为npyMean#需要指定: #模型定义文件(.prototxt)、模型参数文件 (.caffemodel) net = caffe.Net(model_def, model_weights, caffe.TEST)
将数据转变为caffe中需要的格式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)
下面是将一张图片喂给网络进行预测的代码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