为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

1 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

要操作串联,您应该提供除串联轴之外形状相同的图层...在图像的情况下,如果您想在特征维度(轴 -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)


查看完整回答
反对 回复 2023-06-27
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信