?點擊上方藍字
關注我們
(本文閱讀時間:10分鐘)
Microsoft Azure Machine Learning Studio是微軟強大的機器學習平臺,在設計器中,微軟內置了15個場景案例,但網上似乎沒有對這15個案例深度刨析的分析資料,所以我就計劃寫一個系列來完成。
既然是深度刨析,就不再是簡單的介紹操作,而是深入每一個細節,寧愿過度詳細擴展,也不簡單掃過。
微軟MVP實驗室研究員
王豫翔,Leo
微軟圈內人稱王公子。微軟10年+MVP,大齡程序員。目前核心工作是使用微軟AI技術設計可以落地的解決方案,也就是寫PPT。雖然熱愛代碼,但只有午夜時分才是自由敲代碼的時間。喜歡微軟技術,不喜歡無腦照抄。
這次我們刨析的案例是:使用 DenseNet 進行的圖像分類。
預備知識
▌PIL
Python Image Library,是 python 的第三方圖像處理庫,PIL 庫支持圖像存儲,顯示和處理,幾乎能夠處理幾乎所有的圖片格式,所以已經算得上是 Python 平臺事實上的圖像處理標準庫了。但是由于 PIL 僅支持到 Python 2.7,所以在3.X Python下,你應該使用 PIL 的硬分叉 Pillow ,由于 Pillow 兼容 PIL 的絕大多數語法同時因為 PIL 的巨大影響力,所以我們一般還是叫 PIL 圖片處理。還有一點要注意 Pillow 和 PIL 不能共存在相同的環境中。
使用PIL可以幫我們對訓練樣本進行擴充,這意思就是使用PIL庫對樣本文件隨機調整大小的裁剪、隨機裁剪、隨機水平翻轉、隨機垂直翻轉、隨機旋轉、隨機仿射、隨機灰度、隨機透視、隨機擦除。
▌DenseNet
密集連接的卷積網絡(Densely Connected Convolutional Networks),一種監督學習的分類算法。在 DenseNet 出現之前,CNN 的進化一般通過層數的加深(ResNet)或者加寬(Inception)的思想進行,。2017年的 DenseNet脫離了加深網絡層數(ResNet)和加寬網絡結構(Inception)來提升網絡性能的定式思維,從特征的角度考慮,通過特征重用和旁路(Bypass)設置,既大幅度減少了網絡的參數量,又在一定程度上緩解了梯度消亡(gradient vanishing)問題的產生。結合信息流和特征復用的假設,DenseNet當之無愧成為2017年計算機視覺頂會(CVPR)的年度最佳論文(Best Paper)。
簡單的說,在DenseNet之前,有一個問題:有沒有一種方法可以讓網絡又深梯度又不會消失?
DenseNet給出了一個簡單優雅的答案:直接通過將前面所有層與后面的層建立密集連接來對特征進行重用來解決這個問題。
作者主要提出了四種網絡架構分別是DenseNet121、DenseNet169、DenseNet201以及DenseNet264,現在已經有了大概11中網絡架構,densenet121, densenet161, densenet169, densenet201, resnet18, resnet34, resnet50, resnet101, resnet152, vgg16, vgg19。Microsoft Azure Machine Learning Studio 提供的是原始惡4種網絡結構,一般我們選擇 DenseNet201 或者 DenseNet169。
▌PyTorch
pytorch是一個基于Python的科學計算包,它主要有兩個用途:
類似于Numpy但是能利用GPU加速
一個非常靈活和快速用于深度學習的研究平臺
所以說PyTorch既可以看作加入了GPU支持的numpy,同時也可以看成一個擁有自動求導功能的強大的深度神經網絡。PyTorch的優點到底是啥呢?PyTorch不僅僅是定義網絡結構簡單,而且還很直觀靈活。靜態圖的網絡定義都是聲明式的,而動態圖可以隨意的調用函數。
PyTorch更有利于研究人員、愛好者、小規模項目等快速搞出原型。而TensorFlow更適合大規模部署,特別是需要跨平臺和嵌入式部署時。
深入分析
這套案例一共十二個工作節點,但其中有兩組五個節點是一樣的。這個案例種不需要我們進行編碼,但提供了我們關于圖片分類訓練的最佳實踐,值得我們認真了解。我們逐個分析每一個節點中值得關注的細節和核心信息。
▌Animal Images Dataset節點
這個節點是數據的輸入,核心有兩個信息
Datastore name:azureml_globaldatasets是一個鏈接,點擊可以跳轉到數據存儲的位置
Relative path:描述在Datastore中當前文件的位置,默認是Images/Animals_Images_Dataset
點擊azureml_globaldatasets將跳轉到Datastore瀏覽器,您可以在這個瀏覽器下觀察到您存儲的數據。大致的界面如下
點擊這些圖片可以預覽
Cat:前綴為0的是各種喵星人的玉照,各種顏色,各種賣萌。其中還有一只和人類一起同框的一臉驚訝的黑色喵星人。(10張圖片)
Dog:前綴為1的是汪星人,同樣是各種姿態各種萌。(10張圖片)
Frog:前綴為2的生物以我淺薄的生物知識我一下子無法歸納,不知道是青蛙,還是癩蛤蟆還是蟾蜍。反正就是蛙類生物就行了。(10張圖片)
合計一共30張圖片樣本。這些文件在存儲的時候是以如下命名結構方式存儲:
Your_image_folder_name/Category_1/xxx.png
Your_image_folder_name/Category_1/xxy.jpg
Your_image_folder_name/Category_1/xxz.jpegYour_image_folder_name/Category_2/123.png
Your_image_folder_name/Category_2/nsdf3.png
Your_image_folder_name/Category_2/asd932_.png
文件夾的名稱被視為圖像分類等任務的標簽。目前支持“.jpg”,“.jpeg”,“.png”,“.ppm”,“.bmp”,“.pgm”,“.tif”,“.tiff”,“.webp”類型文件,可以在一個文件夾中擁有多種類型的圖像。不必在每個類別文件夾中包含相同數量的圖像。
對了,你還可以使用擴展名為“.zip”,“.tar”,“.gz”和“.bz2”的文件夾或壓縮文件。
▌Convert to Image Directory節點
將圖像數據集轉換為“圖像目錄”數據類型,這是 Azure 機器學習設計器中的圖像分類等與圖像相關的任務中的標準化數據格式。
這個節點是把所有的圖片文件放到一個目錄下,不在通過目錄名稱將圖片分類
但會用images.lst的文件描述了圖片的標簽,類似這樣的信息
{"image_info": {"file_name": "image/1_134.jpg"}, "category": "dog", "id": 134}
{"image_info": {"file_name": "image/0_91.jpg"}, "category": "cat", "id": 91}
{"image_info": {"file_name": "image/0_74.jpg"}, "category": "cat", "id": 74}
{"image_info": {"file_name": "image/0_60.jpg"}, "category": "cat", "id": 60}
{"image_info": {"file_name": "image/0_14.jpg"}, "category": "cat", "id": 14}
{"image_info": {"file_name": "image/1_197.jpg"}, "category": "dog", "id": 197}
{"image_info":?{"file_name":?"image/1_172.jpg"},?"category":?"dog",?"id":?172}
這個工作你可以看成是Convert to Image Directory組件將指定位置的圖片讀取并輸入給之后的處理。
▌Split Image Directory節點
Split Image Directory節點有兩個,分布用于訓練模型和驗證
第一次拆分:將90%的樣本用于訓練,將10%的樣本用于驗證。拆分后用于訓練的文件有29張圖片,用于驗證的圖片有3張。
第二次拆分:將用于訓練的樣本再次拆分,依然還是90%用于訓練,10%用于驗證。拆分后用于訓練的文件有24張圖片,用于驗證的圖片有3張。
這兩次拆分非常重要,請認真理解兩次拆分的目的。經過這兩次拆分,真正最后用于測試的樣本占比在81%。
▌Init Image Transformation節點
初始化圖像轉換是一個非常重要的工作,因為采集大量的圖片樣本是一個成本很高的工作,所以通過將PIL圖片做各種變形轉換,相當于我們又給樣本集加入了很多樣本。比如我們對原始圖片進行放大,縮小,裁剪部分,旋轉,變成黑白等等。
要注意的是,Init Image Transformation對我們剛才拆分的三份樣本都做了轉換,這樣我們就得到了很多新的樣本。
圖像轉換就是使用PIL幫助我們完成。對圖像做大量隨機轉換,是圖像機器學習種重要初始化工作,圖片樣本進行了大量的擴充后才提交給DenseNet訓練。
調整大小(Resize):將輸入 PIL 圖像的大小調整為給定大小, 如果選擇“True”,則可以在 Size 中指定所需的輸出圖像大小,默認情況下為 256。。
居中裁剪(Center crop):如果選擇“True”,則可以在裁剪大小(Crop size)中指定所需的作物輸出圖像大小,默認是224。
邊框填充(Pad):如果選擇True:則可以在“Padding”中的每個邊框上指定填充要添加的像素數。
顏色抖動(Color jitter):指定是否隨機更改圖像的亮度、對比度和飽和度。
灰度(Grayscale),指定是否將圖像轉換為灰度。
隨機調整大小(Random resized crop):對于隨機調整大小的裁剪,指定是否將給定的 PIL 圖像裁剪為隨機大小和縱橫比。生成原始大小的隨機大小(范圍從 0.08 到 1.0)和原始縱橫比的隨機縱橫比(范圍從 3/4 到 4/3)的裁剪。此裁剪最終調整為給定大小。這通常用于訓練Inception網絡。如果選擇“True:則可以以隨機大小指定每個邊的預期輸出大小。可以在隨機裁剪大小(Random resized crop size)中指定所需的裁剪輸出大小, 默認為 256。
隨機裁剪(Random crop),指隨機位置裁剪給定的 PIL 圖像。如果選擇“True”,則可以在隨機裁剪大小(Random crop size)中指定所需的裁剪輸出大小, 默認為 224。
隨機水平翻轉(Random horizontal flip),指定是否以概率 0.5 隨機水平翻轉給定的 PIL 圖像。
隨機垂直翻轉(Random vertical flip),指定是否以概率 0.5 隨機垂直翻轉給定的 PIL 圖像。
隨機旋轉(Random rotation),指定是否按角度旋轉圖像。如果選擇“True:則可以通過設置隨機旋轉度(Random rotation degrees)(來指定度范圍,默認情況下為 0。
隨機仿射(Random affine),指定是否對圖像進行隨機仿射變換以保持中心不變。如果選擇“True:則可以在隨機仿射度數(Random affine degrees)中指定可供選擇的度數范圍,默認情況下為0。
隨機灰度(Random grayscale),指定是否將圖像隨機轉換為概率為 0.1 的灰度。
隨機透視(Random perspective),指定是否以概率 0.5 隨機執行給定 PIL 圖像的透視變換。
▌Apply Image Transformation節點
我們存儲圖片的目錄也有了,轉換圖片的能力也有了,現在可以通過Apply Image Transformation指出每一個目錄如何使用Image Transformation。我們有兩種定義
用于訓練(For training):被設定的目錄里的圖形將全面使用nit Image Transformation設置的能力。
用于推理(For inference):被設定的目錄里的圖形將排除隨機創建新樣本等轉換。這是因為隨機創建新樣本(如“隨機水平翻轉”)的轉換操作用于訓練中的數據增強,這應該在推理中刪除,因為推理樣本需要固定以進行準確的預測和評估。
Apply Image Transformation節點有三個,分布對應了Split Image Directory拆分出的三部分圖片。
▌DenseNet節點
有了預備知識中的DenseNet內容,你就非常容易理解這個節點的任務。使用DenseNet模型對樣本進行訓練。
我們需要選擇
模型名稱(Model name):內置了121、161、169和201.一般我們可以選擇201或者161.
預訓練(Pretrained):指定是否使用在 ImageNet 上預先訓練的模型。建議選擇True。
內存效率(Memory efficient):指定是否使用檢查點,檢查點的內存效率要高得多,但速度較慢。模式是False。
總體來說,DenseNet不需要我們做很多干預。
▌Train PyTorch Model節點
Train PyTorch Model節點要求三個輸入:模型、訓練數據集和驗證數據集。其中模型只接受DenseNet 或 ResNet(這一點如果有錯誤,我以后會修正)
時期(Epochs)循環訪問整個數據集的次數,默認是5次
批大小(Batch size)指定在一個批次中訓練的實例數,默認為 16 個。
學習率(Learning rate):將輸出誤差反向傳播給網絡參數,以此來擬合樣本的輸出。本質上是最優化的一個過程,逐步趨向于最優解。但是每一次更新參數利用多少誤差,就需要通過一個參數來控制,這個參數就是學習率,也稱為步長。設置的學習率越小,模型測試就越頻繁,而且可能會陷入局部停滯。設置的學習率越大,收斂速度就越快,而且有可能會超過實際最小值。
隨機種子(Random seed)可以選擇鍵入一個整數值,將其用作種子。
耐性(Patience)所有的標準深度學習神經網絡結構如全連接多層感知機都很容易過擬合:當網絡在訓練集上表現越來越好,錯誤率越來越低的時候,實際上在某一刻,它在測試集的表現已經開始變差。如發現 loss 相比上一個 epoch 訓練沒有下降,則經過 patience 個 epoch 后停止訓練。默認是3
▌Score Image Model節點
為圖像模型評分。這個節點沒有需要配置的內容。
▌Evaluate Model節點
評估模型。評估模型返回的指標取決于您正在評估的模型類型:
分類模型
回歸模型
聚類分析模型
我們先了解下錯誤率和精度
真實情況 | 預測結果 | |
正例 | 反例 | |
正例 | 真正例(TP) | 假反例(FN) |
反例 | 假正例(FP) | 真反例(TN) |
錯誤率:分類錯誤的樣本數占樣本總數的比例。
精度:分類正確的樣本數占樣本總數的比例。
查準率:在所有的預測為正例的結果中,真正例所占的比率。真正例/(真正例+假正例)
召回率:在所有的正例中有多少被成功預測出來了。真正例/(真正例+假反例)
對應我們的模型,給出的結果是:
總體準確率(Overall Accuracy):每個類別的每個準確度的平均值
多分類微觀查準率(Micro Precision):所有類別預測對的數目/測試集的總數
多分類微觀召回率(micro recall):所有類別預測對的數目/測試集的總數
宏觀查準率(macro precision):該類別預測對的數目/預測為該類別的所有數目
宏觀召回率(macro recall):該類別預測對的數目/該類別所有的數目
結束語
到這里,Image Classification using DenseNet案例的分析我們完成了,在這個過程中,我們詳細的了解到各個節點的核心信息和相關的概念。從數據源、圖片分類、圖片預處理到訓練。也同時接觸到了大量的機器學習概念,本篇非常值得推薦作為Microsoft Azure Machine Learning Studio和機器學習的入門和深入讀物。
在這之后,我將繼續編寫其他Microsoft Azure Machine Learning Studio案例。每一篇案例都可以獨立閱讀,因此有些概念會重復出現在每一篇中。
*未經授權請勿私自轉載此文章及圖片。
微軟最有價值專家(MVP)
微軟最有價值專家是微軟公司授予第三方技術專業人士的一個全球獎項。29年來,世界各地的技術社區領導者,因其在線上和線下的技術社區中分享專業知識和經驗而獲得此獎項。
MVP是經過嚴格挑選的專家團隊,他們代表著技術最精湛且最具智慧的人,是對社區投入極大的熱情并樂于助人的專家。MVP致力于通過演講、論壇問答、創建網站、撰寫博客、分享視頻、開源項目、組織會議等方式來幫助他人,并最大程度地幫助微軟技術社區用戶使用 Microsoft 技術。
更多詳情請登錄官方網站:
https://mvp.microsoft.com/zh-cn
謝謝你讀完了本文!歡迎在評論區留言分享你的想法,并且轉發到朋友圈。
長按識別二維碼
關注微軟開發者MSDN
點擊「閱讀原文」加入微軟MVP~