caffe 模型轉tensorflow
下載模型轉換程式碼:
caffe-tensorflow模型轉換檔案為convert.py,可以將caffe的模型定義檔案.prototxt和訓練好的模型分別轉換為tensorflow類,和tensorflow模型檔案.在example資料夾下提供了examples/minist和examples/imagenet兩個轉換示例.
以手寫字型為例,模型為lenet,examples/minist目錄下提供了lenet.prototxt和訓練好的caffe模lenet_iter_10000.caffemodel,caffe轉換為tensorflow命令為:
python convert.py --def_path examples/mnist/lenet.prototxt --caffemodel examples/mnist/lenet_iter_10000.caffemodel --data-output-path lenet.npy --code-output-path lenet.py
執行命令後報錯:
TypeError: Descriptors should not be created directly, but only retrieved from their parent.
Process finished with exit code 1
這是因為找不到caffe安裝目錄,解決方法是kaffe/caffe/resolver.py的第12行新增caffe安裝目錄:
import sys
caffe_root = '/home/qinghua/program/caffe'
sys.path.insert(0, caffe_root + '/python')
import caffe
轉換後得到lenet網路結構檔案lenet.py:
from kaffe.tensorflow import Network
class LeNet(Network):
def setup(self):
(self.feed('data')
.conv(5, 5, 20, 1, 1, padding='VALID', relu=False , name='conv1')
.max_pool(2, 2, 2, 2, name='pool1')
.conv(5, 5, 50, 1, 1, padding='VALID', relu=False, name='conv2')
.max_pool(2, 2, 2, 2, name='pool2')
.fc(500, name='ip1')
.fc(10, relu=False, name='ip2')
.softmax(name='prob'))
已經模型檔案lenet.npy,我們可以載入該模型,並進行fine tuning,程式碼為examples/mnist/finetune_mnist.py
# Import the converted model's class
import numpy as np
import random
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from lenet import LeNet as MyNet
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
batch_size = 32
def gen_data(source):
while True:
indices = range(len(source.images))
random.shuffle(indices)
for i in indices:
image = np.reshape(source.images[i], (28, 28, 1))
label = source.labels[i]
yield image, label
def gen_data_batch(source):
data_gen = gen_data(source)
while True:
image_batch = []
label_batch = []
for _ in range(batch_size):
image, label = next(data_gen)
image_batch.append(image)
label_batch.append(label)
yield np.array(image_batch), np.array(label_batch)
images = tf.placeholder(tf.float32, [batch_size, 28, 28, 1])
labels = tf.placeholder(tf.float32, [batch_size, 10])
net = MyNet({'data': images})
ip2 = net.layers['ip2']
pred = tf.nn.softmax(ip2)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=ip2, labels=labels), 0)
opt = tf.train.RMSPropOptimizer(0.001)
train_op = opt.minimize(loss)
with tf.Session() as sess:
# Load the data
sess.run(tf.initialize_all_variables())
net.load('lenet.npy', sess)
data_gen = gen_data_batch(mnist.train)
for i in range(1000):
np_images, np_labels = next(data_gen)
feed = {images: np_images, labels: np_labels}
np_loss, np_pred, _ = sess.run([loss, pred, train_op], feed_dict=feed)
if i % 10 == 0:
print('Iteration: ', i, np_loss)
更新prototxt及model為最新的caffe版本
由於caffe版本不同,一些引數定義會有更改,轉換的時候由於不同caffe版本的問題,可能會出現錯誤:
Error encountered: Unknown layer type encountered: 4
這時候就需要使用函式upgrade_net_proto_text和函式upgrade_net_proto_binary,更新prototxt及model為最新的caffe版本.
更新prototxt:
/home/caffe/build/tools/upgrade_net_proto_text LightenedCNN_A_deploy.prototxt_old LightenedCNN_A_deploy.prototxt
更新model:
/home/caffe/build/tools/upgrade_net_proto_binary LightenedCNN_A.caffemodel_old LightenedCNN_A.caffemodel
對於錯誤2:
Error encountered: Multiple top nodes are not supported.
這是因為prototxt檔案中定義了包含兩個top node的層,如:
layer {
name: "slice1"
type: "Slice"
bottom: "pool1"
top: "slice1_1"
top: "slice1_2"
slice_param {
slice_dim: 1
}
}
這時候就需要自己編寫tensorflow程式碼.
但是完全自己編寫也不太容易,這時候我們可以去掉不能轉換的層,例如去掉Slice層,將Slice層的上下層連線,同時轉換的時候只輸入prototxt檔案,即只對模型定義檔案進行轉換,以lightCNN為例,
python convert.py --def_path /home/face_verification_experiment/proto/LightenedCNN_A_deploy.prototxt --code-output-path lightcnn.py
得到模型類為:
from kaffe.tensorflow import Network
class DeepFace_set003_net(Network):
def setup(self):
(self.feed('input')
.conv(9, 9, 96, 1, 1, padding='VALID', relu=False, name='conv1')
.max_pool(2, 2, 2, 2, name='pool1')
.conv(5, 5, 192, 1, 1, padding='VALID', relu=False, name='conv2')
.max_pool(2, 2, 2, 2, name='pool2')
.conv(5, 5, 256, 1, 1, padding='VALID', relu=False, name='conv3')
.max_pool(2, 2, 2, 2, name='pool3')
.conv(4, 4, 384, 1, 1, padding='VALID', relu=False, name='conv4')
.max_pool(2, 2, 2, 2, name='pool4')
.fc(512, relu=False, name='fc1')
.dropout(0.699999988079, name='dropout1')
.fc(10575, relu=False, name='fc2')
.softmax(name='softmax'))
參考以上程式碼,就可以使用tensorflow快速的編寫對應的模型程式碼.
編寫好模型程式碼後,需要載入訓練好的caffe模型,我們載入caffe模型檔案,並儲存引數陣列.
import sys
caffe_root = '/home/qinghua/program/caffe'
sys.path.insert(0, caffe_root + '/python')
# Try to import PyCaffe first
import caffe
import cPickle
dir='/home/face_verification_experiment/'
def_path=dir+'proto/LightenedCNN_A_deploy.prototxt_old'
data_path=dir+'model/LightenedCNN_A.caffemodel'
net = caffe.Net(def_path, data_path, caffe.TEST)
data = lambda blob: blob.data
params = [(k, map(data, v)) for k, v in net.params.items()]
params1=dict()
params1['params']=params
blobs=net.blobs
input_dims = blobs['data'].shape
with open(dir+'model/LightenedCNN_A.pkl', 'wb') as pickle_file:
cPickle.dump(params1,pickle_file)
將所有訓練好的變數值儲存在LightenedCNN_A.pkl中,這樣在可以使用tf.assign對tensorflow模型中的變數複製,再使用tf.saver.save()儲存模型即可.這樣最終完成了模型轉換.
相關推薦
caffe 模型轉tensorflow
下載模型轉換程式碼: caffe-tensorflow模型轉換檔案為convert.py,可以將caffe的模型定義檔案.prototxt和訓練好的模型分別轉換為tensorflow類,和tensorflow模型檔案.在example資料夾下提供了exam
【TensorFlow】Caffe模型轉tensorflow模型並使用模型進行預測
做了一個Caffe模型轉tensorflow的實驗,把ResNet模型和prototxt轉為tensorflow模型和tensorflow程式碼,挺有意思的。 主要參考: https://my.oschina.net/yilian/blog/672135 這個開源專案
基於Caffe-Int8-Convert-Tools進行caffe模型轉int8量化日常記錄
最近在中低端嵌入式裝置上進行人臉識別移植,雖然針對模型引數儘量壓縮,但模型依然有6M左右,在低端嵌入式裝置上載入速度和執行速度都讓人淚流滿面。查閱資料後,目前針對嵌入式裝置可通過float32轉int8進行模型壓縮和速度提升,所以本人也進行了實驗,並將實驗過程進
Tensorflow模型轉caffe
整個過程可以分兩步: 找到對應的層名字(如:tensorflow 模型中的conv1_1和caffe中的conv1_1)。 把weights 和biases 中的值賦給相對應的層。賦值的時候要注意T
使用mmdnn將caffe模型轉換為tensorflow模型
mmdnn是微軟推出的用於各個模型互轉的工具,支援主流框架,同類產品有onnx. 這兩個存在的共同問題是文件太舊,更新後很多命令不再適用 這裡給出mmdnn能用的命令 @echo off set PYTHONPATH=D:/CNN/caffe/python mmconvert -sf c
tensorflow框架.ckpt .pb模型節點tensor_name列印及ckpt模型轉.pb模型
轉換模型首先要知道的是從哪個節點輸出,如果沒有原始碼是很難清楚節點資訊。 獲取ckpt模型的節點名稱 import os from tensorflow.python import pywrap
caffe model如何轉tensorflow model
在生產環境中,使用api呼叫caffe訓練生成的模型,依賴的第三方庫太多,環境安裝是個麻煩問題,同時在平臺間移植也是個很麻煩的事情。比如說,在ubuntu16下訓練好的caffe模型,需要移植到ios、android手機端等平臺,caffe需要做大量的開發工作。 如果使用te
caffe 模型轉換(不同深度學習框架互轉)
本人使用的是微軟的MMdnn工具,具體使用方法見其GitHub工程,這裡說明下在轉換過程中的問題: 1、由caffe轉mxnet時,在卷積層和FC層之間,mmconvert轉換工具會自動增加一個Flatten層,用於對接卷積層和FC層。這將導致轉換後的FC層與caffe定義
TensorFlow模型轉為caffe模型
color num .data com 參考資料 net 說明 全連接 proto 最近由於要將訓練好的模型移植到硬件上,因此需要將TensorFlow轉為caffe模型。 caffe模型需要兩個文件,一個是定義網絡結構的prototxt,一個是存儲了參數的caffemo
PowerDesigner教程 —— 概念數據模型 (轉)
點擊 面向 添加屬性 hot 復制 ner 並且 case mod 一、概念數據模型概述 概念數據模型也稱信息模型,它以實體-聯系(Entity-RelationShip,簡稱E-R)理論為基礎,並對這一理論進行了擴充。它從用戶的觀點出發對信息進行建模,主要用
常用的Redis客戶端的並發模型(轉)
war sta 進程 過程 blog 有效 tro nal 做的 偽代碼模型 # get lock lock = 0 while lock != 1: timestamp = current Unix time + lock timeou
Java並發編程:淺析幾種線程安全模型 [轉]
condition 神器 ans temp 簡單 nts 替換 line get() 多線程編程一直是老生常談的問題,在Java中,隨著JDK的逐漸發展,JDK提供給我們的並發模型也越來越多,本文摘取三例使用不同原理的模型,分析其大致原理。目錄如下: 1.COW之Copy
教程 | 沒有博士學位,照樣玩轉TensorFlow深度學習
flow doc 深度 tensor sdn shtml art 線性 算法系列 香港科技大學TensorFlow三天速成課件 https://blog.csdn.net/zhongxon/article/details/54709347 香港科技大學TensorFlow三
(譯):將SolidWorks模型轉URDF
參考網站:wiki 0.1 屬性管理器 視窗首先會出現一個屬性管理器頁面,用來配置你要匯出的urdf檔案。 您需要配置每個link並手動構建link樹。 第一次配置完成後,軟體會自動儲存配置。 以後你應該可以跳過這一步。 對於每個link,需要給它一個唯一的名稱,同時給link一個獨一的j
使用訓練好的caffe模型分類圖片(python版)
英文官方文件:http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb 匯入python caffe包 import numpy as np im
[轉]TensorFlow如何進行時序預測
TensorFlow 是一個採用資料流圖(data flow graphs),用於數值計算的開源軟體庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯絡的多維資料陣列,即張量(tensor)。它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GP
【ROS學習】Solidworks模型轉化為URDF檔案格式+三連桿機械臂示例+逆運動學
URDF(Universal Robot Description Format)——通用機器人描述格式,它是ROS裡邊使用的一種機器人的描述檔案,包含的內容有:連桿、關節,運動學和動力學引數、視覺化模型、碰撞檢測模型等。 到目前為止,本文的主要內容有兩個:(1)將solidworks
Connectionist Temporal Classification(CTC)、音識別模型小型綜述和一個簡易的語音識別模型的tensorflow實現
CTC是一種端到端的語音識別技術,他避免了需要字或者音素級別的標註,只需要句子級別的標註就可以進行訓練,感覺非常巧妙,也很符合神經網路浪潮人們的習慣。特別是LSTM+CTC相較於之前的DNN+HMM,LSTM能夠更好的捕捉輸入中的重要的點(LSTM隨著狀態數目增加引數呈線性增加,而HMM會平
用大白話講滑動平均模型(Tensorflow)
無論是書上還是論壇講的滑動平均模型都太官方,看了好久才看懂,其實很簡單的事,大家說起來確很費事。 首先,先不要分析這個名字的含義,我就是被這幾個字給騙了,其實他的作用就一個:控制衰減率!!! 那怎麼控制呢? TensorFlow中給出了影子變數(shadow varible)的概念,我當初看
caffe模型訓練全過程(一)指令碼、資料準備與製作
1.首先建立工程資料夾 資料夾結構如下 |——project ├── create_imagenet.sh #生成lmdb檔案的指令碼 |——train_lmdb ├── data.mdb └── lock.mdb