用於回歸的 CNN 架構?
我一直在研究一個回歸問題,其中輸入是圖像,標籤是 80 到 350 之間的連續值。這些圖像是一些化學物質發生反應後的圖像。結果顯示的顏色表示剩餘的另一種化學物質的濃度,這就是模型要輸出的 - 該化學物質的濃度。圖像可以旋轉、翻轉、鏡像,並且預期的輸出應該仍然相同。這種分析是在真實的實驗室中完成的(非常專業的機器使用顏色分析輸出化學物質的濃度,就像我正在訓練這個模型一樣)。
到目前為止,我只嘗試了大致基於 VGG(conv-conv-conv-pool 塊的多個序列)的模型。在嘗試更新的架構(Inception、ResNets 等)之前,我想我會研究是否有其他更常用於使用圖像進行回歸的架構。
數據集如下所示:
該數據集包含大約 5,000 個 250x250 樣本,我已將其大小調整為 64x64,因此訓練更容易。一旦我找到了一個有前途的架構,我將嘗試使用更高分辨率的圖像。
到目前為止,我最好的模型在訓練集和驗證集上的均方誤差約為 0.3,這在我的用例中遠遠不能接受。
到目前為止,我最好的模型如下所示:
// pseudo code x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu() x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu() x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu() x = maxpool(x, size=[2,2], stride=[2,2]) x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu() x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu() x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu() x = maxpool(x, size=[2,2], stride=[2,2]) x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu() x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu() x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu() x = maxpool(x, size=[2,2], stride=[2,2]) x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu() x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu() y = dense(x, units=1) // loss = mean_squared_error(y, labels)
問題
圖像輸入的回歸輸出的合適架構是什麼?
編輯
我已經改寫了我的解釋並刪除了對準確性的提及。
編輯 2
我已經重組了我的問題,所以希望很清楚我在追求什麼
首先是一個一般性的建議:在開始對您不熟悉的主題進行實驗之前,先進行文獻搜索。你會為自己節省很多時間。
在這種情況下,查看現有論文,您可能已經註意到
- CNN 已被多次用於回歸:這是經典但已經過時了(是的,在 DL 中已經過時了 3 年)。更現代的論文不會使用 AlexNet 來完成這項任務。這是較新的,但它是針對更複雜的問題(3D 旋轉),無論如何我不熟悉它。
- 使用 CNN 進行回歸併不是一個簡單的問題。再看第一篇論文,你會發現他們有一個問題,他們基本上可以生成無限數據。他們的目標是預測校正 2D 圖片所需的旋轉角度。這意味著我基本上可以通過將每個圖像旋轉任意角度來獲取我的訓練集並增強它,我將獲得一個有效的、更大的訓練集。因此,就深度學習問題而言,這個問題似乎相對簡單。順便說一下,注意他們使用的其他數據增強技巧:
我們使用平移(最多為圖像寬度的 5%)、[−0.2, 0.2] 範圍內的亮度調整、γ ∈ [−0.5, 0.1] 的伽馬調整和標準偏差在 [0] 範圍內的高斯像素噪聲, 0.02]。
我不太了解您的問題,無法說明在實驗室中仔細拍攝的照片考慮位置、亮度和伽馬噪聲的變化是否有意義。但是您可以隨時嘗試,如果它不能改善您的測試集損失,則將其刪除。實際上,您應該真正使用驗證集或 $ k- $ 折疊這些實驗的交叉驗證,如果您希望測試集損失代表泛化錯誤,請在定義設置之前不要查看測試集。
無論如何,即使在他們的理想條件下,天真的方法也不能很好地工作(第4.2節)。他們剝離了輸出層(softmax 層)並用一個具有兩個單元的層來代替它,這兩個單元可以預測正弦 $ y $ 和余弦 $ x $ 的旋轉角度。然後將實際角度計算為 $ \alpha=\text{atan2}(y,x) $ . 神經網絡也在 ImageNet 上進行了預訓練(這稱為遷移學習)。當然,ImageNet 上的訓練是針對不同的任務(分類),但仍然從頭開始訓練神經網絡一定會給出如此可怕的結果,以至於他們決定不發布它們。因此,您擁有製作美味煎蛋捲的所有要素:潛在的無限訓練數據、預訓練網絡和明顯簡單的回歸問題(預測介於 -1 和 1 之間的兩個數字)。然而,他們可以通過這種方法獲得的最好結果是 21° 誤差。目前尚不清楚這是 RMSE 錯誤、MAD 錯誤還是什麼,但仍然不是很好:因為您可以犯的最大錯誤是 180°,所以平均錯誤是 $ >11% $ 的最大可能誤差。他們通過串聯使用兩個網絡做得稍微好一些:第一個將執行分類(預測角度是否在 $ [-180°,-90°],[-90°,0°],[0°,90°] $ 或者 $ [90°,180°] $ 類),然後圖像,旋轉了第一個網絡預測的量,將被饋送到另一個神經網絡(這次是為了回歸),它將預測最後的額外旋轉 $ [-45°,45°] $ 範圍。
在一個更簡單的(旋轉的 MNIST)問題上,您可以獲得更好的結果,但您仍然不會低於 RMSE 錯誤,即 $ 2.6% $ 的最大可能誤差。
那麼,我們可以從中學到什麼?首先,這 5000 張圖像是您的任務的小數據集。第一篇論文使用了一個網絡,該網絡在類似於他們想要學習回歸任務的圖像上進行了預訓練:不僅你需要學習與設計架構(分類)不同的任務,而且你的訓練集不需要與通常訓練這些網絡的訓練集(CIFAR-10/100 或 ImageNet)完全不同。因此,您可能不會從遷移學習中獲得任何好處。MATLAB 示例有 5000 張圖像,但它們是黑白的,並且在語義上都非常相似(嗯,這也可能是你的情況)。
那麼,比 0.3 做得更好有多現實呢?我們首先要明白 0.3 平均損失是什麼意思。你的意思是RMSE誤差是0.3,
$$ \frac{1}{N}\sum_{i=1}^N (h(\mathbf{x}_i)-y_i)^2 $$
在哪裡 $ N $ 是你的訓練集的大小(因此, $ N< 5000 $ ), $ h(\mathbf{x}_i) $ 是圖像的 CNN 輸出 $ \mathbf{x}_i $ 和 $ y_i $ 化學物質的相應濃度是多少?自從 $ y_i\in[80,350] $ ,然後假設您將 CNN 的預測剪裁在 80 到 350 之間(或者您只是使用 logit 使它們適合該區間),您得到的結果少於 $ 0.12% $ 錯誤。說真的,你期待什麼?在我看來,這根本不是一個大錯誤。
此外,只需嘗試計算網絡中的參數數量:我很著急,我可能會犯一些愚蠢的錯誤,所以
summary
無論如何都要用你可能使用的任何框架的一些函數來仔細檢查我的計算。但是,大致我會說你有$$ 9\times(3\times 32 + 2\times 32\times 32 + 32\times64+2\times64\times64+ 64\times128+2\times128\times128) +128\times128+128\times32+32 \times32\times32=533344 $$
(注意我跳過了批量規範層的參數,但它們只是層的 4 個參數,所以它們沒有區別)。您有 50 萬個參數和 5000 個示例……您期望什麼?當然,參數的數量並不是神經網絡容量的一個很好的指標(它是一個不可識別的模型),但仍然……我認為你不能做得比這更好,但你可以嘗試一些事情:
- 標準化所有輸入(例如,在 -1 和 1 之間重新調整每個像素的 RGB 強度,或使用標準化)和所有輸出。如果您遇到收斂問題,這將特別有幫助。
- 轉到灰度:這會將您的輸入通道從 3 減少到 1。您的所有圖像(在我高度未經訓練的眼睛看來)都是相對相似的顏色。你確定是需要預測的顏色嗎 $ y $ ,而不是更暗或更亮的區域的存在?也許你確定(我不是專家):在這種情況下跳過這個建議。
- 數據增強:既然你說翻轉、旋轉任意角度或鏡像圖像應該產生相同的輸出,你可以大大增加數據集的大小。請注意,使用更大的數據集,訓練集上的誤差會上升:我們在這裡尋找的是訓練集損失和測試集損失之間的較小差距。此外,如果訓練集損失增加很多,這可能是個好消息:這可能意味著您可以在這個更大的訓練集上訓練更深的網絡,而不會出現過度擬合的風險。嘗試添加更多層,看看現在你是否得到更小的訓練集和測試集損失。最後,如果它們在您的應用程序上下文中有意義,您還可以嘗試我上面引用的其他數據增強技巧。
- 使用先分類後回歸技巧:第一個網絡僅確定是否 $ y $ 應該在 10 個垃圾箱之一中,例如 $ [80,97],[97,124] $ ,等等。然後第二個網絡計算一個 $ [0,27] $ 更正:居中和歸一化在這裡也可能有所幫助。不能不試就說。
- 嘗試使用現代架構(Inception 或 ResNet)而不是老式架構。ResNet 的參數實際上比VGG-net 少。當然,您想在這裡使用小型 ResNet——我認為 ResNet-101 對 5000 張圖像數據集沒有幫助。不過,您可以大量擴充數據集….
- 由於您的輸出對於旋轉是不變的,因此另一個好主意是使用組等變 CNN,其輸出(當用作分類器時)對於離散旋轉是不變的,或者使用可轉向的 CNN其輸出對於連續旋轉是不變的。不變性屬性將允許您以更少的數據增強獲得良好的結果,或者理想情況下根本沒有(對於它涉及旋轉:當然您仍然需要其他類型的 da)。從實現的角度來看,組等變 CNN 比可控 CNN 更成熟,所以我會先嘗試組 CNN。您可以嘗試先分類然後回歸,將 G-CNN 用於分類部分,或者您可以嘗試純回歸方法。請記住相應地更改頂層。
- 嘗試批量大小(是的,是的,我知道超參數黑客並不酷,但這是我能在有限的時間範圍內免費提供的最好的 :-)
- 最後,還有一些特別開發的架構可以用小數據集進行準確的預測。他們中的大多數使用擴張卷積:一個著名的例子是混合尺度密集卷積神經網絡。不過,實現並非易事。