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

jea*_*ean 6 python neural-network deep-learning caffe pycaffe

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

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

Lol*_*olo 6

我刚才必须解决那个确切的问题。假设您有一个 .caffemodel(二进制 proto 格式),结果证明它非常简单。

  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 
Run Code Online (Sandbox Code Playgroud)

为我生产:

name 1st layer: conv1_1
Run Code Online (Sandbox Code Playgroud)

显然,您可以从对象中提取任何您想要的内容。我只是打印了我的第一层的名称作为示例。此外,您的模型可能会在图层数组(已弃用)或图层(无“s”)数组中表达图层,但您已了解要点。


jea*_*ean 3

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