如何将张量沿批次连接到 keras 层(不指定批次大小)?

问题描述 投票:0回答:1

我想将嵌入层的输出与自定义张量连接起来 (

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 轴以避免平铺?

提前致谢

python tensorflow machine-learning keras deep-learning
1个回答
2
投票

您想要沿着批量维度连接到形状为

(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)
© www.soinside.com 2019 - 2024. All rights reserved.