在我的计算管道中,我使用了自定义函数来创建自定义 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)
添加回答
举报
0/150
提交
取消