caffe之保存和读入caffmodel文件

一、caffe如何将卷积层或网络层的权值blob给保存下来的?

首先Solver类在Step(intiters)中调用了Snapshot()函数,voidSolver<Dtype>::Snapshot()函数中能看到保存caffemodel文件的重要函数 SnapshotToBinaryProto(),该函数详细如下:


可看到该函数里初始化了NetParameternet_param ; 之后调用net_->ToProto(&net_param,param_.snapshot_diff())进行初始化, 该函数详细如下:


在该函数中初始化了NetParameter 类对象net_param, 可看出net_param调用了 add_layer()函数将net_的所有层的参数作了处理,可理解为所有层的参数均加载到这个net_param, 采用遍历的方法使各个层layers_[i]调用 ToProto(layer_param,write_diff); write_diff bool类型,表示是否需要保存偏差;看看各个层的 ToProto函数:


可看到在这个函数里,各个层的 layer_param又将使用add_blobs()将 层里的所有blob给加载进去,看看 blobs_[i]ToProto函数:

可看到指向BlobProto类指针的proto(来自layer_paramadd_blobs()) 将会通过for循环的方式调用 add_double_data(data_vec[i])blobdata数组加载起来.

综上所述,一个net_的所有层里的所有blobdata数据将被用于初始化 NetParameter类对象net_param, 又调用了WriteProtoToBinaryFile(net_param,model_filename) 将其中重要的权参保存为caffemodel文件,如下所示:

实质是调用了下面这个,最终保存为caffemodel文件


caffe是如何读入caffemodel文件的?

caffemodel文件通常被用于初始化Net类对象,使用Net类中的相关函数如下:

对于caffemodel文件,将被调用voidCopyTrainedLayersFromBinaryProto(const string trained_filename);该函数如下:

可看到内部调用了ReadNetParamsFromBinaryFileOrDie(trained_filename,&param) 初始化了

NetParameter类对象param;param 又将被用于初始化Net类的中各个层的blob;

先看看ReadNetParamsFromBinaryFileOrDie(trained_filename,&param) ,定义在 upgrade_proto.cpp:

内部主要调用了ReadProtoFromBinaryFile(param_file,param) , 该函数具体如下:

看看定义在io.cpp的函数ReadProtoFromBinaryFile:


大致也即是从caffemodel文件写入proto, 回到voidCopyTrainedLayersFromBinaryProto(const string trained_filename)函数:

看下另一个函数CopyTrainedLayersFrom(param)的实现:


可由该函数得到,已被初始化的NetParameter类对象 param将被用于初始化Net类中各个层的blob;具体方法是先遍历 param中的各个LayerParameter对象 ,先找到名字相同的层的层id,再获取这个id号的层的blob,再判断该blob的形状是否与LayerParameter对象中的blob一致,如果一致则开始调用FromProto复制,否则会报错,FromProto函数如下:


Net类的各个层初始化的时候均会调用setup函数,在这个时候会对blobs_进行判断,如果是已初始化的则不进行权值参数填充,例如卷积层,base_conv_layer.cpp中的LayerSetUp函数中有:



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值