解析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