博客 / 詳情

返回

吳恩達深度學習課程四:計算機視覺 第一週:卷積基礎知識(二)卷積參數

此分類用於記錄吳恩達深度學習課程的學習筆記。
課程相關信息鏈接如下:

  1. 原課程視頻鏈接:[雙語字幕]吳恩達深度學習deeplearning.ai
  2. github課程資料,含課件與筆記:吳恩達深度學習教學資料
  3. 課程配套練習(中英)與答案:吳恩達深度學習課後習題與答案

本篇為第四課的第一週內容,1.4到1.5的內容。


本週為第四課的第一週內容,這一課所有內容的中心只有一個:計算機視覺。應用在深度學習裏,就是專門用來進行圖學習的模型和技術,是在之前全連接基礎上的“特化”,也是相關專業裏的一個重要研究大類。
這一整節課都存在大量需要反覆理解的內容和機器學習、數學基礎。 因此我會盡可能的補足基礎,用比喻和實例來演示每個部分,從而幫助理解。
本篇的內容關於卷積參數,就像全連接層有很多參數一樣,卷積也有很多可以調整的地方。

1. Padding

Padding 的中文可以翻譯為“填充”,但實際在學術和技術討論中,大部分人更習慣於使用英文原詞,尤其是在編程和文獻中,“Padding”已經成為一個標準術語。

在正式介紹 Padding 前,我們先對卷積中的一些基本參數進行符號説明,好方便之後使用。

1.1 卷積的基本符號表示

來看一下卷積中的一些基本表示:
image.png
如圖所示,再簡單列舉一下:

  • \(n\) 表示輸入特徵圖的空間尺寸(通常指寬或高)。
  • \(f\) 表示卷積核的尺寸(同樣指寬或高)。

而經過一層最基本的卷積操作,我們可以發現輸出圖像的尺寸可以表示為:

\[n-f+1 \]

但是這樣就會出現一個問題:我們通過卷積核來提取特徵,會讓圖片變小。
就像對一篇文章進行概括,概括一次讓 100 個字變成 20 個字,再概括一次就成 5 個字,再概括就只剩下 1 個字了。
一個“好”或者“壞”,真的能展示一整篇文章的內容嗎?
卷積也是同樣的道理,如果不進行處理,那麼卷積就會讓圖片不斷變小,信息丟失
image.png
此外,還有一個問題:每個像素的使用不平均,邊緣信息被更少的掃描了。
卷積核在滑動時,只能完全覆蓋在圖像內部的位置,邊緣那一圈天然“吃虧”,被卷積核掃過的次數更少。
image.png

如何解決這些問題?答案就是 Padding 。

1.2 什麼是 Padding ?

用英文聽起來可能有些高大上,但 Padding 的邏輯很簡單:既然邊緣不夠大,那就在四周“墊一點東西”進去。
簡單來説:就是圍着輸入圖像再加上一圈或幾圈像素

現在便在引入一個新的符號規範:
我們用 \(p\) 表示 Padding 的大小,用於説明在圖像四周填充了多少像素。
而對於用什麼填充,也有一些相應的方法:

  • 在圖像四周增加 0 值像素(稱為 zero padding)
  • 或者根據某些規則複製原圖邊緣的像素

我們就用 zero padding 來演示:
image.png
同樣,你會發現 \(p\) 的增加有這樣的規律:

\[p每增加 1,n 增大 2 \]

因此,在加入 Padding ,我們就會再次更新從輸入尺寸到輸出尺寸的公式:
image.png
現在,輸出圖像的一邊尺寸就變成了:

\[n-f+2p+1 \]

這樣,圖片變小和邊緣使用少的問題就都會得到改善。
繼續下一部分。

1.3 valid 卷積和 same 卷積

這是兩種在 Padding 有所區別的卷積方式,簡單介紹一下:

(1)valid 卷積(無填充)

“valid” 的字面意思是“有效的”。
對應到我們前面的符號,就是:

\[p = 0 \]

於是輸出尺寸就還是:

\[n - f + 1 \]

這類卷積常用於希望逐步壓縮空間尺寸、提取更抽象特徵的網絡結構中。

(2)same 卷積(輸出與輸入同尺寸)

“same” 的意思是希望輸出與輸入在空間尺寸上 保持一樣大
為了維持尺寸不變,我們必須人為加 Padding,讓這個公式成立:

\[n - f + 2p + 1 = n \]

整理得到:

\[p = \frac{f - 1}{2} \]

