在我的计算管道中,我使用了自定义函数,该函数将创建自定义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])
,因为我不确定就数学观点而言,这样做是否有意义。如何轻松并正确地进行此串联?级联的正确形状是什么?有想法吗?
答案 0 :(得分:2)
要进行级联,您应该为图层提供除concat轴以外的其他形状...对于图像,如果要按要素尺寸(轴-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)