簡體   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