閱讀341 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【玩轉數據係列十】利用阿裏雲機器學習在深度學習框架下實現智能圖片分類

伴隨著今日阿裏雲機器學習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個文件夾目錄:
https://res.3425.com.cn/aliyunqi/qiabpm3lub1.png

每個文件夾的作用如下:

  • 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的訪問授權。如圖:
https://res.3425.com.cn/aliyunqi/zxfielwzplc.png

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模型文件

預測的圖片是存儲在checkpoint文件夾下的圖:

結果見日誌:

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

  上一篇:go 小程序,會是下一個創業風口嗎
  下一篇:go 2020年業務峰值提前3年出現,中國郵政上雲實戰經驗談