我正在从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])
任何有关如何连接None
尺寸的建议-即正确广播或重复-
答案 0 :(得分:2)
这是使用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)