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



在我的计算管道中,我使用了自定义函数,该函数将创建自定义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)

我试图在1D卷积中用TensorShape([None, 21, 21, 64])TensorShape([None, 10, 10, 192])的形状重塑张量,并进行合并,然后将输出重塑为2d卷积。我的方式不起作用。有人能提出可能的方法吗?有什么想法吗?

更新

我仍然不确定获得级联的输出形状的方式是否是TensorShape([None, 21+10, 21+10, 192+64]),因为我不确定从数学角度来看它是否有意义。如何使这种连接容易且正确?连接一个的正确形状是什么?知道吗?

要操作串联,除了concat轴之外,您应该提供具有相同形状的层。。。对于图像,如果要在特征维度(轴-1(上连接它们,则层必须具有相同的batchdim、宽度和高度。

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

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)

最新更新