【玩轉數據係列十】利用阿裏雲機器學習在深度學習框架下實現智能圖片分類
伴隨著今日阿裏雲機器學習PAI在雲棲大會的重磅發布,快來感受下人工智能的魅力。
一、背景
隨著互聯網的發展,產生了大量的圖片以及語音數據,如何對這部分非結構化數據行之有效的利用起來,一直是困擾數據挖掘工程師的一到難題。首先,解決非結構化數據常常要使用深度學習算法,上手門檻高。其次,對於這部分數據的處理,往往需要依賴GPU計算引擎,計算資源代價大。本文將介紹一種利用深度學習實現的圖片識別案例,這種功能可以服用到圖片的檢黃、人臉識別、物體檢測等各個領域。
下麵嚐試通過阿裏雲機器學習平台產品,利用深度學習框架Tensorflow,快速的搭架圖像識別的預測模型,整個流程隻需要半小時,就可以實現對下麵這幅圖片的識別,係統會返回結果“鳥”:
二、數據集介紹
本案例數據集及相關代碼下載地址:https://help.aliyun.com/document_detail/51800.html?spm=5176.doc50654.6.564.mS4bn9
使用CIFAR-10數據集,這份數據是一份對包含6萬張像素為32*32的彩色圖片,這6萬張圖片被分成10個類別,分別是飛機、汽車、鳥、毛、鹿、狗、青蛙、馬、船、卡車。數據集截圖:
數據源在使用過程中被拆分成兩個部分,其中5萬張用於訓練,1萬張用於測試。其中5萬張訓練數據又被拆分成5個data_batch,1萬張測試數據組成test_batch。最終數據源如圖:
三、數據探索流程
下麵我們一步一步講解下如何將實驗在阿裏雲機器學習平台跑通,首先需要開通阿裏雲機器學習產品的GPU使用權限,並且開通OSS,用於存儲數據。
機器學習:https://data.aliyun.com/product/learn?spm=a21gt.99266.416540.112.IOG7OU
OSS:https://www.aliyun.com/product/oss?spm=a2c0j.103967.416540.50.KkZyBu
1.數據源準備
第一步,進入OSS對象存儲,將本案例使用的相關數據和代碼放到OSS的bucket路徑下。首先建立OSS的bucket,然後我建立了aohai_test文件夾,並在這個目錄下建立如下4個文件夾目錄:
每個文件夾的作用如下:
check_point:用來存放實驗生成的模型
cifar-10-batches-py:用來存放訓練數據以及預測集數據,對應的是下載下來的數據源cifar-10-batcher-py文件和預測集bird_mount_bluebird.jpg文件
predict_code:用來存放訓練數據,也就是cifar_pai.py
train_code:用來存放cifar_predict_pai.py
本案例數據集及相關代碼下載地址:https://help.aliyun.com/document_detail/51800.html?spm=5176.doc50654.6.564.mS4bn9
2.配置OSS訪問授權
現在我們已經把數據和訓練需要的代碼放入OSS,下麵要配置機器學習對OSS的訪問,進入阿裏雲機器學習,在“設置”按鈕的彈出頁麵,配置OSS的訪問授權。如圖:
3.模型訓練
從左邊的組件框中拖拽“讀OSS Bucket”以及“Tensorflow”組件鏈接,並且在“Tensorflow”的配置項中進行相關設置。
- Python代碼文件:OSS中的cifar_pai.py
- 數據源目錄:OSS中的cifar-10-batches-py文件夾
- 輸出目錄:OSS中的check_point文件夾
點擊運行,實驗開始訓練,可以針對底層的GPU資源靈活調節,除了界麵端的設置,需要在代碼中也有相應的支持,代碼編寫符合Tensorflow的多卡規範。
4.模型訓練代碼解析
這裏針對cifar_pai.py文件中的關鍵代碼講解:
(1)構建CNN圖片訓練模型
network = input_data(shape=[None, 32, 32, 3],
data_preprocessing=img_prep,
data_augmentation=img_aug)
network = conv_2d(network, 32, 3, activation='relu')
network = max_pool_2d(network, 2)
network = conv_2d(network, 64, 3, activation='relu')
network = conv_2d(network, 64, 3, activation='relu')
network = max_pool_2d(network, 2)
network = fully_connected(network, 512, activation='relu')
network = dropout(network, 0.5)
network = fully_connected(network, 10, activation='softmax')
network = regression(network, optimizer='adam',
loss='categorical_crossentropy',
learning_rate=0.001)
(2)訓練生成模型model.tfl
model = tflearn.DNN(network, tensorboard_verbose=0)
model.fit(X, Y, n_epoch=100, shuffle=True, validation_set=(X_test, Y_test),
show_metric=True, batch_size=96, run_id='cifar10_cnn')
model_path = os.path.join(FLAGS.checkpointDir, "model.tfl")
print(model_path)
model.save(model_path)
5.查看訓練過程中的日誌
訓練過程中,右鍵“Tensorflow”組件,點擊查看日誌。
點擊打開logview連接,按照如下鏈路操作,打開ODPS Tasks下麵的Algo Task,雙擊Tensorflow Task,點擊StdOut,可以看到模型訓練的日誌被實時的打印出來:
隨著實驗的進行,會不斷打出日誌出來,對於關鍵的信息也可以利用print函數在代碼中打印,結果會顯示在這裏。在本案例中,可以通過acc查看模型訓練的準確度。
5.結果預測
再拖拽一個“Tensorflow”組件用於預測,
- Python代碼文件:OSS中的cifar_predict_pai.py
- 數據源目錄:OSS中的cifar-10-batches-py文件夾,用來讀取bird_mount_bluebird.jpg文件
- 輸出目錄:讀取OSS中的check_point文件夾下模型訓練生成的model.tfl模型文件
6.預測代碼數據
部分預測代碼解析:
predict_pic = os.path.join(FLAGS.buckets, "bird_bullocks_oriole.jpg")
img_obj = file_io.read_file_to_string(predict_pic)
file_io.write_string_to_file("bird_bullocks_oriole.jpg", img_obj)
img = scipy.ndimage.imread("bird_bullocks_oriole.jpg", mode="RGB")
# Scale it to 32x32
img = scipy.misc.imresize(img, (32, 32), interp="bicubic").astype(np.float32, casting='unsafe')
# Predict
prediction = model.predict([img])
print (prediction[0])
print (prediction[0])
#print (prediction[0].index(max(prediction[0])))
num=['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']
print ("This is a %s"%(num[prediction[0].index(max(prediction[0]))]))
首先讀入圖片“bird_bullocks_oriole.jpg”,將圖片調整為像素32*32的大小,然後帶入model.predict預測函數評分,最終會返回這張圖片對應的十種分類['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']的權重,選擇權重最高的一項作為預測結果返回。
四、其它
參與討論:雲棲社區公眾號
免費體驗:阿裏雲數加機器學習平台
往期文章:
【玩轉數據係列二】機器學習應用沒那麼難,這次教你玩心髒病預測
【玩轉數據係列四】聽說啤酒和尿布很配?本期教你用協同過濾做推薦
【玩轉數據係列七】有娃的注意了,機器學習教您如何提高孩子學習成績
【玩轉數據係列八】機器學習算法的離線調度實現-廣告CTR預測
最後更新:2017-04-01 16:41:01