Tensorflow / Keras:tf.reshape在多个Conv2D之后连接

时间:2020-09-11 15:01:30

标签: python tensorflow keras

我要实现多个Conv2D层,然后将输出连接起来。

x = Conv2D(f, kernel_size=(3,3), strides=(1,1))(input)
y = Conv2D(f, kernel_size=(5,5), strides=(2,2))(input)
output = Concatenate()([x, y])

您知道,不同的内核大小会产生不同的输出形状。尽管我可以做到:

x = Conv2D(f, kernel_size=(3,3), strides=(1,1), padding="same")(input)
y = Conv2D(f, kernel_size=(5,5), strides=(2,2), padding="same")(input)
output = Concatenate()([x, y])

但是那会大大增加通道数量,这使我用尽了内存。我还可以计算输出形状,但是如果更改内核大小,这将很不方便。 我尝试过:

y = tf.reshape(y, x.shape)

但是我给出了错误: ValueError: Cannot convert a partially known TensorShape to a Tensor
有没有简单的方法来连接多个Conv2D层的输出?

1 个答案:

答案 0 :(得分:1)

如果两个图层的形状不匹配,则无法将它们连接在一起。您可以利用 if (!snapshot.empty) { const doc = snapshot.docs[0]; projectData = doc.data(); status = 200; } 层添加具有ZeroPadding2D值的行和列,以匹配输出的形状。

这是形状最短的例子。

代码:

0

输出:

Output

在此示例中,我将输入形状设为from tensorflow.keras.layers import * from tensorflow.keras import * import tensorflow as tf input = Input(shape = (28,28,3)) x = Conv2D(3, kernel_size=(3,3), strides=(1,1))(input) y = Conv2D(3, kernel_size=(5,5), strides=(2,2))(input) z = tf.keras.layers.ZeroPadding2D(padding=(7,7))(y) output = Concatenate()([x, z]) model = Model(inputs = input, outputs = output) tf.keras.utils.plot_model(model, 'my_first_model.png', show_shapes=True) 。您可以添加自己的输入形状,并相应地更改要添加的填充行和填充列的数量。

您可以查看(28,28,3) here

的文档