繁体   English   中英

从.caffemodel中提取权重而不在Python中安装caffe

[英]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(二进制原型格式),结果很简单。

  1. 下载最新的caffe.proto

  2. 编译成python库:protoc --python_out =。 caffe.proto

  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

显然,你可以从你的对象中提取你想要的任何东西。 我刚刚打印了第一层的名称作为示例。 此外,您的模型可能在图层数组(已弃用)或图层(无'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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM