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/