三分鐘完全瞭解PyTorch中卷積層內部計算方法和權值初始值的來歷,讓你對模型有更深層次的理解

首先先說明第一個答案,也就是PyTorch中卷積層的計算方法,其實這點很多人可能在書上已經看過圖了,我只是用代碼復現一遍

我們把所有變量都明確,首先是輸入變量,我們設爲2 * 2的全1矩陣,如下:
在這裏插入圖片描述
然後初始化一個二維卷積層,並輸出其weight和bias,如下:
在這裏插入圖片描述

我們可以看到,weight和bias都有兩個值,這是因爲我們定義了輸出通道爲2,所以給我們分配了兩個卷積核,然後可以看到權值分別爲0.7843和0.51,bias分別爲0.7589和0.4449,然後我們把input輸出進去看看輸出值,如下圖:

在這裏插入圖片描述
輸出的爲兩個22的tensor,我來解釋一下它們怎麼來的,首先兩個tensor還是因爲我們定義的輸出通道爲2,如果是圖片的話,就會輸出兩張卷積過後的圖片(是不是非常熟悉),然後0.154 = 0.7843(weight) 1 + 0.7589(bias),後面的同理,四個都一樣是因爲卷積核是1*1大小的,具體的計算方法理解了可以套到更大size的卷積核中。


這是第一點,計算方法跟邏輯迴歸很像,不難理解,一直讓我弄不懂的是另外一個問題,那就是weight和bias是怎麼來的?是PyTorch固定分配的?我查閱了很多資料,最後才找到答案:通過一個公式再加上這兩個步驟隨機生成的

先看PyTorch給出的計算公式,其實會很懵,懵的話沒關係,我們直接看更下面的源碼:
在這裏插入圖片描述
源碼:
在這裏插入圖片描述
我們來根據上面我們的例子計算一下,n = in_channels,那我們的n就等於1,因爲我們的輸入維度是1 * 1 * 2 * 2,這裏第一個值是batchsize,也就是你輸入了多少個input,第二個就是我們的輸入通道,ok,看下一步,我們的kernel_size爲1,所以n乘到最後還是等於1,sqrt(1)等於1(開平方根),所以stdv還是等於1。。。。

ok然後就是初始化了,可以看到weight和bias都是初始化爲-1到1之間的隨機數,如下:
在這裏插入圖片描述

至此,我們知道了卷積的計算方法,也知道了卷積核中的值是怎麼來的,你是不是對卷積這一整個步驟都有了更深層次的理解了呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章