如何在张量流的二维卷积中连接两个具有不同形状的张量?

时间:2020-08-26 20:41:44

标签: python tensorflow keras

在我的计算管道中,我使用了自定义函数,该函数将创建自定义keras块,并与Conv2D多次使用了此块。最后,我得到了两个不同的张量,它们是具有不同张量形状的特征图:TensorShape([None, 21, 21, 64])TensorShape([None, 10, 10, 192])。在这种情况下,使用tf.keras.layers.concatenate进行连接对我不起作用。谁能指出我如何将这两个张量连接为一个?有什么想法可以实现吗?

如果我可以将形状为TensorShape([None, 21, 21, 64])TensorShape([None, 10, 10, 192])的张量连接起来,我想在连接之后执行以下操作。

x = Conv2D(32, (2, 2), strides=(1,1), padding='same')(merged_tensors)
x = BatchNormalization(axis=-1)(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Flatten()(x)
x = Dense(256)(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = Dropout(0.25)(x)
x = Dropout(0.25)(x)
x = Dense(10)(x)
x = Activation('softmax')(x)
outputs = x

model = tf.keras.Model(inputs=inputs, outputs=outputs)

我试图在一维卷积中将形状为TensorShape([None, 21, 21, 64])TensorShape([None, 10, 10, 192])的张量整形并合并,然后将输出整形为二维卷积。我的方法不起作用。有人可以建议这样做的可能方法吗?有什么想法吗?

更新

我仍然不确定获得连接的输出形状的方式是否为TensorShape([None, 21+10, 21+10, 192+64]),因为我不确定就数学观点而言,这样做是否有意义。如何轻松并正确地进行此串联?级联的正确形状是什么?有想法吗?

1 个答案:

答案 0 :(得分:2)

要进行级联,您应该为图层提供除concat轴以外的其他形状...对于图像,如果要按要素尺寸(轴-1)进行级联,则这些图层必须具有相同的batch_dim,宽度和高度。

如果要强制执行操作,则需要执行与维数相等的操作。一种可能是填充。在下面的示例中,我在最后一个维度上连接了两层

batch_dim = 32
x1 = np.random.uniform(0,1, (batch_dim, 10,10,192)).astype('float32')
x2 = np.random.uniform(0,1, (batch_dim, 21,21,64)).astype('float32')

merged_tensors = Concatenate()([ZeroPadding2D(((6,5),(6,5)))(x1), x2]) # (batch_dim, 21, 21, 192+64)

使用池化而不是填充:

batch_dim = 32
x1 = np.random.uniform(0,1, (batch_dim, 10,10,192)).astype('float32')
x2 = np.random.uniform(0,1, (batch_dim, 21,21,64)).astype('float32')

merged_tensors = Concatenate()([MaxPool2D(2)(x2), x1]) # (batch_dim, 10, 10, 192+64)
相关问题