ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

解析caffe生成的caffemodel文件

2022-02-07 10:02:55  阅读:207  来源: 互联网

标签:include b622 caffe test caffemodel 解析 data


要想了解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

标签:include,b622,caffe,test,caffemodel,解析,data
来源: https://www.cnblogs.com/Ph-one/p/15867031.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有