nn.Conv2d中padding详解【pytorch学习】
簡述
在網上看了很多的解釋,自己又大致的理解了一下之后明白了。
文章目錄
- 簡述
- 卷積
- 加上padding的卷積
- 1.使得整個圖大小不會發生變化。
- 2.使得整個圖大小不會發生變化。
- 實際上的公式
- 關于padding的數值
- 引用
卷積
首先我們得明白什么是卷積。
但是由于我們這里只想要推理padding的大小,所以只會討論這個大小的問題。
- (n,n)和(n, n)的矩陣相乘,規模任然是(n, n)。
- 我們知道,卷積的過程,其實是kernal在整體輸入上的一個滑動的過程。
- 首先我們得知道滑動的步長。(stride)
- 推理這個公式其實非常簡單。 (original_size - (kernal_size - 1)) / stride
- 上面的公式現在還沒有化簡,但是其實非常容易理解的。就是原圖刪除掉(kernal-1)大小之后的區間除以stride后,向下整數。
- 減去那個部分是為了避免越界。
- 之后再除以步長,就是小學經典的,給定長度的路,再給定一個樹之間的間距,來算能插入多少棵樹的問題了。
上面的公式就給出了,經過一次卷積之后,生成的圖的大小。
加上padding的卷積
上面部分其實是容易理解,加上padding有兩個作用
padding的含義: 在四周加格子
1.使得整個圖大小不會發生變化。
- 如果留心上面的操作的話,會發現,只有當kernal=1并且stride=1的時候,新圖的大小才能等于原始大小。否則只能更小。但是對于研究深度學習的人(調模型參數的菜雞們),這個怎么可以容忍了,沒有參數可以調了!!只能是1!那還搞什么啊!
- 所以,加上了padding
加上padding之后,上面的公式就要發生修改了。
(OriginalSize?(KernalSize?1)+2?padding)/stride(OriginalSize - (KernalSize - 1) + 2 * padding) / stride(OriginalSize?(KernalSize?1)+2?padding)/stride
因為padding如果是數值的話,表示的是兩邊都加。也就加了兩遍的padding在origin的大小上,所以,就乘以2
2.使得整個圖大小不會發生變化。
使得邊緣的數據可以被用到。非常顯然,這里的邊緣數據都很少被用到的。
所以加上之后,擴充了整個圖,讓邊緣的數據的用到次數得到提高。這樣才能更好的得到整張圖的特征。
實際上的公式
OutputSize=InputSize?KernalSize+2?Paddingstride+1OutputSize = \frac{InputSize - KernalSize + 2 * Padding}{stride} + 1 OutputSize=strideInputSize?KernalSize+2?Padding?+1
非常奇怪,公式是這樣的。
其實,當OutputSize這些都是2的倍數的時候,這個是沒什么考慮的。
個人認為是考慮到有奇數的情況。但具體的我也沒有經過數學推導證明過,如果有的話,歡迎大佬分享。
關于padding的數值
這里就引進了一個新的參數,那就是bias.
有興趣的朋友可以自己查一查。
引用
https://blog.csdn.net/u012442157/article/details/78570505
https://pytorch.org/docs/stable/nn.html
https://blog.csdn.net/g11d111/article/details/82665265
總結
以上是生活随笔為你收集整理的nn.Conv2d中padding详解【pytorch学习】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch下载mnist超时解决方案
- 下一篇: 卷积神经网络CNN入门【pytorch学