使用Keras訓(xùn)練好的.h5模型來(lái)測(cè)試一個(gè)實(shí)例
環(huán)境:python 3.6 +opencv3+Keras
訓(xùn)練集:MNIST
下面劃重點(diǎn):因?yàn)镸NIST使用的是黑底白字的圖片,所以你自己手寫(xiě)數(shù)字的時(shí)候一定要注意把得到的圖片也改成黑底白字的,否則會(huì)識(shí)別錯(cuò)(至少我得到的結(jié)論是這樣的 ,之前用白底黑字的圖總是識(shí)別出錯(cuò))
注意:需要測(cè)試圖片需要為與訓(xùn)練模時(shí)相同大小的圖片,RGB圖像需轉(zhuǎn)為gray
代碼:
import cv2 import numpy as np from keras.models import load_model model = load_model('fm_cnn_BN.h5') #選取自己的.h模型名稱(chēng) image = cv2.imread('6_b.png') img = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY) # RGB圖像轉(zhuǎn)為gray #需要用reshape定義出例子的個(gè)數(shù),圖片的 通道數(shù),圖片的長(zhǎng)與寬。具體的參加keras文檔 img = (img.reshape(1, 1, 28, 28)).astype('int32')/255 predict = model.predict_classes(img) print ('識(shí)別為:') print (predict) cv2.imshow("Image1", image) cv2.waitKey(0)
補(bǔ)充知識(shí):keras轉(zhuǎn)tf并加速(1)Keras轉(zhuǎn)TensorFlow,并調(diào)用轉(zhuǎn)換后模型進(jìn)行預(yù)測(cè)
由于方便快捷,所以先使用Keras來(lái)搭建網(wǎng)絡(luò)并進(jìn)行訓(xùn)練,得到比較好的模型后,這時(shí)候就該考慮做成服務(wù)使用的問(wèn)題了,TensorFlow的serving就很合適,所以需要把Keras保存的模型轉(zhuǎn)為T(mén)ensorFlow格式來(lái)使用。
Keras模型轉(zhuǎn)TensorFlow
其實(shí)由于TensorFlow本身以及把Keras作為其高層簡(jiǎn)化API,且也是建議由淺入深地來(lái)研究應(yīng)用,TensorFlow本身就對(duì)Keras的模型格式轉(zhuǎn)化有支持,所以核心的代碼很少。這里給出一份代碼:https://github.com/amir-abdi/keras_to_tensorflow,作者提供了一份很好的工具,能夠滿足絕大多數(shù)人的需求了。原理很簡(jiǎn)單:原理很簡(jiǎn)單,首先用 Keras 讀取 .h5 模型文件,然后用 tensorflow 的 convert_variables_to_constants 函數(shù)將所有變量轉(zhuǎn)換成常量,最后再 write_graph 就是一個(gè)包含了網(wǎng)絡(luò)以及參數(shù)值的 .pb 文件了。
如果你的Keras模型是一個(gè)包含了網(wǎng)絡(luò)結(jié)構(gòu)和權(quán)重的h5文件,那么使用下面的命令就可以了:
python keras_to_tensorflow.py --input_model="path/to/keras/model.h5" --output_model="path/to/save/model.pb"
兩個(gè)參數(shù),一個(gè)輸入路徑,一個(gè)輸出路徑。輸出路徑即使你沒(méi)創(chuàng)建好,代碼也會(huì)幫你創(chuàng)建。建議使用絕對(duì)地址。此外作者還做了很多選項(xiàng),比如如果你的keras模型文件分為網(wǎng)絡(luò)結(jié)構(gòu)和權(quán)重兩個(gè)文件也可以支持,或者你想給轉(zhuǎn)化后的網(wǎng)絡(luò)節(jié)點(diǎn)編號(hào),或者想在TensorFlow下繼續(xù)訓(xùn)練等等,這份代碼都是支持的,只是使用上需要輸入不同的參數(shù)來(lái)設(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
這里首先把輸入的層和輸出的層名字給出來(lái)了,也就是“input_1”和“dense_2/Sigmoid”,這兩個(gè)下面會(huì)用到。另外還告訴你凍結(jié)了多少個(gè)變量,以及你輸出的模型路徑,pb文件就是TensorFlow下的模型文件。
使用TensorFlow模型
轉(zhuǎn)換后我們當(dāng)然要使用一下看是否轉(zhuǎn)換成功,其實(shí)也就是TensorFlow的常見(jiàn)代碼,如果只用過(guò)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='') # 獲取當(dāng)前計(jì)算圖 graph = tf.get_default_graph() # 從圖中獲輸出那一層 pred = graph.get_tensor_by_name("dense_2/Sigmoid:0") # 運(yùn)行并預(yù)測(cè)輸入的img res = sess.run(pred, feed_dict={"input_1:0": img}) # 執(zhí)行得到結(jié)果 pred_index = res[0][0] print('Predict:', pred_index)
在代碼中可以看到,我們用到了上面得到的輸入層和輸出層的名稱(chēng),但是在后面加了一個(gè)“:0”,也就是索引,因?yàn)槊Q(chēng)只是指定了一個(gè)層,大部分層的輸出都是一個(gè)tensor,但依然有輸出多個(gè)tensor的層,所以需要制定是第幾個(gè)輸出,對(duì)于一個(gè)輸出的情況,那就是索引0了。輸入同理。
如果你輸出res,會(huì)得到這樣的結(jié)果:
('Predict:', array([[0.9998584]], dtype=float32))
這也就是為什么我們要取res[0][0]了,這個(gè)輸出其實(shí)取決于具體的需求,因?yàn)檫@里我是對(duì)一張圖做二分類(lèi)預(yù)測(cè),所以會(huì)得到這樣一個(gè)結(jié)果
運(yùn)行的結(jié)果如果和使用Keras模型時(shí)一樣,那就說(shuō)明轉(zhuǎn)換成功了!
以上這篇使用Keras訓(xùn)練好的.h5模型來(lái)測(cè)試一個(gè)實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python神經(jīng)網(wǎng)絡(luò)Keras?GhostNet模型的實(shí)現(xiàn)
- Keras神經(jīng)網(wǎng)絡(luò)efficientnet模型搭建yolov3目標(biāo)檢測(cè)平臺(tái)
- keras的三種模型實(shí)現(xiàn)與區(qū)別說(shuō)明
- keras 兩種訓(xùn)練模型方式詳解fit和fit_generator(節(jié)省內(nèi)存)
- 淺談keras使用預(yù)訓(xùn)練模型vgg16分類(lèi),損失和準(zhǔn)確度不變
- Keras實(shí)現(xiàn)Vision?Transformer?VIT模型示例詳解
相關(guān)文章
python基礎(chǔ)教程之csv格式文件的寫(xiě)入與讀取
逗號(hào)分隔值(Comma-Separated Values,CSV,也稱(chēng)為字符分隔值,分隔字符也可以不是逗號(hào)),新這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)教程之csv格式文件的寫(xiě)入與讀取的相關(guān)資料,需要的朋友可以參考下2022-03-03Python實(shí)現(xiàn)繁體中文與簡(jiǎn)體中文相互轉(zhuǎn)換的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)繁體中文與簡(jiǎn)體中文相互轉(zhuǎn)換的方法,涉及Python基于第三方模塊進(jìn)行編碼轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2018-12-12Python中sys.stdout方法的語(yǔ)法示例詳解
Python中sys 模塊中的一個(gè)方法是stdout ,它使用其參數(shù)直接顯示在控制臺(tái)窗口上,print() 方法,它有相同的行為,首先轉(zhuǎn)換為sys.stdout() 方法,然后在控制臺(tái)顯示結(jié)果,本文給大家介紹Python sys.stdout方法的語(yǔ)法,感興趣的朋友一起看看吧2023-09-09Jupyter Notebook/VSCode導(dǎo)出PDF中文不顯示的解決
這篇文章主要介紹了Jupyter Notebook/VSCode導(dǎo)出PDF中文不顯示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06PyTorch里面的torch.nn.Parameter()詳解
今天小編就為大家分享一篇PyTorch里面的torch.nn.Parameter()詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Python調(diào)用實(shí)現(xiàn)最小二乘法的方法詳解
所謂線性最小二乘法,可以理解為是解方程的延續(xù),區(qū)別在于,當(dāng)未知量遠(yuǎn)小于方程數(shù)的時(shí)候,將得到一個(gè)無(wú)解的問(wèn)題。本文主要和大家分享Python調(diào)用實(shí)現(xiàn)最小二乘法的方法,需要的可以參考一下2023-04-0418個(gè)Python腳本可加速你的編碼速度(提示和技巧)
Python的可讀性和設(shè)計(jì)簡(jiǎn)單性是其廣受歡迎的兩個(gè)主要原因。文中通過(guò)實(shí)例給大家介紹的很清楚,本文重點(diǎn)給大家分享18個(gè)Python腳本可加速你的編碼速度,感興趣的朋友一起看看吧2019-10-10Django靜態(tài)資源部署404問(wèn)題解決方案
這篇文章主要介紹了Django靜態(tài)資源部署404問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05django使用定時(shí)任務(wù)django_apscheduler的實(shí)現(xiàn)
定時(shí)任務(wù)無(wú)論是個(gè)人開(kāi)發(fā)還是企業(yè)業(yè)務(wù)都是需要的,本文主要介紹了django使用定時(shí)任務(wù)django_apscheduler的實(shí)現(xiàn),減少請(qǐng)求時(shí)需要用戶(hù)等待的時(shí)間,感興趣的可以了解一下2021-08-08