transpose convolution在Keras和Tensorflow中的不同輸出。
Keras只給出了(1, 5, 5, 1)輸出:
import tensorflow as tf
x = tf.random.normal(shape=(1, 2, 2, 1)
print()
y = tf.keras.layer. Conv2DTranspose(1, (3, 3), 2, padding="valid">(x)
print(y.shape)
print()
Tensorflow如果配置了output_shape,會給出(1, 6, 6, 1)或(1, 5, 5, 1):
import tensorflow as tf
with tf.compat.v1.Session() as sess:
x1 = tf.constant(
[4.5, 5.4, 8.1, 9.0] 。
shape=([1, 2, 2, 1])。
dtype=tf.float32
)
dev_con1 = tf.ones(
shape=([3, 3, 1, 1]) 。
dtype=tf.float32
)
y1 = tf.nn.conv2d_transpose(
x1,
dev_con1,
output_shape=[1,6,6,1] #用[1,5,5,1]也可以,]
strides=[1, 2, 2, 1] 。
padding="VALID"/span>
)
tf.compat.v1.global_variables_initializer()
y1, x1 = sess.run([y1,x1])
print(x1.shape)
print()
print(y1.shape)
uj5u.com熱心網友回復:
如果strides > 1那么轉置卷積的多個輸出形狀是可能的。
在一個正常的卷積中,如果padding是VALID,我們可以計算出輸出形狀:
out_shape = ceil((inp_shape - kernel_size 1) / strides)
反過來想,在轉置卷積中,output_shape將等于正常卷積的輸入的形狀,如果它被特定的過濾器和strides值所卷積。
換句話說,轉置卷積有多個可能的輸出形狀,因為你將數字取整。
你代碼中的例子:
y1 = tf.nn.conv2d_transpose(
x1,
dev_con1,
output_shape=[1,5,5, #也可以用[1,5,5,1],]
strides=[1, 2, 2, 1] 。
padding="VALID"/span>
)
如果我用同樣的過濾器和stride來卷積這個東西:
tf.nn.conv2d(y1, filters = tf. ones(shape=([3, 3, 1, 1],dtype=tf.float32), s
trides = [1,2,2,1], padding = 'VALID')
>> <tf.Tensor: shape=(1, 2, 2, 1) ...。
它產生的形狀與當初的x1一樣。
在conv2d_transpose中把輸出形狀改為[1, 6, 6, 1]:
y1 = tf.nn.conv2d_transpose(
x1,
dev_con1,
output_shape=[1,6,6, #用[1,5,5,1]也可以,
strides=[1, 2, 2, 1] 。
padding="VALID"/span>
)
tf.nn.conv2d(y1, filters = tf.ones(shape=([3, 3, 1, 1]), dtype=tf.float32) 。
strides = [1,2,2,1], padding = 'VALID'>)
>> <tf.Tensor: shape=(1, 2, 2, 1) ...。
所以tf.keras.layer.Conv2DTranspose給出了可能的最小輸出形狀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/310704.html
標籤:
上一篇:區塊鏈技術框架&區塊鏈基本原型
