如何用卷積神經網路構建圖像?
原標題 |Everything you need to know to master Convolutional Neural Networks
作者 |Tirmidzi Faizal Aflahi
譯者 | pzSuen(哈爾濱工業大學)、AI小山(工程師)、Brains(前端開發工程師)
來自Pix2PixHD
那不是一張真實照片,你可以在新的標籤頁中打開並放大圖片,看到馬賽克了沒?
這張圖片其實是由一個叫人工智慧的程序生成的。是不是看起來很真實?非常不錯,不是嗎?
這種技術由Alex Krizhevsky和朋友們通過ImageNet比賽而公諸於世,到現在才僅僅七年時間。這個競賽是每年舉行一次的計算機視覺比賽,競賽內容是把圖片分成1000種不同的分類。從阿拉斯加雪橇犬到衛生紙。Alex和朋友們建立了一個叫AlexNet的東西,它以遠超第二名的成績贏得了比賽。
這種技術叫作卷積神經網路,它是在圖像處理方面表現出卓越的深度神經網路的一個分支。
來自ImageNet
上圖是幾年前贏得比賽的軟體所產生的錯誤率,人類的錯誤率是5%。2016年,它的表現實際上已經優於人類了。
把深度學習引入到這個領域,已不僅僅是突破性的,而是革命性的了。
卷積神經網路架構
那麼,這個技術的原理是什麼呢?
卷積神經網路表現好於其它深度神經網路架構,是得益於它獨特的處理方式。CNN並不每次只處理一個像素,而是把幾個像素組合在一起(就像上圖中3×3像素的例子),因此它能發現時序模式。
換句話說,CNN能「看到」像素群如何形成直線或曲線。因為深度神經網路天然包含多個層級,在下一層,CNN看到的不再是像素群,而是直線和曲線群如何組成某些形狀。一步步下去,直到它們構成了完整的圖像。
深度卷積神經網路,由Mynepalli提供
想要了解CNN,你必須要學習很多東西,需要從很基礎的知識開始,比如內核、池化層等等。但是,如今你可以一頭扎進這門技術的眾多開源項目中,並使用它們。
因為一種叫「遷移學習」的技術,使得這種做法確實有效。
遷移學習
遷移學習是一種技術,它把在另外一個特定領域訓練好的深度學習模型拿來複用。
舉個例子,假如你在一家火車管理公司工作,你打算檢查你們的火車是否準點,但你不想為這件事增加人手。你可以復用一個ImageNet的卷積神經網路模型,也許是ResNet(2015年的獲勝者),然後用你的火車車隊的圖片重新訓練網路。這樣就可以解決問題了。
用遷移學習,有兩個主要的競爭優勢。
相比從頭開始訓練,只需要較少圖片就能達到良好效果。ImageNet競賽有大約一百萬張圖片用於訓練。使用遷移學習,你可以只用1000張或者甚至100張圖片,而且效果良好,因為模型已經用那一百萬張照片訓練過了。
取得好效果所需時間更少。要做到ImageNet的水平,你要花好多天來訓練網路,這還不包括效果不好時修改網路所需的時間。使用遷移學習,對於某些任務來說,你只要花幾個小時甚至幾分鐘就完成訓練。大大節省了時間。
從圖像分類到圖像生成
有了遷移學習之後,很多構想產生了。如果你能處理圖像,並且告訴我們圖像里的內容是什麼,那能不能自己生成圖像呢?
我們接受挑戰!
下面是生成對抗網路登場!
CycleGAN 由Jun-Yan Zhu提供
這項技術能夠在獲得一些輸入後,生成圖片。
只要給它一種叫CycleGAN的類型的繪圖——我已經上面的照片中提供給你,它就能生成真實的照片。在另一個用例中,給出一些草圖,它能生成一個袋子的圖片。它還可以從低解析度照片中生成高解析度的照片。
超解析度生成對抗網路
很神奇,對吧?
當然是的。而你現在就可以開始學習生成這種圖片了。你接下來該怎麼做呢?
卷積神經網路教程
那麼,讓我們開始吧。你會發現開始學習這門課程非常容易,容易到爆。但完全掌握它又是另外一回事。
我們現在暫時把完全掌握放到一邊。
瀏覽幾天後,我發現這個項目非常適合你入門。
仙人掌空中識別
本教程中的項目來自Kaggle。你的任務是從航空照片中識別是否有柱狀仙人掌存在。
很簡單,不是嗎?
給你17,500張圖片進行操作,需要標註4,000張尚未標註的圖片。如果全部4,000張圖片被你的程序正確標註,你的得分將是1或100%。
仙人掌
圖片跟你在上面看到的很像。一塊區域的照片里,可能有或沒有柱狀仙人掌,照片是32×32像素的。因為是航空照片,所以照片里的仙人掌有不同的角度。
那麼,你還需要什麼?
使用Python的卷積神經網路
Python,一種用於深度學習的流行語言。針對此語言,有很多深度學習框架可供選擇,你實際上可以對每個選擇進行反覆試驗 。下面是幾個常用的深度學習框架:
Tensorflow,最受歡迎的深度學習庫。由谷歌的工程師建造,擁有最大的貢獻者基礎和大多數粉絲。由於社區規模如此之大,您可以輕鬆找到問題的解決方案。它將Keras作為高級抽象包裝器,對新手來說非常容易入門。
Pytorch。我最喜歡的深度學習庫。純粹基於Python構建並遵循Python的優缺點。Python開發人員將非常熟悉這個庫。它有另一個名為FastAI的庫,它提供了Keras對Tensorflow的抽象。
MXNet。Apache的深度學習庫。
Theano。Tensorflow的前身
CNTK。微軟自己的深度學習庫。
在本教程中,讓我們使用我最喜歡的一個深度學習框架,Pytorch,以及其抽象FastAI。
在開始之前,你需要安裝Python。前往Python網站下載你所需的內容。你需要確保安裝版本3.6 ,否則你使用的庫將可能不支持它。
現在,打開命令行或終端並安裝這些東西:
Numpy包用於存儲輸入圖像,pandas包用於處理CSV文件,Jupyter notebook是用Python編輯器。
然後,前往Pytorch官網下載相應版本的Pytorch。為了加速訓練速度,你可能需要下載相應的CUDA版本,但是要確保你的Pytorch版本在1.0以上。
然後,安裝torchvision和FastAI:
在命令行或者終端輸入jupyter notebook打開Jupyter,它會顯示在瀏覽器中。
現在,你已經準備妥當了。
數據準備
導入必要的代碼:
Numpy和Pandas庫基本上所有任務都需要導入,FastAI和Torch是深度學習庫,Matpoltlib Inline 用於顯示圖表。
現在,從比賽網站下載數據文件。
解壓zip壓縮包到jupyter notebook的目錄下。
假設你的notebook文件名是Cacti,那麼你的目錄結構將如圖所示:
train文件夾含有你訓練時用到的所有圖片。
test文件夾包含提交時要用的到所有圖片。
train.csv文件包含所有的訓練數據:如果某圖片中含有仙人掌,則該圖片名對應的行中has_cactus欄位將為1,否則為0。
sample_submission.csv文件中含有提交格式。文件名對應於test文件中所有圖片的名字。
把train.csv文件載入到一個data frame中。
使用ImageList中的from_df方法創建一個載入器來將train_df中的data frame與train文件夾中的圖片關聯起來。
數據增強
這是一種從已有數據生成更多數據的方法。一隻貓的圖片垂直翻轉之後還是一直貓。通過這種方法,你可以獲得兩倍,四倍,甚至十六倍的數據。
如果你的數據量比較少的話,你可以使用這種方法。
FastAI提供了一個叫做get_transform的方法可以很好的完成該任務。你可以對圖片進行垂直翻轉,水平翻轉,旋轉,縮放,補光,扭曲。
你可以通過運行上面代碼來查看這些參數的增強效果,或者你也可以查看通過查看官方文檔來詳細閱讀相關說明。
當然,需要在你的數據集上運用該變換:
參數size是為了調整圖像大小以適應網路輸入。我使用的網路是獲得2017年ImageNet最好論文獎的DenseNet,其輸入大小為128 x 128.
訓練準備
載入數據之後,需要對數據進行預處理才能開始進行訓練。訓練,可以說成是神經網路在學習,為了在你的數據集上獲得好的性能,它從你的數據中學習,並進行自我更新。
-
為了檢測訓練性能,你需要從你的訓練數據中劃分出來一小部分作為驗證集。訓練時不能採用驗證集數據,因為它需要用於驗證網路性能。如果你的CNN能夠在驗證集上獲得較好性能,說明其具有較好的泛化能力,同樣能在測試集上獲得較好性能。
FastAI提供了一個叫做split_by_rand_pac的方法可以很方便的劃分驗證集。
它也包含一個叫做databunch的方法用於batch的處理。由於我的GPU顯存限制,我採用的batch大小為64。如果你沒有GPU,請刪去device這個參數。
然後,由於你需要採用預訓練好的網路,因此你需要採用一個叫做normalize的方法正則化你的圖片。參數image_stats是為了按照ImageNet競賽中預訓練網路的規則化方式規則化你的圖片。
把測試集數據加入訓練集列表的目的是為了在預測時不再進行預處理。但是,請記住訓練集數據不會用於訓練,也不會歸為驗證集。這樣做只是為了使所有數據採用相同的規則化方式。
準備好訓練數據之後,你可以使用cnn_learner創建一個訓練方法。正如前面所說,我使用DenseNet作為預訓練好的網路。你也可以使用TorchVision提供的其他網路
單循環技術
現在可以開始訓練了。但是當訓練所有DNN和CNN的時候,都會有這樣一個疑惑,學習率選多大呢?有一個演算法叫做梯度下降,它能隨著學習率減小誤差。
如果學習率過大,可能傾向于越過邊界。想左圖顯示的那樣,這可能導致誤差非常大。但是如果學習率過小,訓練會非常慢,但是誤差不會失控。
因此,選擇正確的學習率至關重要,要選取一個足夠大、但不會大到使誤差失控的學習率。
說起來容易,做起來難。
因此,一個叫做Leslie Smith的人提出了一個稱為1-cycle的方法。
從直覺上講,您可能希望找到/蠻力的幾種學習速度,並找到一個錯誤幾乎最小,但仍有一些改進空間的學習速度。讓我們在代碼中嘗試一下。
它會列印出下面的東西:
最小值應為10 -1。所以,我認為我們可以使用比這更小的東西,但不能太小。也許3 * 10 - 2是個不錯的選擇。我們來試試吧!
訓練幾個步驟(我選擇5,不要太大也不要太小),讓我們看看結果。
等等,什麼!?
我們的簡單解決方案為我們的驗證分割提供100%的準確性!它實際上是有效的。它只需要6分鐘的訓練。真是太幸運啦!在現實生活中,您將進行多次迭代,以找出哪些演算法比其他演算法做得更好。
我很想提交!哈哈。讓我們預測測試文件夾並提交結果。
由於您已將測試圖像放在訓練圖像列表中,因此無需預處理和載入測試圖像。
此行將創建一個包含圖像名稱的CSV文件,並為所有4,000個測試圖像提供一個cactus(仙人掌)列
當我嘗試提交時,我發現你需要通過Kaggle內核提交CSV。我錯過了!
由Kaggle提供
但是,幸運的是,Kernel(內核)實際上與你的jupyter notebook相同。你可以複製粘貼所有你在筆記本上創建的東西並提交到那裡。
和BAM!
太棒了我的公共分數是0.9999。這是很好的。但是,當然,如果我的第一次嘗試是那樣的話,我想要得到一個完美的分數。
我做到了!所以你也能,其實也沒有那麼難。
(順便說一句,這個排名是在4月13日,所以我可能會放棄我的排名...)
個人經驗
這個問題很簡單。所以你在解它的時候不會遇到任何奇怪的挑戰。這使得它會成為最適合入門的項目之一。
唉,因為很多人在這方面得到了完美的分數,我認為管理員需要為提交創建另一個測試集,也許這很難。
不管什麼原因,你都需要去嘗試一下。你現在就可以試試,效果可能會很好噢~
最後思考
卷積神經網路(CNN)對各種任務都很有幫助,從圖像識別到生成圖像,現在分析圖像不像以前那麼困難了。當然,你都要去嘗試一下。
開始吧,選擇一個好的卷積神經網路項目,然後,得到一個好的數據。
好運!
文章最初發布在 thedatamage網站上。
本文編輯:王立魚
英語原文:https://www.freecodecamp.org/news/everything-you-need-to-know-to-master-convolutional-neural-networks-ef98ca3c7655/
※全球學生開源年會 SOSCONF 2019 招募志願者
※20分鐘了解TensorFlow基礎
TAG:AI研習社 |