[英]Extracting weights from .caffemodel without caffe installed in Python
是否有一种相对简单的方法从Caffe Zoo中的许多预训练模型之一中提取Python中的权重而没有CAFFE (也不是pyCaffe)? .caffemodel
.caffemodel解析为hdf5 / numpy或Python可以读取的任何格式?
我找到的所有答案都使用带有caffe类或Pycaffe的C ++代码。 我看过pycaffe的代码看起来你真的需要caffe来理解二进制是唯一的解决方案吗?
我刚才必须解决这个问题。 假设你有一个.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')数组中表示图层,但您可以获得要点。
如今,caffe可以将权重保存为两种格式:BINARYPROTO或HDF5。 扩展名为.caffemodel
二进制加权文件采用BINARYPROTO格式,扩展名.caffemodel.h5
采用HDF5格式。 由于最近将HDF5格式引入了caffe,我预计您目前在“模型动物园”中遇到的大多数模型都采用更“传统”的BINARYPROTO格式。
如果权重以HDF5格式存储,您可以使用h5py
包来选择它们。
但是,BINARYPROTO格式基于由caffe.proto
定义的谷歌协议缓冲区格式的二进制序列化。 我在协议缓冲区不是专家,但我怀疑你将有一个很艰难的时期解密二进制文件没有明确“编译”的caffe.proto
protobuf的定义文件(这是朱古力构建的一部分)。
我认为选择权重的最简单方法是安装caffe并使用其python / C ++接口。 你为什么不这样做?
正如它所发生的那样,ethereon创建了一个名为caffe-tensorflow的精彩库来将caffe模型转换为Tensorflow代码,但这并非全部! 它还允许用户将.caffemodel
文件转换为.npy
文件,而无需构建pycaffe! 它测试是否构建了caffe,如果没有,它会回归纯粹的google protobuf实现。
我不明白你为什么要在没有caffe / pycaffe的情况下这样做,也许你已经厌倦了在新机器上部署caffe? 但由于caffemodel是特殊的二元数据类型的caffe,使用他人的工具不会让生活更轻松。
如果你坚持这样做,还有另一个框架: Julia上的Mocha ,它提供了一种将caffemodel提取到hdf5的方法。 我希望这可以帮到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.