這也是為什麼裏卷積核常用 奇數尺寸(如 3、5、7),因為奇數能讓 \(p\) 剛好取整數,否則 same 卷積就無法實現。
same 卷積的意義是:讓每一層都在提取特徵的同時,不縮小空間尺寸,從而保留更“密集”的空間細節。 這也是我們在卷積網絡中普遍選擇的卷積方式。

對於 Padding 部分就先到這裏,接下來看看另一個參數:步長。

2. 卷積步長(stride)

卷積除了 “卷積核大小”“Padding 要不要填” 外,還有一個非常關鍵的參數:步長 stride。如果説卷積核是在“看圖”,Padding 是在“補圖”,那 stride 就決定了它“走路的方式”。
簡單來説,stride 控制的是:卷積核每次滑動時,移動多少格。
繼續引入一個符號規範:
我們用 \(s\) 表示 stride 的大小,用於説明卷積核每次滑動時移動的距離。

之前的內容裏,實際上 stride 一直存在,在默認情況下,它的值是:

\[s = 1 \]

意思是:每次往右或往下移動 1 個像素
就像你在看一本小説,每翻一頁都要翻到緊挨着的下一頁,這樣你不會漏掉任何內容。
image.png
但如果把 stride 調大,比如:

\[s = 2 \]

那就變成每次跳兩個格子再看下一塊區域。
就像你看畫冊時,每次跳着翻兩頁——信息當然會變“稀疏”一些。
image.png
但是當步長增加時,也會出現一種新的情況:
image.png

當卷積核有部分移動到圖像外時,就不進行該次卷積運算,而是繼續滑動至下一個完全覆蓋位置或者結束。
實際上,\(s = 1\) 時也是這個邏輯。
因此,這副圖像的卷積過程是這樣的:
image.png
而 stride 的調整也會改變輸出特徵圖的尺寸,輸出公式也要隨之更新:

\[\text{輸出尺寸}=\left\lfloor\frac{n - f + 2p}{s}\right\rfloor + 1, 注:\lfloor向下取整\rfloor \]

同時你會發現,在上圖中,如果不進行“溢出”運算,會讓一部分像素丟失。
因此,選擇 \(f\)\(s\) 時儘量保證輸出尺寸為整數,或顯式使用 padding 使其對齊。
總結一下:

  • s 越大,輸出越小,計算量越小,感知範圍越大。
  • s 越小(最常見是 1),輸出保留更密。

這便是卷積的另一個參數:步長 stride。

這一節課程中額外補充了一點:在數學裏,卷積並不是上面這樣的相乘相加,它在此前會進行一步翻轉,我們進行的卷積在數學裏叫做互相關。
但是在深度學習裏,我們省略了這一步驟,因為我們的卷積核是不斷更新的,我們在慣例,在論文裏的卷積操作指的就是我們上面所介紹的。瞭解就好,就不再展開了。

3. 總結

概念 原理 比喻
Padding(填充) 在輸入圖像四周補上 \(p\) 層像素,使卷積核能在更多位置滑動;解決輸出變小、邊緣利用不足的問題。輸出尺寸公式:\(n-f+2p+1\) 像給白板貼邊框,讓貼紙(卷積核)能貼到更靠外的區域,不要讓邊緣吃虧。
valid 卷積 不做填充,\(p=0\),輸出會變小:\(n-f+1\) 像剪紙時只剪“能完整落在紙上的圖案”,邊緣那點不夠大的就不要了。
same 卷積 通過設置 \(p=\frac{f-1}{2}\) 讓輸出尺寸保持與輸入一樣大。必須使用奇數卷積核尺寸。 像在桌面四周加墊子,讓桌布(卷積結果)鋪好後剛好和原桌面一樣大。
stride(步長) 卷積核每次移動的距離,用 \(s\) 表示。決定卷積核的掃描密度。輸出尺寸公式:\(\left\lfloor\frac{n-f+2p}{s}\right\rfloor+1\) s=1 是逐格檢查;s=2 是“隔一個掃一個”,像翻相冊時跳着看。
stride 與信息保留 s 越大,輸出越小、計算更省,但特徵更稀疏;s 越小,信息保留越多。 像在地上畫方塊跳格子:跳得越大,踩到的格子越少。
為什麼卷積要向下取整 卷積核必須完全落在圖像內才能計算,溢出部分不做卷積,因此輸出尺寸要取 \(\lfloor\cdot\rfloor\) 像在桌子上擺杯墊,必須完全落在桌面上才能放,否則就算不進去。
卷積 vs 數學卷積 數學中的卷積會翻轉核,但深度學習裏省略這步,直接做“互相關”,因為核會被訓練。 像做飯時直接根據口味調整調料,不一定非要照傳統食譜翻鍋步驟。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.