解析caffe生成的caffemodel文件

要想了解caffe生成的caffemodel文件里的内容,我们就需要解析.caffemodel文件(caffemodel里不仅存储了权重和偏置等信息,还存储了整个训练网络的结构信息,即.prototxt信息,当然solver.prototxt信息是看不见的)。

1.单独查看

要是只是想看看权重信息正不正确(有时候学习率设置的太大,可能会导致梯度爆炸,但是又不确定的情况下,可以查看下caffemodel文件中的权重是否是nan,是的话说明梯度爆炸了),可以通过caffe中的python接口来快速查看,基本代码如下:

    import caffe
    import numpy as np
     
    deploy='/home/b622/caffe-action_recog/evaluation/prototxt/pspnet101_VOC2012_deploy.prototxt'   
    model='/media/b622/My Passport/pspnet101resultbn/train_iter_100.caffemodel'
     
    net = caffe.Net(deploy,model,caffe.TEST)    
    w=net.params['conv1_1_3x3_s2/bn'][0].data   
    print w

其中deploy后面的是你自己的网络的deploy.prototxt文件路径;model是训练好的caffemodel文件的路径;net.params中的'conv1_1_3x3_s2/bn'是deploy.prototxt文件中某一层的名字,即该层的'name:'后面的内容,caffe是根据这个名字来索引该层的权重信息的(我这里用的是PSPNet网络中的某一层)。

2.整体输出

如果想输出caffemodel中所有的信息,可以通过以下的小程序来解析:

(1)定义主函数文件

打开终端输入以下命令,创建一个.cpp文件:

gedit test.cpp

在弹出的文件中写入以下代码,并保存:

    #include <caffe/caffe.hpp>
    #include <google/protobuf/io/coded_stream.h>
    #include <google/protobuf/io/zero_copy_stream_impl.h>
    #include <google/protobuf/text_format.h>
    #include <algorithm>
    #include <iosfwd>
    #include <memory>
    #include <string>
    #include <utility>
    #include <vector>
    #include <iostream>
    #include "caffe/common.hpp"
    #include "caffe/proto/caffe.pb.h"
    #include "caffe/util/io.hpp"
     
    using namespace caffe;
    using namespace std;
    using google::protobuf::io::FileInputStream;
    using google::protobuf::io::FileOutputStream;
    using google::protobuf::io::ZeroCopyInputStream;
    using google::protobuf::io::CodedInputStream;
    using google::protobuf::io::ZeroCopyOutputStream;
    using google::protobuf::io::CodedOutputStream;
    using google::protobuf::Message;
     
    int main()
    {
        NetParameter proto;
        ReadProtoFromBinaryFile("/home/b622/caffe-action_recog/evaluation/pspnet101_VOC2012.caffemodel", &proto);
        WriteProtoToTextFile(proto, "test.txt");
        return 0;
    }

其中ReadProtoFromBinaryFile()为读取函数,WriteProtoToTextFile()为写入函数。

(2)定义CMakeLists.txt文件(注意不要改文件名)

    cmake_minimum_required (VERSION 2.8)
     
    project (test)
     
    add_executable(test test.cpp)
     
    include_directories ( /home/b622/caffe-action_recog/include
        /usr/local/include
        /usr/local/cuda/include
        /usr/include )
     
    target_link_libraries(test
        /home/b622/caffe-action_recog/build/lib/libcaffe.so
        /usr/lib/x86_64-linux-gnu/libglog.so
        /usr/lib/x86_64-linux-gnu/libboost_system.so
        )

只需要将上面的/home/b622/PSPNet-master/include和/home/b622/PSPNet-master/build/lib/libcaffe.so替换成你自己的caffe中的include和libcaffe.so的路径即可。

将上述两个文件放在同一文件夹下,然后依次输入以下命令进行编译:

    cmake .
    make

如下图所示:

如果在make过程中出现以下错误:

    /home/b622/caffe-action_recog/include/caffe/blob.hpp:9:34: fatal error: caffe/proto/caffe.pb.h: No such file or directory
    compilation terminated.
    CMakeFiles/test.dir/build.make:62: recipe for target 'CMakeFiles/test.dir/test.cpp.o' failed
    make[2]: *** [CMakeFiles/test.dir/test.cpp.o] Error 1
    CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/test.dir/all' failed
    make[1]: *** [CMakeFiles/test.dir/all] Error 2
    Makefile:83: recipe for target 'all' failed
    make: *** [all] Error 2

