回憶一下圖 7.2.1中的卷積示例。輸入的高度和寬度均為 3,卷積核的高度和寬度均為 2,從而產(chǎn)生具有維度的輸出表示2×2. 假設(shè)輸入形狀是 nh×nw卷積核形狀為 kh×kw,輸出形狀將是 (nh?kh+1)×(nw?kw+1):我們只能將卷積核移動到它用完像素以應(yīng)用卷積為止。
在下文中,我們將探索許多技術(shù),包括填充和跨步卷積,它們可以更好地控制輸出的大小。作為動機,請注意,由于內(nèi)核的寬度和高度通常大于1,在應(yīng)用許多連續(xù)的卷積之后,我們往往會得到比輸入小得多的輸出。如果我們從一個240×240像素圖像,10層層5×5卷積將圖像縮小為200×200像素,切片30%的圖像,并用它抹掉原始圖像邊界上的任何有趣信息。填充是處理此問題的最流行的工具。在其他情況下,我們可能希望大幅降低維數(shù),例如,如果我們發(fā)現(xiàn)原始輸入分辨率很笨重。跨步卷積是一種流行的技術(shù),可以在這些情況下提供幫助。
import tensorflow as tf
7.3.1. 填充
如上所述,應(yīng)用卷積層時的一個棘手問題是我們往往會丟失圖像周邊的像素。考慮 圖 7.3.1,該圖將像素利用率描述為卷積核大小和圖像內(nèi)位置的函數(shù)。角落里的像素幾乎沒有被使用。
由于我們通常使用小內(nèi)核,對于任何給定的卷積,我們可能只會丟失幾個像素,但是當我們應(yīng)用許多連續(xù)的卷積層時,這可能會累加起來。這個問題的一個直接解決方案是在輸入圖像的邊界周圍添加額外的填充像素,從而增加圖像的有效尺寸。通常,我們將額外像素的值設(shè)置為零。在 圖 7.3.2中,我們填充一個3×3輸入,將其大小增加到5×5. 相應(yīng)的輸出然后增加到4×4矩陣。陰影部分是第一個輸出元素以及用于輸出計算的輸入和內(nèi)核張量元素:0×0+0×1+0×2+0×3=0.
一般來說,如果我們總共添加ph填充行(大約一半在頂部,一半在底部)和總共pw填充列(大約一半在左邊,一半在右邊),輸出形狀將是
這意味著輸出的高度和寬度將增加 ph和pw, 分別。
在許多情況下,我們會想要設(shè)置ph=kh?1和 pw=kw?1給輸入和輸出相同的高度和寬度。這樣在構(gòu)建網(wǎng)絡(luò)時更容易預(yù)測每一層的輸出形狀。假如說kh這里很奇怪,我們會墊ph/2高度兩側(cè)的行。如果 kh是偶數(shù),一種可能是填充 ?ph/2?輸入頂部的行和 ?ph/2?底部的行。我們將以相同的方式填充寬度的兩側(cè)。
CNN 通常使用具有奇數(shù)高度和寬度值的卷積核,例如 1、3、5 或 7。選擇奇數(shù)核大小的好處是我們可以保留維度,同時在頂部和底部填充相同數(shù)量的行,并且左右的列數(shù)相同。
此外,這種使用奇數(shù)內(nèi)核和填充來精確保持維度的做法提供了文書上的好處。對于任意一個二維張量X
,當核的大小為奇數(shù),且各邊的padding行數(shù)和列數(shù)相同時,產(chǎn)生與輸入等高等寬的輸出,我們知道輸出是通過cross計算
評論
查看更多