我想将嵌入层的输出与自定义张量连接起来 (
myarr
/ myconst
)。我可以用固定的批量大小指定所有内容,如下所示:
import numpy as np
import tensorflow as tf
BATCH_SIZE = 100
myarr = np.ones((10, 5))
myconst = tf.constant(np.tile(myarr, (BATCH_SIZE, 1, 1)))
# Model definition
inputs = tf.keras.layers.Input((10,), batch_size=BATCH_SIZE)
x = tf.keras.layers.Embedding(10, 5)(inputs)
x = tf.keras.layers.Concatenate(axis=1)([x, myconst])
model = tf.keras.models.Model(inputs=inputs, outputs=x)
但是,如果我不指定批量大小并平铺我的数组,即只是以下...
myarr = np.ones((10, 5))
myconst = tf.constant(myarr)
# Model definition
inputs = tf.keras.layers.Input((10,))
x = tf.keras.layers.Embedding(10, 5)(inputs)
x = tf.keras.layers.Concatenate(axis=1)([x, myconst])
model = tf.keras.models.Model(inputs=inputs, outputs=x)
...我收到一条错误,指出形状
[(None, 10, 5), (10, 5)]
无法连接。有没有办法添加这个 None
/batch_size 轴以避免平铺?
提前致谢
您想要沿着批量维度连接到形状为
(batch, 10, 5)
的 3D 张量和形状为 (10, 5)
的常量。为此,您的常数必须是 3D。因此,您必须在 (1, 10, 5)
中重塑它的形状,并沿着 axis=0
重复它,以匹配形状 (batch, 10, 5)
并进行串联。
我们在
Lambda
层中执行此操作:
X = np.random.randint(0,10, (100,10))
Y = np.random.uniform(0,1, (100,20,5))
myarr = np.ones((1, 10, 5)).astype('float32')
myconst = tf.convert_to_tensor(myarr)
def repeat_const(tensor, myconst):
shapes = tf.shape(tensor)
return tf.repeat(myconst, shapes[0], axis=0)
inputs = tf.keras.layers.Input((10,))
x = tf.keras.layers.Embedding(10, 5)(inputs)
xx = tf.keras.layers.Lambda(lambda x: repeat_const(x, myconst))(x)
x = tf.keras.layers.Concatenate(axis=1)([x, xx])
model = tf.keras.models.Model(inputs=inputs, outputs=x)
model.compile('adam', 'mse')
model.fit(X, Y, epochs=3)