繁体   English   中英

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

[英]How to concatenate two tensors with different shape in 2d convolution in tensorflow?

在我的计算管道中,我使用了自定义函数来创建自定义 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)上串联它们,则图层必须具有相同的 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM