數據增強:數據有限時如何使用深度學習?(續)

翻譯 | 趙朋飛 塗世文 整理 | 吳璇

這篇文章是對深度學習數據增強技術的全面回顧,具體到圖像領域。這是《在有限的數據下如何使用深度學習》的第2部分。點擊這裡查看第1部分《NanoNets :數據有限時如何應用深度學習?》。

数据增强:数据有限时如何使用深度学习?(续)

這些情況我們都經歷過。你精通機器學習的相關概念,並能將其應用於機器學習模型。打開瀏覽器搜索相關數據,很可能會找到一系列數據以及上百幅相關照片。

你會想起大部分流行的數據集擁有數以千計的圖片(甚至更多)。你也會想起有人曾說過擁有大規模的數據集對性能至關重要。你會感到失望,非常想知道:在有限的數據量下,頂級神經網絡能不能很好地工作?

回答是肯定的,但在見證奇蹟之前,我們需要思考一些基本問題。

為什麼需要大量的數據

数据增强:数据有限时如何使用深度学习?(续)

常用的神經網絡的參數數量。

當你訓練一個機器學習模型時,你實際做工作的是調參,以便將特定的輸入(一副圖像)映像到輸出(標籤)。我們優化的目標是使模型的損失最小化, 以正確的方式調節優化參數即可實現這一目標。

成功的神經網絡擁有數以百萬計的參數!

自然,如果你有大量參數,就需要提供你的機器學習模型同比例的實例,以獲得優秀的性能。你需要的參數數量與需要執行的任務複雜性也成比例。

在沒有大量數據情況下,如何獲取更多數據?

其實,你並不需要添加大量的圖像到你的數據集,為什麼? 因為,神經網絡從一開始就不是智能的,例如,缺乏訓練的神經網絡會認為下面這3個網球是不同的、獨立的圖像。

数据增强:数据有限时如何使用深度学习?(续)

完全一樣的網球,神經網絡的解釋卻不同。

所以,為了獲得更多數據,我們僅需要對已有的數據集做微小的調整。比如翻轉、平移或旋轉。神經網絡會認為這些數據是不同的。

数据增强:数据有限时如何使用深度学习?(续)

運動中的數據增強

一個卷積神經網絡有一個稱作不變性的性質,即使卷積神經網絡被放在不同方向上,它也能進行對象分類。更具體的說,卷積神經網絡對平移、視角、尺寸或照度(或以上組合)保持不變性。

這就是數據增強的本質前提。在現實世界中,我們可能會有一組在有限的條件下拍攝的圖像 。但是,我們的目標應用可能是在多變的環境中,例如,不同的方向、位置、比例、亮度等。我們通過使用經綜合修改過的數據來訓練神經網絡,以應對這些情形。

即使擁有大量數據,再增強數據也是有幫助的嗎?

當然。這會有助於增加數據集中相關數據的數量。 這與神經網絡的學習方法相關,讓我通過一個例子來說明。

数据增强:数据有限时如何使用深度学习?(续)

假設數據集中的兩個類。左邊的代表品牌A(福特),右邊的代表品牌B(雪佛蘭)。

假設完成了訓練,並且輸入上面的圖像,即品牌A。但是你的神經網絡輸出認為它是品牌B的汽車!使用先進的神經網絡不是應該有95%的正確率嗎?我不是誇大其詞,類似的事情在過去也發生過。

数据增强:数据有限时如何使用深度学习?(续)

福特汽車(品牌A),但面向右側。

為什麼會發生這種現象?因為這是大多數機器學習算法就是這麼工作的。它會尋找區分一個類和另一個類的最明顯特徵。在這個例子中 ,這個特徵就是所有品牌A的汽車朝向左邊,所有品牌B的汽車朝向右邊。

神經網絡的好壞取決於輸入的數據。

我們如何預防這種現象發生? 我們需要減少數據集中不相關特徵的數量。對上面的汽車類型分類器來說,一個最簡單的解決辦法就是為數據集中的每種類別都添加朝向不同方向的汽車照片。更好的辦法是,你只需要將現有的數據集中的照片水平翻轉,使汽車朝向另一側。現在,用新的數據集訓練神經網絡,你就會得到你想要的結果。

通過增強數據集,可以防止神經網絡學習到不相關的模式,根本上提升整體性能。

準備開始

在我們深入研究各種增強技術之前,我們必須先考慮一個問題。

在機器學習過程中的什麼位置進行數據增強?

答案相當明顯:在向模型輸入數據之前增強數據集,對嗎?是的,但你有兩個選項,一個是預先進行所有必要的變換,從根本上增加數據集的規模。另外一個是小批量執行變換,僅僅在輸入機器學習模型之前。

