1. 程式人生 > >Pytorch-學習記錄 卷積操作——Tensor.size()

Pytorch-學習記錄 卷積操作——Tensor.size()

設計網路結構、看網路結構原始碼時時常需要計算輸入在結構中經過卷積層、pooling層後尺寸大小,特此記錄。

pytorch中二維卷積層介面為 Conv2d() ,引數詳情不多贅述,詳情請參閱官方文件。我在此主要說明卷積層對輸入計算之後size的變化情況。

例如,


卷積層的in_channels首先要與input的channels相對應,具體到上例,就是黑色和藍色框所對應的部分。out_channels自行設定,表示輸出卷積核個數。kernel_size為卷積核大小,stride為卷積核在輸入上的視窗移動步長,當輸入stride引數為int時,表示卷積核移動在橫向與縱向都是相同步長,若stride=(x,y),表示在橫軸與縱軸以不同步長滑動。   padding簡單理解為對輸入特徵圖四周的填充。kernel_size、padding、stride會影響輸出特徵圖的尺寸。

從上圖可知,輸入的 batchsize=64 在網路結構前向傳遞過程中不改變大小。同時,在kernel_size=3,stride=1,padding=1的前提下,卷積不改變輸入影象的尺寸。

特徵圖尺寸計算方式:

feature-map height  :   {(input_height - kernel_size + 2*padding) / stride[0] }+1  (stride[0]表示橫向移動步長])



相似地,feature-map width    :   {(input_width - kernel_size + 2*padding) / stride[1] }+1  (stride[1]表示縱向移動步長])



再舉個例子,輸入經過兩層卷積和一層pooling後尺寸。



計算過程:

經過第一層卷積後:(224-7+2*2)/2+1=111

第二層卷積:(111-3+1*2)/1+1=111

pooling:(111-3)/2+1=55

每一層的輸出channels即是下一層的輸入channels。

Resnet、Inception結構中有大量kernel_size=3,stride=1,padding=1的層,他們不改變特徵圖圖大小。

總結一下,設計網路結構時候要注意輸入channels和卷積層的in_channels保持一致,不同的kernel_size、padding、stride會影響輸出特徵圖尺寸。

參考資料:

pytorch中文文件 http://pytorch-cn.readthedocs.io/zh/latest/