在Python中不安装caffe的情况下从.caffemodel中提取权重

2024-05-06 11:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种相对简单的方法可以从Caffe Zoo中的许多预训练模型中提取Python中的权重而不使用Caffe(也不使用pyCaffe)?i、 e.将.caffemodel解析为hdf5/numpy或Python可以读取的任何格式?

所有的答案我都用C++代码和咖啡课或PiffCad。 我看过pycaffe的代码,看起来你真的需要caffe来理解二进制代码,这是唯一的解决方案吗?


Tags: 方法答案代码模型numpy格式caffehdf5
3条回答

现在,caffe可以以两种格式保存权重:BINARYPROTO或HDF5。扩展名为.caffemodel的二进制权重文件采用BINARYPROTO格式,而扩展名为.caffemodel.h5的二进制权重文件采用HDF5格式。由于HDF5格式最近被引入caffe,我希望您在“模型动物园”中遇到的大多数模型都是更“传统”的BINARYPROTO格式。

如果权重以HDF5格式存储,则可以使用h5py包来挑选权重。

但是,BINARYPROTO格式基于由^{}定义的google协议缓冲区格式的二进制序列化。我不是协议缓冲区方面的专家,但我怀疑如果不显式地“编译”protobuf定义文件(caffe构建的一部分),您将很难破译二进制文件。

我想最简单的方法是安装CalpE和使用Python/C++接口。你为什么不这么做?

我刚才不得不解决那个问题。假设你有一个.caffemodel(二进制proto格式),结果很简单。

  1. 下载最新的caffe.proto

  2. 编译到python库: protoc——python_out=。咖啡原型机

  3. 导入和分析

下面的示例代码

import numpy as np
import sys, os
import argparse
import caffe_pb2 as cq

f = open('VGG_ILSVRC_16_layers.caffemodel', 'r')
cq2 = cq.NetParameter()
cq2.ParseFromString(f.read())
f.close()
print "name 1st layer: " + cq2.layers[0].name 

为我制作:

name 1st layer: conv1_1

显然你可以从你的对象中提取任何你想要的东西。我只是打印了第一层的名字作为例子。 另外,您的模型可能是用layer s数组(不推荐使用)或layer数组(没有)来表示层,但是您得到了要点。

碰巧,ethereon制作了一个名为caffe-tensorflow的很棒的库来将caffe模型转换为Tensorflow代码,但这还不是全部!它还允许用户将.caffemodel文件转换为.npy文件,而无需构建pycaffe!它测试是否构建了caffe,如果没有,则返回到纯google protobuf实现。

相关问题 更多 >