第一項被稱為離線增強。這個方法常被用於相對較小的數據集。因為你最終會通過一個與執行的轉換數量相等的因子來增加數據集的大小(例如,通過翻轉所有圖像,數據集數量會增加2倍)。

第二個選項稱為在線增強,或稱為動態增強。主要應用於規模較大的數據集,因為你無法負擔數據量爆炸性增長。反而,你可以通過對即將輸入模型的小批量數據的執行相應的變化。很多機器學習架構已經支持在線增強,並可以利用GPU進行加速。

常用的增強技術

在這一節,我們將介紹一些基礎但功能強大的增強技術,這些技術目前被廣泛應用。在我們講述這些技術之前,為簡單起見,讓我們做一個假設,即我們不需要關心圖片邊界之外的東西。如果使用下面的技術,我們的假設將是有效的。

如果使用的技術關注圖像邊界之外的區域,將會發生什麼呢?在這種情況下,我們需要插入一些信息。在討論完數據增強的類型後我們在詳細討論這一問題。

我們為每個技術都定義了一個增強因子,用以增強數據集(也成為數據增強因子)。

1. 翻轉

你可以水平或垂直翻轉圖像。一些架構並不支持垂直翻轉圖像。但,垂直翻轉等價於將圖片旋轉180再水平翻轉。下面就是圖像翻轉的例子。

数据增强:数据有限时如何使用深度学习?(续)

從左側開始分別是:原始圖像,水平翻轉圖像,垂直翻轉圖像。

可以通過執行下面的命令完成圖像翻轉。

数据增强:数据有限时如何使用深度学习?(续)

2. 旋轉

關於這個操作,需要注意的一個關鍵問題是,在旋轉之後,圖像維度可能不會被保留。如果是正方型圖像,旋轉90度之後圖像的尺寸會被保存。如果圖像是長方形,旋轉180度之後圖像尺寸也會保存。 但用更小的角度旋轉圖像,將會改變最終圖像的尺寸。在下面的章節中我們將會看到如何解決這個問題。下面是方形圖像旋轉90度的例子。

数据增强:数据有限时如何使用深度学习?(续)

當我們從左到右移動時,圖像相對於前一個圖像順時針旋轉90度。

你可以執行下面的任一命令完成圖像旋轉。 數據增強因子 = 2 到 4x

数据增强:数据有限时如何使用深度学习?(续)

3. 縮放

圖像可以被放大或縮小。放大時,放大後的圖像尺寸會大於原始尺寸。大多數圖像處理架構會按照原始尺寸對放大後的圖像進行裁切。我們將在下一章節討論圖像縮小,因為圖像縮小會減小圖像尺寸,這使我們不得不對圖像邊界之外的東西做出假設。下面是圖像縮放的例子。

数据增强:数据有限时如何使用深度学习?(续)

從左邊開始分別為:原始圖像,圖像向外縮放10%,圖像向外縮放20%。

通過下面的命令執行圖像縮放。數據增強因子=任意。

数据增强:数据有限时如何使用深度学习?(续)

4. 裁剪

與縮放不同,我們隨機從原始圖像中採樣一部分。然後將這部分圖像調整為原始圖像大小。這個方法更流行的叫法是隨機裁剪。下面是隨機裁剪的例子。如果你靠近了看,你會注意到裁剪和縮放兩種技術之間的區別。

数据增强:数据有限时如何使用深度学习?(续)

從左側開始分別為:原始圖像,從左上角裁剪出一個正方形部分,然後從右下角裁剪出一個正方形部分。剪裁的部分被調整為原始圖像大小。

通過下面的TensorFlow命令你可以執行隨機裁剪。 數據增強因子=任意。

数据增强:数据有限时如何使用深度学习?(续)

5. 平移

平移是將圖像沿X或Y方向(或者同時沿2個方向)移動。在下面的例子中, 我們假設在圖像邊界之外是黑色的背景,也同步被移動。這一數據增強方法非常有用,因為大多數對象有可能分佈在圖像的任何地方。這迫使你的卷積神經網絡需要看到所有地方。

数据增强:数据有限时如何使用深度学习?(续)

從左側開始分別為:原始圖像,圖像翻轉到右側,圖像向上翻轉。

在TensorFlow中,可以通過如下命令完成圖像平移。數據增強因子=任意。

数据增强:数据有限时如何使用深度学习?(续)

6. 高斯噪聲

過擬合(Overfitting)經常會發生在神經網絡試圖學習高頻特徵(即非常頻繁出現的無意義模式)的時候,而學習這些高頻特徵對模型提升沒什麼幫助。

