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]]]]