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

在我的计算管道中,我使用了自定义函数来创建自定义 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])因为我不确定它从数学角度来看是否有意义。如何使这种串联变得简单且正确?连接的正确形状是什么?任何想法?


DIEA
浏览 131回答 1
1回答

偶然的你

要操作串联,您应该提供除串联轴之外形状相同的图层...在图像的情况下,如果您想在特征维度(轴 -1)上串联它们,则图层必须具有相同的batch_dim、宽度和高度。如果你想强制执行该操作,你需要做一些等于维度的事情。一种可能性是填充。下面是我在最后一个维度上连接两层的示例batch_dim = 32x1 = 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 = 32x1 = 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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python