深度學習 tensorflow tf.layers.conv2d_transpose 反捲積 上採樣

參數

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

  • inputs: 輸入的張量
  • filters: 輸出卷積核的數量
  • kernel_size : 在卷積操做中卷積核的大小
  • strides: (不太理解,我直接理解成放大的倍數)
  • padding : ‘valid’ 或者 ‘same’。

觀察以後看到,補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)

反捲積的過程

  • Step 1 擴充: 將 inputs 進行填充擴大。擴大的倍數與strides有關。擴大的方式是在元素之間插strides - 1 個 0
  • Step 2 卷積: 對擴充變大的矩陣,用大小爲kernel_size卷積核作卷積操做,這樣的卷積核有filters個,而且這裏的步長爲1(與參數strides無關,必定是1)

舉個例子:

  • inputs:[ [1, 1], [2,2] ]
  • strides = 2(擴大2倍)
  • filters = 1
  • kernel_size = 3(假設核的值都是1)
  • padding = ‘same’

Step 1:[2,2] 擴大至 [4,4]

  • 問題描述:一個矩陣XX,經過 3*3 大小的卷積核,以 ‘same’的padding形式,步長爲2作卷積,獲得 [[1,1],[2,2]],問XX長啥樣


    經過填充,讓原來2*2的矩陣變成4*4。填充的方式是我本身根據代碼給出的結果猜的,大概就是先在元素之間插strides - 1個0,而後在填充邊緣使矩陣達到目標尺寸。
    目標尺寸能夠根據下面的公式來求:


    其中 x爲目標尺寸,k是卷積核的尺寸, p表示填充的個數, o表示輸出的尺寸,s表示步長。
    在這裏,k,p,s,o都是已知的,求x便可。可是由於有取整操做,實際上會有兩個值符合x,彷佛是取大的那個。
    在這個例子中k=3,p=1,s=2,o=2,獲得x=4或x=3或x=3,取大的那個,因此x=4

Step 2 : 作卷積,卷積核大小3*3, 步長爲1


這一步就是普通的作卷積操做。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]]]]

 

相關文章
相關標籤/搜索