keras安装_代码详解:构建一个简单的Keras+深度学习REST API
在本教程中,我們將介紹一個(gè)簡(jiǎn)單的方法來(lái)獲取Keras模型并將其部署為REST API。本文所介紹的示例將作為你構(gòu)建自己的深度學(xué)習(xí)API的模板/起點(diǎn)——你可以擴(kuò)展代碼,根據(jù)API端點(diǎn)的可伸縮性和穩(wěn)定性對(duì)其進(jìn)行定制。
具體而言,我們將了解:
· 如何(以及如何不)將Keras模型加載到內(nèi)存中,以便有效地進(jìn)行推理
· 如何使用Flask web框架為我們的API創(chuàng)建端點(diǎn)
· 如何使用我們的模型進(jìn)行預(yù)測(cè),用JSON-ify轉(zhuǎn)換它們,并將結(jié)果反饋到客戶端
· 如何使用cURL和Python來(lái)調(diào)用我們的Keras REST API
在本教程結(jié)束時(shí),你將能很好地理解創(chuàng)建Keras REST API所需的組件(以最簡(jiǎn)單的形式)。
請(qǐng)隨意使用本指南中提供的代碼作為你自己的深度學(xué)習(xí)REST API起點(diǎn)。
配置開發(fā)環(huán)境
假設(shè)Keras已經(jīng)配置并安裝在你的機(jī)器上。如果沒(méi)有,請(qǐng)確保使用官方安裝說(shuō)明安裝Keras(https://keras.io/#installation)。
然后,需要安裝Flask (http://flask.pocoo.org/)(及其相關(guān)的依賴項(xiàng)),一個(gè)Python web框架,這樣就可以構(gòu)建API端點(diǎn)了。還需要請(qǐng)求(http://docs.python-requests.org/en/master/),這樣就可以使用API了。
有關(guān)的pip安裝命令如下:
$ pip install flask gevent requests pillow
構(gòu)建你的Keras REST API
Keras REST API獨(dú)立于一個(gè)名為run_keras_server.py的文件中。為了簡(jiǎn)單起見(jiàn),我們將安裝保存在一個(gè)文件中——安裝啟用也可以很容易地模塊化。
在 run_keras_server.py中,你會(huì)發(fā)現(xiàn)三個(gè)函數(shù),即:
· load_model:用于加載訓(xùn)練好的Keras模型,并為推理做準(zhǔn)備。
· prepare_image:這個(gè)函數(shù)在通過(guò)我們的網(wǎng)絡(luò)進(jìn)行預(yù)測(cè)之前對(duì)輸入圖像進(jìn)行預(yù)處理。如果你沒(méi)有使用圖像數(shù)據(jù),則可能需要考慮將名稱更改為更通用的prepare_datapoint,并應(yīng)用一些可能需要的縮放/標(biāo)準(zhǔn)化。
· predict:API的實(shí)際端點(diǎn)可以將請(qǐng)求中的輸入數(shù)據(jù)分類,并將結(jié)果反饋給客戶端。
# import the necessary packagesfrom keras.applications import ResNet50from keras.preprocessing.image import img_to_arrayfrom keras.applications import imagenet_utilsfrom PIL import Imageimport numpy as npimport flaskimport io
# initialize our Flask application and the Keras modelapp = flask.Flask(__name__)model = None
第一個(gè)代碼片段處理導(dǎo)入了所需的程序包,并且對(duì)Flask應(yīng)用程序和模型進(jìn)行了初始化。
在此,我們定義load_model函數(shù):
def load_model():
# load the pre-trained Keras model (here we are using a model
# pre-trained on ImageNet and provided by Keras, but you can
# substitute in your own networks just as easily)
global model
model = ResNet50(weights="imagenet")
顧名思義,這個(gè)方法負(fù)責(zé)將我們的架構(gòu)實(shí)例化,并從磁盤加載權(quán)重。
為了簡(jiǎn)單起見(jiàn),將使用在ImageNet數(shù)據(jù)集上預(yù)先訓(xùn)練過(guò)的ResNet50架構(gòu)。
如果你正在使用自定義模型,則需要修改此函數(shù)以從磁盤加載架構(gòu)+權(quán)重。
在對(duì)任何來(lái)自客戶端的數(shù)據(jù)進(jìn)行預(yù)測(cè)之前,首先需要準(zhǔn)備并預(yù)處理數(shù)據(jù):
def prepare_image(image, target):
# if the image mode is not RGB, convert it
if image.mode != "RGB":
image = image.convert("RGB")
# resize the input image and preprocess it
image = image.resize(target)
image = img_to_array(image)
image = np.expand_dims(image, axis=0)
image = imagenet_utils.preprocess_input(image)
# return the processed image
return image
這個(gè)函數(shù):
· 接受輸入圖像
· 將模式轉(zhuǎn)換為RGB(如果需要)
· 將大小調(diào)整為224x224像素(ResNet的輸入空間維度)
· 通過(guò)平均減法數(shù)組和縮放對(duì)陣列進(jìn)行預(yù)處理
此外,在通過(guò)模型傳遞輸入數(shù)據(jù)之前,應(yīng)該根據(jù)某一預(yù)處理、縮放或標(biāo)準(zhǔn)化來(lái)修改這個(gè)函數(shù)。
現(xiàn)在可以定義predict函數(shù)了——該方法會(huì)處理對(duì)/predict端點(diǎn)的任何請(qǐng)求:
@app.route("/predict
總結(jié)
以上是生活随笔為你收集整理的keras安装_代码详解:构建一个简单的Keras+深度学习REST API的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++ istringstream重新绑
- 下一篇: usb转232线驱动_为什么越来越多人用