在tf.nn.conv2d函數中,padding可以選擇VALID和SAME兩種模式,兩種模式得到的卷積輸出尺寸計算方式不同。
- 輸入尺寸高和寬:in_height、in_width
- 卷積核的高和寬:filter_height、filter_width
- 輸出尺寸高和寬:output_height、output_width
- 步長移動高和寬:strides_height、strides_width
1、當padding=VALID
輸出寬和高計算公式為:
output_height=(in_height-filter_height+1)/strides_height(結果向上取整)
output_width=(in_width-filter_width+1)/strides_width(結果向上取整)
2、當padding=SAME
此時需要進行補零
output_height=in_height/strides_height(結果向上取整)
output_width=in_width/strides_width(結果向上取整)
補零的參數
pad_height = max((out_height - 1) x strides_height + filter_height - in_height, 0)(高度方向填充0的行數)
pad_width = max((out_width - 1) x strides_width + filter_width - in_width, 0)(寬度方向填充0的列數)
pad_top = pad_height / 2(上方向填充0的行數,向下取整)
pad_bottom = pad_height - pad_top(下方向填充0的行數)
pad_left = pad_width / 2(左方向填充0的列數,向下取整)
pad_right = pad_width - pad_left(右方向填充0的列數)
3、舉例
輸入為13x1的一維矩陣,filter為6x1,步長為5
當padding=VALID
output_width=(13-6+1)/5=2(向上取整)
所以計算時舍棄了最后兩個值
當padding=SAME
output_width=13/5=3(向上取整)
pad_width = max((3 - 1) x 5 + 6 - 13, 1) = 3
pad_left = pad_width / 2 = 3 / 2 = 1 (向下取整)
pad_right = pad_width - pad_left = 2
所以左邊補一個0,右邊補兩個0