您好,登錄后才能下訂單哦!
小編給大家分享一下Keras模型轉(zhuǎn)TensorFlow的案例,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
環(huán)境:python 3.6 +opencv3+Keras
訓練集:MNIST
下面劃重點:因為MNIST使用的是黑底白字的圖片,所以你自己手寫數(shù)字的時候一定要注意把得到的圖片也改成黑底白字的,否則會識別錯(至少我得到的結論是這樣的 ,之前用白底黑字的圖總是識別出錯)
注意:需要測試圖片需要為與訓練模時相同大小的圖片,RGB圖像需轉(zhuǎn)為gray
代碼:
import cv2 import numpy as np from keras.models import load_model model = load_model('fm_cnn_BN.h6') #選取自己的.h模型名稱 image = cv2.imread('6_b.png') img = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY) # RGB圖像轉(zhuǎn)為gray #需要用reshape定義出例子的個數(shù),圖片的 通道數(shù),圖片的長與寬。具體的參加keras文檔 img = (img.reshape(1, 1, 28, 28)).astype('int32')/255 predict = model.predict_classes(img) print ('識別為:') print (predict) cv2.imshow("Image1", image) cv2.waitKey(0)
補充知識:keras轉(zhuǎn)tf并加速(1)Keras轉(zhuǎn)TensorFlow,并調(diào)用轉(zhuǎn)換后模型進行預測
由于方便快捷,所以先使用Keras來搭建網(wǎng)絡并進行訓練,得到比較好的模型后,這時候就該考慮做成服務使用的問題了,TensorFlow的serving就很合適,所以需要把Keras保存的模型轉(zhuǎn)為TensorFlow格式來使用。
Keras模型轉(zhuǎn)TensorFlow
其實由于TensorFlow本身以及把Keras作為其高層簡化API,且也是建議由淺入深地來研究應用,TensorFlow本身就對Keras的模型格式轉(zhuǎn)化有支持,所以核心的代碼很少。這里給出一份代碼:https://github.com/amir-abdi/keras_to_tensorflow,作者提供了一份很好的工具,能夠滿足絕大多數(shù)人的需求了。原理很簡單:原理很簡單,首先用 Keras 讀取 .h6 模型文件,然后用 tensorflow 的 convert_variables_to_constants 函數(shù)將所有變量轉(zhuǎn)換成常量,最后再 write_graph 就是一個包含了網(wǎng)絡以及參數(shù)值的 .pb 文件了。
如果你的Keras模型是一個包含了網(wǎng)絡結構和權重的h6文件,那么使用下面的命令就可以了:
python keras_to_tensorflow.py --input_model="path/to/keras/model.h6" --output_model="path/to/save/model.pb"
兩個參數(shù),一個輸入路徑,一個輸出路徑。輸出路徑即使你沒創(chuàng)建好,代碼也會幫你創(chuàng)建。建議使用絕對地址。此外作者還做了很多選項,比如如果你的keras模型文件分為網(wǎng)絡結構和權重兩個文件也可以支持,或者你想給轉(zhuǎn)化后的網(wǎng)絡節(jié)點編號,或者想在TensorFlow下繼續(xù)訓練等等,這份代碼都是支持的,只是使用上需要輸入不同的參數(shù)來設置。
如果轉(zhuǎn)換成功則輸出如下:
begin==================================================== I1229 14:29:44.819010 140709034264384 keras_to_tf.py:119] Input nodes names are: [u'input_1'] I1229 14:29:44.819385 140709034264384 keras_to_tf.py:137] Converted output node names are: [u'dense_2/Sigmoid'] INFO:tensorflow:Froze 322 variables. I1229 14:29:47.091161 140709034264384 tf_logging.py:82] Froze 322 variables. Converted 322 variables to const ops. I1229 14:29:48.504235 140709034264384 keras_to_tf.py:170] Saved the freezed graph at /path/to/save/model.pb
這里首先把輸入的層和輸出的層名字給出來了,也就是“input_1”和“dense_2/Sigmoid”,這兩個下面會用到。另外還告訴你凍結了多少個變量,以及你輸出的模型路徑,pb文件就是TensorFlow下的模型文件。
使用TensorFlow模型
轉(zhuǎn)換后我們當然要使用一下看是否轉(zhuǎn)換成功,其實也就是TensorFlow的常見代碼,如果只用過Keras的,可以參考一下:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np from tensorflow.python.platform import gfile import cv2 import os os.environ["CUDA_VISIBLE_DEVICES"] = "6" # img = cv2.imread(os.path.expanduser('/test_imgs/img_1.png')) # img = cv2.resize(img, dsize=(1000, 1000), interpolation=cv2.INTER_LINEAR) # img = img.astype(float) # img /= 255 # img = np.array([img]) # 初始化TensorFlow的session with tf.Session() as sess: # 讀取得到的pb文件加載模型 with gfile.FastGFile("/path/to/save/model.pb",'rb') as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) # 把圖加到session中 tf.import_graph_def(graph_def, name='') # 獲取當前計算圖 graph = tf.get_default_graph() # 從圖中獲輸出那一層 pred = graph.get_tensor_by_name("dense_2/Sigmoid:0") # 運行并預測輸入的img res = sess.run(pred, feed_dict={"input_1:0": img}) # 執(zhí)行得到結果 pred_index = res[0][0] print('Predict:', pred_index)
在代碼中可以看到,我們用到了上面得到的輸入層和輸出層的名稱,但是在后面加了一個“:0”,也就是索引,因為名稱只是指定了一個層,大部分層的輸出都是一個tensor,但依然有輸出多個tensor的層,所以需要制定是第幾個輸出,對于一個輸出的情況,那就是索引0了。輸入同理。
如果你輸出res,會得到這樣的結果:
('Predict:', array([[0.9998584]], dtype=float32))
這也就是為什么我們要取res[0][0]了,這個輸出其實取決于具體的需求,因為這里我是對一張圖做二分類預測,所以會得到這樣一個結果
運行的結果如果和使用Keras模型時一樣,那就說明轉(zhuǎn)換成功了!
看完了這篇文章,相信你對Keras模型轉(zhuǎn)TensorFlow的案例有了一定的了解,想了解更多相關知識,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。