微軟Microsoft Azure 機器學習工作室的案例之Image Classification using DenseNet

?點擊上方藍字

關注我們

(本文閱讀時間:10分鐘)

Microsoft Azure Machine Learning Studio是微軟強大的機器學習平臺,在設計器中,微軟內置了15個場景案例,但網上似乎沒有對這15個案例深度刨析的分析資料,所以我就計劃寫一個系列來完成。

既然是深度刨析,就不再是簡單的介紹操作,而是深入每一個細節,寧愿過度詳細擴展,也不簡單掃過。

微軟MVP實驗室研究員

b8561ad7c30bc3203e55f8b95910a43a.png

803188953077202da136fc8557487bc6.png

王豫翔,Leo

微軟圈內人稱王公子。微軟10年+MVP,大齡程序員。目前核心工作是使用微軟AI技術設計可以落地的解決方案,也就是寫PPT。雖然熱愛代碼,但只有午夜時分才是自由敲代碼的時間。喜歡微軟技術,不喜歡無腦照抄。

f65c9b249545e1a3288f6ee6bf99b1b7.png

這次我們刨析的案例是:使用 DenseNet 進行的圖像分類

預備知識

e75819d5f85ce8d65f76f4ed796fa342.png

▌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更適合大規模部署,特別是需要跨平臺和嵌入式部署時。

深入分析

5397236bcd7ab6b8f0b1d30f703c1065.png

這套案例一共十二個工作節點,但其中有兩組五個節點是一樣的。這個案例種不需要我們進行編碼,但提供了我們關于圖片分類訓練的最佳實踐,值得我們認真了解。我們逐個分析每一個節點中值得關注的細節和核心信息。

▌Animal Images Dataset節點

這個節點是數據的輸入,核心有兩個信息

  • Datastore name:azureml_globaldatasets是一個鏈接,點擊可以跳轉到數據存儲的位置

  • Relative path:描述在Datastore中當前文件的位置,默認是Images/Animals_Images_Dataset

點擊azureml_globaldatasets將跳轉到Datastore瀏覽器,您可以在這個瀏覽器下觀察到您存儲的數據。大致的界面如下

5e6fe6791b9bd83e89b4f6ff17081299.png

點擊這些圖片可以預覽

  • 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 機器學習設計器中的圖像分類等與圖像相關的任務中的標準化數據格式。

這個節點是把所有的圖片文件放到一個目錄下,不在通過目錄名稱將圖片分類

11828e6c5d2b8052237ece6e437d1307.png

但會用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):該類別預測對的數目/該類別所有的數目

結束語

335913b641f0eac1926977b44d351a31.png

到這里,Image Classification using DenseNet案例的分析我們完成了,在這個過程中,我們詳細的了解到各個節點的核心信息和相關的概念。從數據源、圖片分類、圖片預處理到訓練。也同時接觸到了大量的機器學習概念,本篇非常值得推薦作為Microsoft Azure Machine Learning Studio和機器學習的入門和深入讀物。

在這之后,我將繼續編寫其他Microsoft Azure Machine Learning Studio案例。每一篇案例都可以獨立閱讀,因此有些概念會重復出現在每一篇中。

*未經授權請勿私自轉載此文章及圖片。

微軟最有價值專家(MVP)

c8ef3d4bde5fc844d2b36d16570c65c3.png

微軟最有價值專家是微軟公司授予第三方技術專業人士的一個全球獎項。29年來,世界各地的技術社區領導者,因其在線上和線下的技術社區中分享專業知識和經驗而獲得此獎項。

MVP是經過嚴格挑選的專家團隊,他們代表著技術最精湛且最具智慧的人,是對社區投入極大的熱情并樂于助人的專家。MVP致力于通過演講、論壇問答、創建網站、撰寫博客、分享視頻、開源項目、組織會議等方式來幫助他人,并最大程度地幫助微軟技術社區用戶使用 Microsoft 技術。

更多詳情請登錄官方網站:

https://mvp.microsoft.com/zh-cn


470ec248114fbd3961dd9d4c017a375a.png

謝謝你讀完了本文!歡迎在評論區留言分享你的想法,并且轉發到朋友圈

b206d988adac714ed0b0bd49c49a1cc9.jpeg

長按識別二維碼

關注微軟開發者MSDN

3a5530c34450ba3c98d60901f03ff716.gif

點擊「閱讀原文」加入微軟MVP~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282359.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282359.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282359.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java小基礎之instanceof運算符

instanceof主要用來判斷一個類是否實現了某個接口,或者判斷一個實例對象是否屬于一個類。 1. 判斷一個對象是否屬于一個類 boolean result p instanceof Student; 2. 對象類型強制轉換前的判斷 Person p new Student(); //判斷對象p是否為Student類的實例 if(p in…

音樂分類

