我正在使用来自 python 的 Tensorflow。我有两个张量我想连接(它也可能是另一个操作,我不认为确切的操作对这个问题很重要)。这些张量的形状定义为(N1 != N2 是正整数):
a: (None, N1)
b: (1 , N2)
因为我将沿着最后一个轴连接,所以似乎可以执行此操作。但是 tensorflow 拒绝了。代码
from tensorflow import keras
from tensorflow.keras import layers
N1 = 2
N2 = 3
D1 = None
a = keras.Input(shape=(D1, N1))
b = keras.Input(shape=(1, N2))
c = layers.Concatenate(axis=-1)([a, b])
失败
ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, None, 2), (None, 1, 3)]
我最接近完成这项工作的方法是使用 RepeatVector,如下所示,但不幸的是,这仅适用于静态尺寸,不适用于动态尺寸:
N1 = 2
N2 = 3
D1 = 7
a = keras.Input(shape=(D1, N1))
b = keras.Input(shape=(N2))
b_repeated = layers.RepeatVector(D1)(b)
c = layers.Concatenate()([a, b_repeated])
任何关于如何连接(即进行正确的广播或重复)与这样的无维度的建议将不胜感激!
请您参考如下方法:
这是使用 lambda 层执行此操作的方法:
import keras
from keras import layers
import keras.backend as K
N1 = 2
N2 = 3
D1 = None
a = keras.Input(shape=(D1, N1))
b = keras.Input(shape=(N2,))
c = layers.Lambda(lambda ab: K.concatenate([ab[0], K.repeat(ab[1], K.shape(ab[0])[1])],
axis=-1))([a, b])
print(c)
# Tensor("lambda_1/concat:0", shape=(?, ?, 5), dtype=float32)
