卷積神經網絡實現對汽車的分類
卷積神經網絡(CNN)先進的神經網絡結構,主要用於計算機視覺任務。CNN可以應用於許多不同的任務,如圖像識別、物體定位和變化檢測。最近,我們的合作夥伴數據的見解獲得一個具有挑戰性的請求從一個主要汽車公司:開發一個計算機視覺應用程序可以識別汽車模型在給定的圖像。考慮到不同的車型會顯得非常相似,任何車都可以根據周圍環境截然不同的角度拍攝,這樣一個任務是,直到最近,根本不可能的。
然而,從2012年左右開始,”深度學習革命”能處理這樣的問題。而不是解釋的概念車,電腦可以反複研究圖片和學習這些概念本身。在過去的幾年中,額外的人工神經網絡的創新導致了人工智能與人類能夠進行圖像分類任務的準確性。建立這樣的發展我們可以火車上深CNN對汽車的模型進行分類。斯坦福大學汽車上的神經網絡訓練數據集,其中包含超過16000個汽車的照片,包括196個不同的模型。隨著時間的推移,我們可以看到的準確性預測開始改善,隨著神經網絡學習的概念車,以及如何區分不同的模型。
同我們的合作夥伴,我們一起建立一個端到端使用Apache火花™和機器學習管道考拉數據預處理,Keras與Tensorflow模型的訓練,MLflow跟蹤的模型和結果Azure毫升REST服務的部署。這個設置在Azure磚優化訓練網絡快速和高效,同時也有助於更快地嚐試了很多不同的CNN配置。即使隻有幾個實踐嚐試,CNN的準確性達到85%左右。
建立一個人工神經網絡對圖像進行分類
在本文中,我們概述了一些主要的技術應用於神經網絡分成生產。如果你想嚐試自己運行的神經網絡,包括完整的筆記本用細致的循序漸進的指導,下麵可以找到。
這個演示使用公開可用斯坦福大學汽車數據集這是一個更全麵的公共數據集,雖然有點過時了,所以你找不到車型2012後(盡管,一旦訓練,轉移學習可以很容易地使一個新的數據集替換)。提供的數據是通過一個ADLS Gen2存儲賬戶,您可以安裝到您的工作空間中。
第一步數據預處理的圖像被壓縮成hdf5文件(一個用於培訓和一個用於測試)。這個由神經網絡可以讀入。完全可以省略這一步,如果你喜歡,hdf5代存儲文件的一部分ADLS提供筆記本電腦提供的在這裏。
圖像增強與考拉
收集的數據的數量和多樣性有很大影響結果的一個可以實現深度學習模型。數據增強是一種策略,可以明顯提高學習的結果,而不需要實際收集新數據。與不同的種植技術、填充和水平翻轉,這是常用的訓練神經網絡,數據集可以被人為地誇大了增加圖像進行訓練和測試。
申請增加大型語料庫的訓練數據可以非常昂貴,特別是當比較不同方法的結果。與考拉很容易嚐試現有框架的圖像增強在Python中,和擴展過程與多個節點集群上使用數據科學熟悉的熊貓API。
編碼Keras ResNet
當你拆開一個CNN,他們組成不同“塊”,每一塊僅僅代表一組操作適用於一些輸入數據。這些模塊可以大致分為:
- 身份:一係列的操作,保持數據的形狀不變。
- 卷積:一係列的操作,減少輸入數據的形狀較小的形狀。
CNN是一係列的身份阻塞和卷積(或ConvBlocks),減少一個輸入圖像到一個緊湊的群號碼。這些生成的數字(如果訓練正確)最終應該告訴你一些有用的分類圖像。剩餘CNN對每一塊增加了一個額外的步驟。之前的數據保存為臨時變量的操作構成應用塊,然後這個臨時數據添加到輸出數據。一般來說,這個額外的步驟應用於每一塊。作為一個例子,下麵的圖展示了一個簡化的CNN檢測手寫的數字:
有許多不同的神經網絡實現方法。更直觀的方法之一是通過Keras。Keras提供了一個簡單的前端庫執行組成神經網絡的各個步驟。Keras可以配置為使用Tensorflow後端或Theano後端。在這裏,我們將使用一個Tensorflow後端。Keras網絡分為多個層次,如下所示。對於我們的網絡我們也定義我們的客戶實現層。
規模的層
任何自定義操作,可訓練的權重Keras允許你實現自己的層。在處理大量的圖像數據,一個可以運行到內存的問題。最初,RGB圖像包含整數數據(0 - 255)。當運行在反向傳播梯度下降法作為優化的一部分,會發現一個整數梯度不允許足夠的精度正確調整網絡權值。因此,有必要改變浮動精度。這是可能出現的問題。即使圖像縮小到224 x224x3,當我們使用一萬訓練圖像,我們看超過10億浮點條目。而不是把整個數據集浮點精度,更好的做法是使用一個擴展層,尺度輸入數據的一個圖像,且僅當它是必要的。這應該是批正常化後應用模型。這種規模的層也參數的參數,可以通過培訓學習。
使用這個自定義層還在得分我們必須一起包的類模型。MLflow我們可以實現這個Keras custom_objects字典名稱(字符串)映射到與Keras相關聯的自定義類或函數模型。MLflow保存這些自定義層使用CloudPickle和恢複時自動加載模型mlflow.keras.load_model ()和mlflow.pyfunc.load_model ()。
mlflow.keras.log_model(模型,“模型”custom_objects = {“規模”規模:})
跟蹤結果MLflow和Azure機器學習
機器學習的發展涉及到軟件開發之外的額外的複雜性。有大量的工具和框架很難跟蹤實驗,再現結果和部署的機器學習模型。一起Azure機器學習可以促進和管理端到端機器學習生命周期使用MLflow可靠地構建、分享和部署使用Azure磚機器學習應用程序。
為了自動跟蹤的結果,現有的或新的Azure毫升工作區可以鏈接到Azure磚工作區。此外,MLflow支持Keras自動對數模型(mlflow.keras.autolog()),使經驗幾乎毫不費力。
雖然MLflow內置的模型持久性實用程序方便包裝模型從Keras等各種流行的ML庫,他們不覆蓋每一個用例。例如,您可能想要使用一個模型從一個毫升庫,沒有顯式地支持MLflow內置的味道。或者,您可能想要包自定義推理代碼和數據來創建一個MLflow模型。幸運的是,MLflow提供了兩種解決方案,可用於完成這些任務:自定義Python模型和定製的味道。
在這種情況下我們要確保我們可以使用一個模型推理引擎,支持從REST API客戶端服務請求。我們使用自定義模型基於之前構建的Keras模型接受JSON Dataframe對象,base64編碼的圖像。
進口mlflow.pyfunc類AutoResNet150(mlflow.pyfunc.PythonModel):defpredict_from_picture(自我,img_df):進口cv2作為簡曆進口numpy作為np進口base64# base64編碼的解碼圖像用於通過http傳輸img = np.frombuffer (base64.b64decode (img_df [0][0]),dtype = np.uint8)img_res = cv.resize(簡曆。imdecode (img標記=1),(224年,224年),cv.IMREAD_UNCHANGED)rgb_img = np.expand_dims (img_res,0)
僅僅= self.keras_model.predict (rgb_img)概率= np。馬克斯(僅僅)
class_id = np.argmax(僅僅)返回{“標簽”:self.class_names [class_id] [0][0),“概率”:“{:。4}”。格式(概率)}defload_context(自我,上下文):進口scipy.io進口numpy作為np進口h5py進口keras進口cloudpickle從keras.models進口load_model
自我。結果= []與開放(context.artifacts [“cars_meta”),“rb”)作為文件:#加載汽車類文件cars_meta = scipy.io.loadmat(文件)自我。類_names = cars_meta[“class_names”]自我。類_names = np.transpose(self.class_names)與開放(context.artifacts [“scale_layer”),“rb”)作為文件:自我。scale_layer = cloudpickle.load(文件)與開放(context.artifacts [“keras_model”),“rb”)作為文件:f = h5py.File (file.name“r”)自我。keras_model = load_model(f, custom_objects={“規模”:self.scale_layer})def預測(自我,上下文,model_input):返回self.predict_from_picture (model_input)
在下一步中,我們可以使用這個py_model並將其部署到一個Azure容器實例服務器可以通過MLflow Azure毫升的集成。
部署一個圖像分類模型在Azure容器實例
現在我們有一個訓練有素的機器學習模型,並注冊一個模型在我們與MLflow工作區雲。作為最後一步,我們想將模型作為web服務部署到Azure容器實例。
web服務是一個圖像,在這種情況下,一個碼頭工人的形象。它封裝了得分邏輯和模型本身。在這種情況下,我們使用我們的自定義MLflow模型表示這讓我們控製得分的邏輯從REST客戶端接受醫療圖像,如何響應的形狀。
#為建立MLflow Azure毫升集裝箱圖像模型azure_image azure_model = mlflow.azureml.build_image (model_uri =“{}/ py_model”。格式(resnet150_latest_run.info.artifact_uri),image_name =“car-resnet150”,model_name =“car-resnet150”,工作區= ws,同步=真正的)
webservice_deployment_config = AciWebservice.deploy_configuration ()
#定義容器規格aci_config = AciWebservice.deploy_configuration (cpu_cores =3.0memory_gb =12.0)
網絡服務= Webservice.deploy_from_image (形象= azure_image,工作區= ws,name =“car-resnet150”,deployment_config = aci_config,覆蓋=真正的)
webservice.wait_for_deployment ()
測試容器實例是一個偉大的解決方案和理解工作流。可伸縮的生產部署,考慮使用Azure Kubernetes服務。有關更多信息,請參見如何部署和在哪裏。
開始與CNN圖像分類
本文和筆記本演示中使用的主要技術建立一個端到端的工作流程培訓和部署一個神經網絡在生產在Azure上。連接筆記本的演習將指導您完成所需的步驟創建這個在你自己的Azure磚環境使用Keras等工具,磚考拉,MLflow,Azure毫升。