则需要手动编译出caffe.pb.h文件,打开终端输入以下命令:

protoc --cpp_out=/home/b622/caffe-action_recog/include/caffe/proto caffe.proto

如下图所示:

成功后会在caffe-action_recog/include/caffe/proto文件夹下生成caffe.pb.h文件,如下图

完成后再次make,即可通过,如果再出现其他错误,请自行百度。

生成的文件如下:

在终端输入以下命令,生成解析出的test.txt文档:

./test

注:先cd到test执行文件的根目录下,在输入上述语句。

成功后,可以查看tets.txt文件中的内容,我解析的是官方给的PSPNet网络模型,如下(部分)所示:

    name: ""
    layer {
      name: "data"
      type: "ImageSegData"
      top: "data"
      top: "label"
      include {
        phase: TRAIN
      }
      phase: TRAIN
      transform_param {
        mirror: true
        crop_size: 473
        mean_value: 103.939
        mean_value: 116.779
        mean_value: 123.68
        8: 0x3f000000
        8: 0x40000000
        9: 0xc1200000
        9: 0x41200000
        10: 1
      }
      image_data_param {
        source: "/mnt/lustre/zhaohengshuang/dataset/VOC2012/list/trainval.txt"
        batch_size: 16
        shuffle: true
        root_folder: "/mnt/lustre/zhaohengshuang/dataset/VOC2012"
        16: 2
      }
    }
    layer {
      name: "label_gather"
      type: "Gather"
      bottom: "label"
      top: "label_gather"
      phase: TRAIN
    }
    layer {
      name: "conv1_1_3x3_s2"
      type: "ConvolutionData"
      bottom: "data"
      top: "conv1_1_3x3_s2"
      param {
        lr_mult: 1
        decay_mult: 1
      }
      blobs {
        data: 0.0022265632
        data: 0.0063848812
        data: -0.021314347
        data: 0.0087224049
        data: -0.0017450363
        data: -0.040702991
        data: 0.040957987
        data: 0.030024877
        data: -0.00040234922
        data: 0.035385851
        data: 0.03061888
        data: 0.00975236
        data: 0.029203681
        data: 0.027859332
        data: -0.02282569
        data: 0.051132251
        data: 0.050982021
        data: 0.028273048
        data: 0.00045456921
        data: 0.0046192827
        data: -0.014982899
        data: 0.0010559497
        data: -0.01121246
        data: -0.043569062
        data: 0.018522989
        data: 0.013444615
        data: -0.012451748
        data: -0.0035903456
        data: -0.0036976787
        data: -0.0086726872
        data: 0.013544118
        data: 0.039940353
        data: 0.0332526
        data: 0.0174512
        data: 0.030373706
        data: 0.015946979
        data: -0.03056127
        data: -0.077426851
        data: -0.064679071
        data: -0.049140476
        data: -0.12691125
        data: -0.15443584
        data: -0.067412965
        data: -0.13174506
        data: -0.13033487
        data: -0.04345879
        data: -0.022715034
        data: 0.033402845
        data: -0.0118775
        data: 0.032909606
        data: 0.031529181
        data: 0.0028268516
        data: 0.030321535
        data: 0.055880059
        data: -0.012543317
        data: 0.29960331
        data: -0.26908255
        data: -0.060308661
        data: 0.053303137
        data: -0.035357445
        data: -0.027739143
        data: 0.013819358
        data: 0.028950721
        data: 0.0096227145
        data: 0.600619
        data: -0.47760749
        data: -0.085985318
        data: 0.12866144
        data: -0.085491486
        data: -0.069523379
        data: 0.0065062055
        data: 0.02735726
        data: -0.011153187
        data: 0.43719363
        data: -0.38543427
        data: -0.082773171
        data: 0.07562118
        data: -0.070219189
        data: -0.041084472
        data: 0.01311215
        data: 0.036830757
        data: 0.024847485
        data: -0.0090860045
        data: 0.051152926
        data: 0.03113804
        data: 0.022111731
        data: 0.056659479
        data: 0.087109923
        data: 0.069432892
        data: -0.004762331
        data: 0.0077367546
        data: -0.11521299
        data: -0.12150885


原文链接:https://blog.csdn.net/qq_21368481/article/details/81274506

上一篇:caffe 模型训练超参数配置


下一篇:终端天线—6.PWB调试—Loop