代碼: 1 import numpy as np2 from scipy import fft3 from scipy.io import wavfile4 from sklearn.linear_model import LogisticRegression5 import random6 """7 使用logistic regression處理音樂數據,音樂數據訓練樣本的獲得是使…

Problem C: 類的初體驗(III)

Description 定義一個類Data,只有一個double類型的屬性和如下4個方法: 1. 缺省構造函數,將屬性初始化為0,并輸出“Initialize a data 0”。 2. 帶參構造函數,將屬性初始化為指定參數,并輸出“Initialize…

Nginx- 實現跨域訪問

一、什么是跨域 跨域:由于瀏覽器的同源策略,即屬于不同域的頁面之間不能相互訪問各自的頁面內容。詳細見下表: 注:同源策略,單說來就是同協議,同域名,同端口 URL說明是否允許通信http://www.a…

不管對不對,先把鬧鐘關了再說

小榆提前關閉早上鬧鐘,幾乎工作日的早晨都是被這魔怔的鈴聲給拉扯醒,無論有多么不愿還是痛苦,可對這鬧鐘也無可奈何,就算一時果斷掐掉接下來是另一回麻煩事。最后一天,已經顧不得多少,沒什么令人懼怕的人或…

pycharm(windows)安裝及其設置中文菜單

pycharm(windows)安裝及其設置中文菜單 1.下載 在官網(http://www.jetbrains.com/pycharm/download/#sectionwindows)進行下載 或者到百度云進行下載 專業版:鏈接:http://pan.baidu.com/s/1bSSRds 密碼&…

Tomcat定義虛擬主機案例

Tomcat定義虛擬主機案例 作者:尹正杰 版權聲明:原創作品,謝絕轉載!否則將追究法律責任。 一.準備環境 1>.創建web程序的根目錄 [rootyinzhengjie ~]# mkdir -pv /home/yinzhengjie/data/www/webapps/ROOT mkdir: created direc…

node服務成長之路

我們的系統也從第一代平臺開始到現在第四代平臺更換中,對這四代平臺做一個簡單的介紹: 第一代平臺,主要是集中式,以快速上線為目的;第二代平臺主要是分布式改造,緩解各服務壓力;第三代平臺主要做…

將域名綁定到ip上,并實現訪問不同二級子域名對應不同目錄

一、將域名綁定到ip上1、環境介紹:阿里云服務器ESC(美國硅谷) 2、購買域名 3、備案 注:由于我買的是美國地區服務器,所以不用備案,如果買的國內服務器,這里需要添加一個備案操作。 4、域名實名認…

ABP vNext微服務架構詳細教程(補充篇)——單層模板(中)

框架搭建2聚合服務這里我們將聚合服務命名為Domain.Core和基礎服務層一致,我們先通過命令創建單層模板項目Domain.Core,這里我們刪除wwwroot、Data、Entities、Localization、ObjectMapping文件夾及其所有子文件,并刪除package.json文件和Ser…

談一談synchronized關鍵詞

1.使用 java中的每一個對象都可以作為synchronized的鎖進行代碼同步,常見的形式 同步代碼塊鎖是synchronized括號內的對象普通成員方法上,鎖是當前的對象,synchronized(this)靜態方法上,鎖是當前類的Class對象2. 原理 synchronize…

系統學習redis之二——redis集群搭建

redis單點部署: 安裝命令: # cd /usr/local/ # wget http://download.redis.io/releases/redis-4.0.1.tar.gz #下載安裝包 # yum -y install gcc psmisc #安裝依賴包 # tar xf redis-4.0.1.tar.gz # cd /usr/lo…

業務技術協同線上化的研發管理實戰

摘要:2017年1月13日舉辦的【云棲計算之旅】線下沙龍第4期研發管理專場,阿里巴巴B2B事業群產品專家代平為大家帶來了題為業務技術協同線上化的研發管理實戰的演講。本文主要從管理產品研發的理念開始談起,著重說明了云效指揮部的六大步驟&…

Linux中寫腳本,同時去開啟我們自己設定的多個服務(含定時腳本實現)

場景介紹: 在Linux中,我們通常開啟服務需要使用systemctl start 服務名 命令,這樣,如果開啟一個服務還好,但是如果同時開啟多個服務,難免會感到麻煩,這時,我們可以自定義一個腳本&a…

Android之利用EventBus進行數據傳遞

在項目中,不可避免的要在兩個頁面之間進行數據的傳遞,就算不傳遞,也需要進行刷新之類的,我們根據Google提供的庫類方法,也是可以做的,主要有廣播broadcastreceiver,startactivity方法或者是appl…

負載均衡環境搭建實戰之nginx和tomcat

Linux基本環境負載均衡的環境需要在linux下搭建完成,所以有一個基礎的linux系統是必須的,這里建議大家按照http://edu.51cto.com/course/10209.html中的基礎linux環境來安裝,這樣能少走彎路。JDK安裝1、 下載對應版本的Java1.7,a)…

Java java.lang.SecurityException: Prohibited package name

java.lang.SecurityException: Prohibited package name 提示java錯誤: Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.xxx 問題所在:package java.xx; 定義包時不能以java.的形式定義轉載于:https…

桌面應用如何判斷win11操作系統

背景Windows 11 操作系統已經正式發布快有一年了,在 .Net 開發中,我們獲取操作系統版本,經常使用 Environment.OSVersion.Version.Major 和 Minor(6.1 Windows 7, 10.0 Windows 10),但是當 Win11 出現以后…

Nginx 網站定義自己的錯誤頁面

場景: 為了給用戶較好的交互和感官,我們通常需要對錯誤頁面進行友好提示。 環境介紹: LNMP(linux(centos7.4)Nginx Mysql5.6 php7.0)實現: 這里,我直接對nginx的子配置文…

Python中的變量

1、聲明變量: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 namewupeiqi 上述代碼聲明了一個變量,變量名為:name,變量name的值為“wupeiqi” 變量的作用: 為了方便操作,需要把這些數據分別用一個簡…