caffe相关面试题

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值