轉(zhuǎn)自:https://www.raywenderlich.com/181760/beginning-machine-learning-keras-core-ml?utm_source=raywenderlich.comWeekly
????????蘋果公司的Core ML和Vision框架已經(jīng)將開發(fā)者帶入了一個機器學習的嶄新世界,帶來了激動人心的可能性骂束。Vision可以檢測和跟蹤人臉矢棚,Apple的機器學習頁面提供了可以檢測物體和場景以及NSLinguisticTagger自然語言處理的即用模型观蓄。如果你想建立你自己的模型眼虱,試試蘋果新的Turi Create來擴展一個預先訓練好的模型和你的數(shù)據(jù)勒虾。
????????但是停撞,如果你想做什么需要更多的定制?那么转绷,現(xiàn)在是使用Google伟件,Microsoft,Amazon或Berkeley的眾多框架之一進入機器學習(ML)的時候了暇咆。而且锋爪,為了讓生活更加激動人心,你需要選擇一種新的編程語言和一套新的開發(fā)工具爸业。
????????在這個Keras機器學習教程中其骄,您將學習如何訓練深度學習卷積神經(jīng)網(wǎng)絡模型,將其轉(zhuǎn)換為Core ML扯旷,并將其集成到iOS應用程序中拯爽。您將學習一些ML術(shù)語,使用一些新的工具钧忽,并且一路拾取一些Python毯炮。
????????該示例項目使用ML的Hello-World示例 : 一種對MNIST數(shù)據(jù)集上的手寫數(shù)字進行分類的模型。
讓我們開始吧耸黑!
為什么要使用Keras桃煎?
????????ML模型涉及許多復雜的代碼,操縱數(shù)組和矩陣大刊。但ML已經(jīng)存在了很長一段時間为迈,研究人員創(chuàng)建了圖書館,使得像我們這樣的人創(chuàng)建ML模型變得更容易缺菌。其中很多是用Python編寫的葫辐,盡管研究人員也使用R,SAS伴郁,MATLAB和其他軟件耿战。但是您可能會在基于Python的工具中找到所需的一切:
????????scikit-learn提供了一個簡單的方法來運行許多經(jīng)典的ML算法,如線性回歸和支持向量機焊傅。我們開始的機器學習與scikit學習教程(即將推出<炼浮)顯示你如何訓練這些。
另一方面是PyTorch和Google的TensorFlow狐胎,它們可以更好地控制深度學習模式的內(nèi)部運作鹏倘。
????????微軟的CNTK和Berkeley的Caffe是類似的深度學習框架,它們有Python API來訪問他們的C ++引擎顽爹。
那么Keras在哪里?這是TensorFlow和CNTK的封裝骆姐,亞馬遜的MXN??et即將推出镜粤。(它也與Theano合作捏题,但是2017年9月,蒙特利爾大學停止了這個工作肉渴。)它提供了一個易于使用的API來構(gòu)建模型公荧,您可以在一個后端上進行訓練,并部署到另一個后端上同规。
????????使用Keras而不是直接使用TensorFlow的另一個原因是循狰,coremltools包括一個Keras轉(zhuǎn)換器,而不是一個TensorFlow轉(zhuǎn)換器 - 雖然存在一個TensorFlow到CoreML轉(zhuǎn)換器和一個MXNet到CoreML轉(zhuǎn)換器券勺。雖然Keras支持CNTK作為后端绪钥,但coremltools只適用于Keras + TensorFlow。
? ??????注意:在使用這些工具之前关炼,您是否需要學習Python程腹?那么,我沒有儒拂;當你完成本教程的時候寸潦,你會發(fā)現(xiàn)Python的語法與Swift類似:更簡潔一點,縮進是語法的一個重要部分社痛。如果您感到緊張见转,請在瀏覽器選項卡中將其打開,以供快速參考:Jason Brownlee?針對機器學習開發(fā)人員的Python碰撞課程蒜哀。
? ??????另一個注意:研究人員同時使用Python 2和Python 3斩箫,但coremltools在Python 2.7中效果更好。
入門
????????下載并解壓縮啟動器文件夾:它包含一個啟動器iOS應用程序凡怎,您將在其中添加ML模型和代碼來使用它校焦。它還包含一個docker-keras文件夾,其中包含本教程的Jupyter筆記本统倒。
設置Docker
????????Docker是一個容器平臺寨典,可以讓你在自定義的環(huán)境中部署應用 - 有點像虛擬機,但不同房匆。通過安裝Docker耸成,您可以訪問大量的ML資源,主要分布在Docker鏡像中的交互式Jupyter筆記本中浴鸿。
? ??????注意:安裝Docker并構(gòu)建映像將需要幾分鐘的時間井氢,所以在等待的時候,請在一個Nutshell部分閱讀ML岳链。
下載花竞,安裝并啟動Docker Community Edition for Mac。在終端中掸哑,一次輸入以下命令:
cd < 你解壓縮啟動器的位置> / starter / docker-keras????
docker build -t keras-mnist
docker run --rm -it -p 8888:8888 -v $(pwd)/notebook:/workspace/notebook keras-mnist
????????這最后一個命令將Docker容器的筆記本文件夾映射到本地筆記本文件夾约急,即使在注銷Docker服務器之后零远,您也可以訪問筆記本寫入的文件。
? ??????在命令的最后厌蔽,輸出是一個包含令牌的URL牵辣。它看起來像這樣,但具有不同的標記值:http://0.0.0.0:8888/?token=7b189c8e200f49dcc33845d39101e8a0ab257db5f3b539a7
將此URL粘貼到瀏覽器中以登錄到Docker容器的筆記本服務器奴饮。
????????打開筆記本文件夾纬向,然后打開keras_mnist.ipynb。點擊“?Not Trusted”按鈕將其更改為“?Trusted”:這可讓您保存筆記本文件夾以及模型文件所做的更改戴卜。 ?
ML in a Nutshell
????????亞瑟·塞繆爾(Arthur Samuel)將機器學習定義為“使計算機沒有明確程序地學習的能力的學習領域”逾条。你有數(shù)據(jù),有一些功能可以用來對數(shù)據(jù)進行分類叉瘩,或者用它來做一些預測膳帕,但是你沒有一個明確的公式來計算這個數(shù)據(jù),所以你不能編寫一個程序去做薇缅。如果你有足夠的數(shù)據(jù)樣本危彩,你可以訓練一個計算機模型來識別這個數(shù)據(jù)中的模式,然后把它的學習應用到新的數(shù)據(jù)上泳桦。當你知道所有訓練數(shù)據(jù)的正確結(jié)果時汤徽,這就是所謂的監(jiān)督式學習:那么模型只是根據(jù)已知的結(jié)果檢查其預測結(jié)果,并調(diào)整自身以減少錯誤并提高準確性灸撰。無監(jiān)督學習超出了本教程的范圍谒府。?????
權(quán)重和閾值
? ??????假設你想和一群朋友一起選擇一家餐廳吃飯。有幾個因素影響您的決定:飲食限制浮毯,公共交通完疫,價格范圍,食物類型债蓝,兒童友好等壳鹤。您為每個因素分配一個權(quán)重,以表明其對您的決定的重要性饰迹。然后芳誓,對于選項列表中的每個餐館,根據(jù)餐廳滿足該因素的程度啊鸭,為每個因素分配一個值锹淌。您將每個因子值乘以因子的權(quán)重,然后將它們相加得到加權(quán)總和赠制。最好的餐廳是最好的選擇赂摆。另一種使用這種模式的方法是產(chǎn)生二進制輸出:是或否。您設置了一個閾值,并從您的列表中刪除加權(quán)總和低于此閾值的餐廳库正。
培訓ML模型
????????提出權(quán)重是不是一件容易的工作曲楚。但幸運的是,你有很多來自以前的晚餐的數(shù)據(jù)褥符,包括選擇哪家餐廳,所以你可以訓練一個ML模型來計算權(quán)重抚垃,盡可能地產(chǎn)生相同的結(jié)果喷楣。然后,將這些計算的權(quán)重應用于未來的決策鹤树。
? ??????為了訓練ML模型铣焊,您從隨機權(quán)重開始,將其應用于訓練數(shù)據(jù)罕伯,然后將計算輸出與已知輸出進行比較以計算誤差曲伊。這是一個具有最小值的多維函數(shù),訓練的目標是確定非常接近這個最小值的權(quán)重追他。權(quán)重還需要處理新的數(shù)據(jù):如果大量驗證數(shù)據(jù)上的錯誤高于訓練數(shù)據(jù)上的錯誤坟募,則模型過度配置?- 權(quán)重在訓練數(shù)據(jù)上工作得太好,表明訓練錯誤檢測到一些不會推廣到新數(shù)據(jù)的功能邑狸。
隨機梯度下降
? ??????要計算減少誤差的權(quán)重懈糯,可以計算當前圖形位置的誤差函數(shù)的梯度,然后調(diào)整權(quán)重以“降低”斜率单雾。這被稱為漸變下降赚哗,并在訓練過程中發(fā)生多次。對于大型數(shù)據(jù)集硅堆,使用所有數(shù)據(jù)計算梯度需要很長時間屿储。隨機梯度下降(SGD)從隨機選擇的小批量訓練數(shù)據(jù)中估計梯度- 例如在選舉日之前對選民進行調(diào)查:如果您的樣本代表整個數(shù)據(jù)集,則調(diào)查結(jié)果準確預測最終結(jié)果渐逃。
優(yōu)化器
? ??????錯誤函數(shù)是塊狀的:你必須小心不要過分够掠,否則你可能會錯過最小值。你的步伐率也需要有足夠的動力來推動你走出任何虛假的最低限度朴乖。ML研究人員花費了大量的精力來設計優(yōu)化算法來做到這一點祖屏。目前最受歡迎的是Adam(自適應矩估計),它結(jié)合了先前最喜歡的RMSprop(均方根傳播)和AdaGrad(自適應梯度算法)的特性买羞。
Keras代碼時間袁勺!
????????好了,Docker容器應該現(xiàn)在就準備好了:回去按照說明打開筆記本⌒笃眨現(xiàn)在是時候?qū)懸恍㎏eras代碼期丰!
????????在keras_mnist.ipynb單元格中輸入以下代碼,并使用匹配的標題。當您完成在每個單元格中輸入代碼時钝荡,按下Control-Enter運行它街立。代碼正在運行時,In []:標簽中會出現(xiàn)一個星號埠通,然后會出現(xiàn)一個數(shù)字赎离,以顯示您運行單元的順序。登錄到筆記本時端辱,所有內(nèi)容都保留在內(nèi)存中梁剔。每隔一段時間,點擊保存和檢查點按鈕舞蔽。? ? ? ??
? ??????注意:雙擊減價單元格以添加您自己的評論;?按下Control-Enter來渲染降價并運行你的Python代碼荣病。您還可以使用其他筆記本按鈕添加或復制粘貼單元格,并移動單元格渗柿。
導入實用程序和依賴項
? ? ????輸入下面的代碼个盆,并運行它來檢查Keras版本。
from __future__ import print_function
from matplotlib import pyplot as plt
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import np_utils
from keras import backend as K
import coremltools
# coremltools supports Keras version 2.0.6
print('keras version ', keras.__version__)
????????__future__?是Python 2和Python 3之間的兼容層:Python 2有一個print?命令(不包括圓括號)朵栖,但是Python 3需要一個print()函數(shù)颊亮。導入print_function允許您在Python 2代碼中使用print()語句。
? ??????Keras使用NumPy數(shù)學庫來操作數(shù)組和矩陣混槐。Matplotlib是NumPy的繪圖庫:您將使用它來檢查訓練數(shù)據(jù)項编兄。
? ??????注意:您可能會看到FutureWarningNumPy 1.14。