🌈?個人主頁:十二月的貓-CSDN博客
🔥?系列專欄:?🏀《深度學習理論直覺三十講》_十二月的貓的博客-CSDN博客💪🏻?十二月的寒冬阻擋不了春天的腳步,十二點的黑夜遮蔽不住黎明的曙光?
目錄
1. 前言
2. 轉置卷積
2.1 上采樣的必要性
2.2 為什么要使用轉置卷積
2.3 卷積運算
2.4 卷積運算多對一關系的思考
2.5 卷積核的本質(從矩陣卷積轉為行卷積)
2.7 對轉置卷積核的思考
3. 總結
1. 前言
? ? ? ? 之前有機會看過這篇文章:【深度學習基礎】深入理解 卷積與卷積核-CSDN博客的友友一定對卷積并不陌生,這也算是各種網絡結構(RNN、LSTM等)的構成基礎之一。因為網絡結構研究的就是各種層(卷積、池化、全連接等)的組合方式。然后模型就是研究如何使用這些網絡結構用來解決特定的問題。本篇文章的內容——轉置卷積 就屬于網絡結構的組成部分,各種層結構。
深度學習的三層次:
- 卷積、池化、全連接等層是深度學習中最基礎的東西。他們的不同組合方式產生了不同的網絡結構。
- 不同的網絡結構對特征的提取是完全不同的。例如RNN結構能夠提取上下文的信息適用于語言、時間等;CNN結構能夠提取同一個圖片從局部到整體的信息適用于計算機視覺上的使用;U-Net結構能夠在提取特征的同時輸出一個高分辨率的圖片,因此適用于語義切割。
- 在對問題充分理解后,對該問題進行數學建模。在這個模型中,我們需要定義數據來源、完整架構(包括一個或多個網絡結構)、訓練方式、損失函數等。例如:生成對抗網絡模型、擴散模型等。
使用說明:三層次的內容層層遞進:前者是后者的基礎,后者是前者的遞進。因此貓貓也將其分到兩個專欄中,第一部分(深度學習中的層結構)作為【神經網絡結構的組成】安排在《AI認知筑基三十講》專欄中,用于初學者的學習;第二部分(網絡結構、模型)分為【深度學習的骨架與脈搏】和【深度學習的靈魂】安排在《深度學習理論直覺三十講》專欄中,用于深度學習愛好者學習。
2. 轉置卷積
? ? ? ? 明確一個點:轉置卷積用于上采樣。
2.1 上采樣的必要性
????????使用神經網絡生成圖像通常涉及從低分辨率到高分辨率的上采樣。因為神經網絡理解一個圖片的過程中就會用池化層、卷積層等下采樣層將圖片不斷壓縮,由此來獲得更上層的信息(更抽象的圖片信息)。理解之后想要再輸出原本的圖片+其他信息就需要用到上采樣去處理了。下圖就是一個上采樣:
進行上采樣操作的方法有多種:
- 最近鄰插值
- 雙線性插值
- 雙三次插值
????????所有這些方法都涉及一些插值方法,我們必須在決定網絡架構時選擇它們。這就像手動特征工程,網絡無法學習任何東西。
當然,最近大家都是用擴散模型或者對抗模型去完成超分辨率的工作(也就是把一個圖片變更清晰)。使用生成模型去做上采樣和使用插值或者轉置卷積的方法是不同的,可以說生成模型
2.2 為什么要使用轉置卷積
????????如果我們希望網絡學習如何以最佳方式進行上采樣,可以使用轉置卷積。它不使用預定義的插值方法。它具有可學習的參數。理解轉置卷積概念很有幫助,因為重要的論文和項目都使用它,例如:
- DCGAN?中的生成器采用隨機采樣值來生成全尺寸圖像。
- 語義分割在編碼器中使用卷積層提取特征,然后在解碼器中恢復原始圖像大小,從而對原始圖像中的每個像素進行分類。
轉置卷積也稱為:
- 分數步長卷積
- 反卷積
我將在本文中僅使用轉置卷積這個詞,但您可能會在其他文章中注意到其他名稱。
2.3 卷積運算
????????讓我們用一個簡單的例子來解釋卷積運算的工作原理。假設我們有一個 4x4 矩陣,并應用一個 3 x 3 核的卷積運算,該核沒有填充,步長為 1。如下所示,輸出是一個 2x2 矩陣。
????????卷積運算計算輸入矩陣與核矩陣之間元素乘積之和。由于沒有填充且步長為 1,我們只能執行四次。因此,輸出矩陣為 2x2。
????????這種卷積運算的關鍵點是輸入值和輸出值之間存在位置連通性。例如,輸入矩陣的左上角值會影響輸出矩陣的左上角值。我們使用 3 x 3 核將 9 個輸入矩陣值連接到 1 個輸出矩陣值。?卷積運算形成多對一關系?。記住這一點,稍后我們會用到它。
2.4 卷積運算多對一關系的思考
????????現在,假設我們想反過來。我們想將一個矩陣中的一個值與另一個矩陣中的九個值關聯起來。這是一種一對多的關系。這就像卷積運算中的逆向操作,也就是轉置卷積的核心思想。
????????例如,我們將一個 2x2 矩陣上采樣為 4x4 矩陣,該操作保持 1 比 9 的關系。
????????但是我們如何執行這樣的操作呢? 其實也不難理解了,卷積操作依靠卷積核實現多對一操作,那么轉置卷積自然也可以依靠轉置卷積核實現一對多關系。
2.5 卷積核的本質(從矩陣卷積轉為行卷積)
????????我們可以用矩陣來表示卷積運算。它是一個重新排列的核矩陣,因此我們可以使用矩陣乘法來進行卷積運算。
? ? ? ? 但是,現在我說卷積操作可以轉化為一維的方式展開,也就說一行代表一個卷積結果。原本卷積結果如下:
? ? ? ? 現在想要轉變為這樣:
1. 首先必然要將輸入的矩陣做變化:將輸入矩陣(4x4)展平為列向量(16x1)
2. 將卷積核變化:將 3x3 內核重新排列成 4x16 矩陣,如下所示:
? ? ? ? 因此就有下面的這種卷積:
上面操作就將矩陣卷積轉為行卷積了!!?
2.7 對轉置卷積核的思考
? ? ? ? 看到上面對卷積核的變化,不難發現,卷積核的本質都可以轉化為每一行的卷積。從矩陣卷積到行卷積的轉變,讓貓貓有了下面的思考:使用卷積矩陣,你可以從 16(4x4)變為 4(2x2),本質是因為卷積矩陣本身就是 4x16。然后,如果你有一個 16x4 矩陣,你可以從 4(2x2)變為 16(4x4)。
????????我們希望從 4 (2x2) 變為 16 (4x4)。因此,我們使用一個 16x4 矩陣。但這里還有一件事,我們需要檢查一下是否滿足,那就是是否保持 1 到 9 的關系。假設我們將卷積矩陣 C (4x16) 轉置為 CT (16x4)。我們可以將 CT (16x4) 與列向量 (4x1) 進行矩陣乘法,生成一個輸出矩陣 (16x1)。轉置后的矩陣將一個值與輸出中的 9 個值聯系起來。
? ? ? ? 由此可以看到,我們將一個較小的矩陣(2x2)上采樣為一個較大的矩陣(4x4)。同時也保證了一個值和九個值之間的對應關系。注意:矩陣中的實際權重值并非來自原始卷積矩陣(這是一個可訓練的參數,和卷積核一樣)。重要的是,權重布局與卷積矩陣形狀的轉置相同。
3. 總結
????????轉置卷積運算與常規卷積形成相同的連通性,但在轉置的方向上,我們可以用它來進行上采樣。此外,轉置卷積中的權重是可學習的。因此,我們不需要預先定義插值方法。雖然它被稱為轉置卷積,但這并不意味著我們采用某個現有的卷積核并對其進行轉置。重點在于,與標準卷積矩陣相比,轉置卷積對輸入和輸出之間的關聯進行了反向處理(一對多關聯,而非多對一關聯)。因此,轉置卷積并非真正的卷積。但我們可以用卷積來模擬轉置卷積。我們通過在輸入矩陣的值之間添加零來對輸入進行上采樣,這樣直接卷積就能產生與轉置卷積相同的效果。你可能會找到一些文章以這種方式解釋轉置卷積。然而,由于需要在卷積之前添加零來對輸入進行上采樣,因此效率較低。
? ? ? ? 簡單點來說,轉置卷積和卷積類似,只是提供一個形式固定的模板,核內部的值是多少是通過學習得到的。特別地:轉置卷積會造成生成圖像的棋盤格偽影。因此建議先進行插值方法,然后再進行轉置卷積操作,以減少此類問題。
【如果想學習更多深度學習知識,可以訂閱熱門專欄】
- 《AI認知筑基三十講》
- 《PyTorch科研加速指南:即插即用式模塊開發》
- 《深度學習理論直覺三十講》
??如果想要學習更多人工智能的知識,大家可以點個關注并訂閱,持續學習、天天進步你的點贊就是我更新的動力,如果覺得對你有幫助,辛苦友友點個贊,收個藏呀~~~