深度学习 tensorflow tf.layers.conv2d_transpose 反卷积 上采样
生活随笔
收集整理的這篇文章主要介紹了
深度学习 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 )比較關注的參數:
- inputs: 輸入的張量
- filters: 輸出卷積核的數量
- kernel_size : 在卷積操作中卷積核的大小
- strides: (不太理解,我直接理解成放大的倍數)
- padding : ‘valid’ 或者 ‘same’。
觀察之后看到,補0?過程分為兩個部分:元素之間和外輪廓
1 、當padding = ‘valid’時:
? ? ?元素之間補0:(input_size - 1)×(strides - 1)
? ? ?外輪廓補0:(kernel_size - 1)× 2
? ? ?output_size = (input_size? + (input_size - 1)×(strides - 1) +(kernel_size - 1)× 2 - kernel_size ) / 1 + 1
2、當padding = ‘same’時:
? ? ?output_size = input_size × strides
? ? ?他是通過調整外輪廓的補0 數量實現的,如果不夠,我個人覺得可能元素之間補0也會減少
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
這一步就是普通的做卷積操作。
?
代碼驗證
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]]]]?
總結
以上是生活随笔為你收集整理的深度学习 tensorflow tf.layers.conv2d_transpose 反卷积 上采样的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习-TF函数-layers.con
- 下一篇: ValueError: Shape mi