那麼如何處理這些高頻特徵呢?一種方法是採用具有零均值特性的高斯噪聲,它實質上在所有頻率上都能產生數據點,可以有效的使高頻特徵失真,減弱其對模型的影響。

但這也意味著低頻的成分(通常是你關心的特徵)同時也會受到影響,但是神經網絡能夠通過學習來忽略那些影響。事實證明,通過添加適量的噪聲能夠有效提升神經網絡的學習能力。

一個“弱化”的版本是椒鹽噪聲,它以隨機的白色和黑色像素點呈現並鋪滿整個圖片。這種方式對圖像產生的作用和添加高斯噪聲產生的作用是一樣的,只是效果相對較弱。

数据增强:数据有限时如何使用深度学习?(续)

從左側開始分別為:原始圖像,增加了高斯噪聲的圖像,添加了椒鹽噪聲的圖像。

在 TensorFlow 中,你可以使用以下的代碼給圖片添加高斯噪聲。數據增強因子(Data Augmentation Factor)= 2x。

数据增强:数据有限时如何使用深度学习?(续)

高級增強技術

現實世界中,自然狀態下的數據,存在於各種各樣的狀況之中, 不能用上述簡單的方法來處理。例如, 進行照片中的景觀識別的任務。景觀可以是任何自然中的東西:冰凍寒帶草原、草原、森林等等。聽起來像是個很直接的分類任務對吧?基本沒問題,除了一件事外。我們忽略了照片中的一個關鍵特徵, 而這個特徵將會影響到模型的表現——照片拍攝的季節。

如果我們的神經網絡不明白某些景觀可以存在於各種條件下(雪、潮溼、明亮等), 它可能會錯誤地將冰凍的湖畔標記為冰川或者把沼澤標記為溼地。

緩解這種情況的一種方法是添加更多的圖片,這樣我們就可以解釋所有季節性變化。但這是一項艱鉅的任務。擴展我們的數據增強概念,想象一下,人為地產生不同季節的效果會有多酷?

條件型生成對抗網絡,瞭解一下

並不用深入瞭解繁雜的細節,條件型生成對抗網絡就能將一張圖片從一個領域轉換到另一個領域中去。假如你覺得這聽上去太模稜兩可了,它本身並不是這樣;事實上這是一種強大的神經網絡 ! 下面是一個應用條件型生成對抗網絡(Conditional GANs)將夏日風光的圖片轉換為冬季風景的例子。

数据增强:数据有限时如何使用深度学习?(续)

用CycleGAN 改變季節

