conv2d_transpose( inputs, filters, kernel_size, strides=(1, 1), padding=’valid’, data_format=’channels_last’, activation=None, use_bias=True, kernel_initializer=None, bias_initializer=tf.zeros_initializer(), kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, trainable=True, name=None, reuse=None )
比较关注的参数:dom
观察以后看到,补0 过程分为两个部分:元素之间和外轮廓ide
1 、当padding = ‘valid’时:3d
元素之间补0:(input_size - 1)×(strides - 1)code
外轮廓补0:(kernel_size - 1)× 2orm
output_size = (input_size + (input_size - 1)×(strides - 1) +(kernel_size - 1)× 2 - kernel_size ) / 1 + 1blog
二、当padding = ‘same’时:input
output_size = input_size × stridesit
他是经过调整外轮廓的补0 数量实现的,若是不够,我我的以为可能元素之间补0也会减小io
img = np.random.randint(0, 255, (5, 16, 16, 32)).astype(np.float32) img_t = tf.constant(img, tf.float32) transpose_v = tf.layers.conv2d_transpose(inputs=img_t, filters=16, kernel_size=(6, 6), strides=(2, 2), padding='valid') transpose_s = tf.layers.conv2d_transpose(inputs=img_t, filters=16, kernel_size=(6, 6), strides=(2, 2), padding='same') print('valid 输出尺寸:', transpose_v.shape) print('same 输出尺寸: ', transpose_s.shape) valid 输出尺寸: (5, 36, 36, 16) same 输出尺寸: (5, 32, 32, 16)
这一步就是普通的作卷积操做。ast
a = np.array([[1,1],[2,2]], dtype=np.float32) # [[1,1], # [2,2]] # tf.layers.conv2d_transpose 要求输入是4维的 a = np.reshape(a, [1,2,2,1]) # 定义输入 x = tf.constant(a,dtype=tf.float32) # 进行tf.layers.conv2d_transpose upsample_x = tf.layers.conv2d_transpose(x, 1, 3, strides=2, padding='same', kernel_initializer=tf.ones_initializer()) with tf.Session() as sess: tf.global_variables_initializer().run() print(sess.run(upsample_x)) # [[[[1],[1],[2],[1]], # [[1],[1],[2],[1]], # [[3],[3],[6],[3]], # [[2],[2],[4],[2]]]]