TensorFlow conv2d API
conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
input: 卷積輸入,Tensor(tf.Constant,tf.Variable,tf.placeholder)尘分,[batch, in_height, in_width, in_channel]
filter: 卷積核裙犹,Tensor旬薯,[filter_height, filter_width, in_channel, out_channel]
strides: 卷積核在各個維度移動的步長效诅,a 4-D list布隔,[stride_batch, stride_height, stride_width, stride_channel]
padding: 對輸入input的填充方法梧乘,'SAME' 和 'VALID'兩種
padding為'SAME'時,
1澎迎、輸出Tensor大小: [batch, ceil(in_height / filter_height), ceil(in_width / filter_width), out_channel]
2、上下左右padding大小:
if (in_height % strides[1] == 0):
pad_along_height = max(filter_height - strides[1], 0)
else:
pad_along_height = max(filter_height - (in_height % strides[1]), 0)
if (in_width % strides[2] == 0):
pad_along_width = max(filter_width - strides[2], 0)
else:
pad_along_width = max(filter_width - (in_width % strides[2]), 0)
pad_top = pad_along_height // 2
pad_bottom = pad_along_height - pad_top
pad_left = pad_along_width // 2
pad_right = pad_along_width - pad_left
padding為'VALID'時,
1选调、輸出Tensor大小: [batch, ceil(in_height - filter[1]) / strides[1] + 1, ceil(in_width - filter[2]) / strides[2] + 1, out_channel]
2夹供、沒有padding
TensorFlow conv2d_transpose API
conv2d_transpose(input, filter, output_shape, strides, padding='SAME', data_format='NHWC', name='None')
input: 轉(zhuǎn)置卷積, a Tensor, [batch, in_height, in_width, in_channel]
filter: 卷積核, a Tensor, [filter_height, filter_width, <big> out_channel, in_channel </big>]
output_shape: a 1-D Tensor or a N-D shape list. for example, [batch, out_height, out_width, out_channel]
strides: 步長, a 4-D list, [stride_batch, stride_height, stride_width, stride_channel]
padding: 對輸入input的填充方法,'SAME' 和 'VALID'兩種
1仁堪、conv2d_transpose會根據(jù)output_shape和padding計算一個shape哮洽,然后和input的shape相比較,如果不同會報錯弦聂。
2鸟辅、做轉(zhuǎn)置卷積時氛什,通常input的shape比output_shape要小,因此TensorFlow先把input填充成output_shape大小匪凉,再按照padding參數(shù)進行填充
stride==1時枪眉,外圍填充;
stride == 1
stride>1時再层,間隙填充
stride > 1
幾個問題:
1贸铜、為什么transposed convolution要指定output_shape?