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

时间:2016-06-01 15:28:38

标签: python neural-network deep-learning caffe pycaffe

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

我发现的所有答案都使用带有caffe类或Pycaffe的C ++代码。 我看过pycaffe的代码看起来你真的需要caffe来理解二进制是唯一的解决方案吗?

4 个答案:

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

  1. 下载最新的caffe.proto

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

  3. 导入和解析

  4. 以下示例代码

    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的方法。我希望这可以帮到你。