是否有一种相对简单的方法可以从Caffe Zoo WITHOUT CAFFE (也不是pyCaffe)中的许多预训练模型中提取Python中的权重?即将.caffemodel
解析为hdf5 / numpy或Python可以读取的任何格式?
我发现的所有答案都使用带有caffe类或Pycaffe的C ++代码。 我看过pycaffe的代码看起来你真的需要caffe来理解二进制是唯一的解决方案吗?
答案 0 :(得分:3)
如今,caffe可以将权重保存为两种格式:BINARYPROTO或HDF5。扩展名为.caffemodel
的二进制加权文件采用BINARYPROTO格式,而扩展名.caffemodel.h5
采用HDF5格式。由于最近将HDF5格式引入了caffe,我预计你目前在“模型动物园”中遇到的大多数模型都采用更“传统”的BINARYPROTO格式。
如果权重是以HDF5格式存储的,您可以使用h5py
包来挑选它们。
但是,BINARYPROTO格式基于由caffe.proto
定义的谷歌协议缓冲区格式的二进制序列化。我不是协议缓冲区的专家,但我怀疑你有一个真的很难解密二进制文件而没有明确地“编译”caffe.proto
protobuf定义文件(这是caffe build的一部分) )。
我认为选择权重的最简单方法是安装caffe并使用其python / C ++接口。你为什么不这样做?
答案 1 :(得分:3)
我刚才必须解决这个问题。假设你有一个.caffemodel(二进制原型格式),结果很简单。
下载最新的caffe.proto
编译成python库: protoc --python_out =。 caffe.proto
导入和解析
以下示例代码
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
显然,你可以从你的对象中提取你想要的任何东西。我刚刚打印了第一层的名称作为示例。 此外,您的模型可能在图层数组(已弃用)或图层(无's')数组中表示图层,但您可以获得要点。
答案 2 :(得分:2)
正如它所发生的那样,ethereon创建了一个名为caffe-tensorflow的精彩库来将caffe模型转换为Tensorflow代码,但这并非全部!它还允许用户将$var = $_POST['some'];
if($var (bla bla bla))
{ echo 'ok.'; } else { echo 'Error'; }
文件转换为.caffemodel
文件,而无需构建pycaffe!它测试是否构建了caffe,如果没有,它会回归纯粹的google protobuf实现。
答案 3 :(得分:1)
我不明白你为什么要在没有caffe / pycaffe的情况下这样做,也许你已经厌倦了在新机器上部署caffe?但由于caffemodel是特殊的二元数据类型的caffe,使用他人的工具不会让生活更轻松。
如果你坚持这样做,还有另一个框架:Mocha on Julia,它提供了一种将caffemodel提取到hdf5的方法。我希望这可以帮到你。