(Github: https://junyanz.github.io/CycleGAN/)

上述方法是魯棒的(Robust), 但是屬於計算密集型,需要耗費大量的計算性能。一個更廉價的選擇是所謂的神經風格遷移(Neural Style Transfer)。它抓住了一個圖像的紋理/氣氛/外觀 (又名, "風格"), 並將其與其他內容混合在一起。使用這種強大的技術, 我們產生的效果類似於我們的條件型生成對抗網絡所產生的效果(事實上, 這個方法是在 cGANs 發明之前就被提出來了!)。

這種方法唯一的缺點在於輸出結果看起來太有藝術感了,以至於顯得不那麼真實。但是,在譬如深度學習的圖像風格轉換方面還是具有獨特的優勢,至少它的輸出結果給人留下了深刻印象。

数据增强:数据有限时如何使用深度学习?(续)

深度照片風格轉移。

注意如何在數據集上產生我們想要的效果。

由於我們並不關注其內部的工作原理,所以我們沒有深入探索這些技術。事實上,我們可以使用現有訓練好的模型再加上一點遷移學習的“神奇力量”來進行數據增強。

插值簡介

如果想平移一個沒有黑色背景的圖像時候該怎麼辦?向內部縮放呢?旋轉一個特定的角度?在完成這些變換之後,我們需要保持原始圖像的大小。由於我們的圖像沒有包含其邊界之外的區域的任何信息,我們得做一些假設。一般來說,我們會假定圖像邊界之外的部分的每一個像素點的值都是常數 0 (RGB值為 0 表示黑色)。這樣,在對圖像進行變換之後,在圖像沒有覆蓋的地方會得到一塊黑色的區域。

数据增强:数据有限时如何使用深度学习?(续)

從左側開始分別為:逆時針旋轉45度的圖像,右側翻轉的圖像和向內縮放的圖像。

但是,那個假設是不是就一定正確呢?在現實世界中,大多數情況下那個假設是不適用的。圖像處理和機器學習框架提供的一些標準的處理方式,你可以決定如何填充未知的空間。

從左側開始分別為:常數,邊緣,反射,對稱和包裹模式。

它們的定義如下:

1. 常量填充

最簡單的插值方法是用某個常量值填充未知區域。這可能不適用於自然圖像, 但可以用於在單色背景下拍攝的圖像。

2. 邊緣擴展

將圖像邊緣的值擴展到邊界以外。這個方法可用於輕微的平移的圖像。

3. 反射

圖像像素值沿圖像邊界進行反射。這種方法對於包含樹木、山脈等的連續或自然背景是有用的。

4. 對稱

此方法類似於反射,除了在反射邊界上進行邊緣像素拷貝。通常,反射和對稱可以交替使用,但在處理非常小的圖像或圖案時,差異將是可見的。

5. 包裹

在超出圖像邊界的部分重複填充圖像,彷彿在進行圖像平鋪。這種方法不像其他的那樣普遍使用, 因為它對很多場景都沒有意義。

除此之外,你還可以設計自己的方法來處理未定義的空間, 但通常以上這些方法對大多數分類問題都有很好的效果。

使用了這些所有的技術,能保證機器學習算法的魯棒性嗎?

如果你用的是正確的方法,那這個問題的答案是 Yes ! 什麼?你問正確方法是什麼?嗯,有時不是所有的增強技術都對數據集有意義。再考慮一下我們的汽車例子。下面是可以修改圖像的一些方法。

数据增强:数据有限时如何使用深度学习?(续)

第一個圖像(從左邊開始)是原始圖像,第二個圖像是水平翻轉的,第三個圖像旋轉了180度,最後一個圖像旋轉了90度(順時針)。

當然, 他們是同一輛車的照片, 但你的目標應用可能永遠不會看到在這些方向的汽車。

例如,如果你要分類在路上的隨機車輛,只有第二個圖像對數據集來說是有意義的。但是,如果你擁有一家處理車禍的保險公司,而你也想識別車禍中顛倒的、撞壞的車, 那麼第三張圖片是有意義的。最後一個圖像可能對上述兩種情況都沒有意義。

關鍵是, 在使用增強技術的同時,我們必須確保不增加無關的數據.。

這樣做真的值得嗎?

你也許正期待著能有一些結果來。有道理,我也做了這一點。讓我先通過一個小示例來證明數據增強的確能夠產生作用。不信的話,你可以復現這個實驗來驗證。

讓我們創建兩個神經網絡, 將數據分類到四類中的一個: 貓、獅子、豹或者老虎。區別在於,一個不會使用數據增強,而另一個將使用數據增強。可以從此鏈接下載數據集。

如果你查看了數據集,你會發現裡面訓練集和測試集中每一類都只有50張圖片。很明顯,我們不能對特定的一個分類器使用增強技術。公平起見,我們使用遷移學習讓模型能夠應對數據稀缺問題。

数据增强:数据有限时如何使用深度学习?(续)

數據庫裡的四個分類

對於沒有進行數據增強的神經網絡,我們將使用 VGG19 網絡結構。在參考這個 VGG19 實現的基礎上,我用TensorFlow實現了我們的第一個神經網絡。一旦你克隆了我的Github Repo, 你就可以從這裡得到數據集以及從這裡下載 VGG19. npy (用於遷移學習) 。完成上述工作後,就可以運行模型來驗證性能了。

不過, 為數據增強編寫額外的代碼確實是費時費力的工作。所以, 構建我們的第二個模型過程中,我使用了 Nanonets。它內部實現了轉移學習和數據擴充,可以用最少的數據量提供最佳的結果。所有你需要做的只是上傳的數據到他們的網站,並等待他們的服務器訓練完畢就可以了(通常約30分鐘)。你要知道,這對我們進行對比實驗多麼完美。

完成訓練後,你可以對其 API 請求調用來計算測試的準確性。你可以在GitHub repo中找到對應的示例代碼片段 (不要忘記在代碼段中插入模型的 ID)。

對比結果令人印象深刻不是嗎?事實上,大多數模型在更多的數據上可以表現更良好。為了提供一個具體的證明,可仔細看看下面這張表。它顯示了 Cifar 10 (C10) 和 Cifar 100 (C100) 數據集上常用的神經網絡的錯誤率。C10+ 和 C100+ 列是進行數據增強後的錯誤率。

数据增强:数据有限时如何使用深度学习?(续)

Cifar 10 和 Cifar 100 數據集上的表現

雷鋒網雷鋒網

数据增强:数据有限时如何使用深度学习?(续)


分享到:


相關文章: