具有 lambda 层的 tf 切片仅使用最后一个索引

tf slices with lambda layer only uses last index

TLDR


我的for lambda层获取tensor slices只获取最后一列数据

我有一个 (Batch_size, R) 形状张量,我将通过每个 R 特征的嵌入层分别 运行。我编写了以下代码将输入 (Batch_size, R) 形张量拆分为 R (None,) 切片。

R=2
inp = tf.keras.Input(shape = (R,), dtype=tf.int32)

SLICES = []
for i in range(R):
    slice_ = tf.keras.layers.Lambda(lambda a: a[:,i], name=f"slice_{i}", dtype=tf.int32)(inp)
    SLICES.append(slice_)

model = tf.keras.Model(inputs= inp, outputs = SLICES)

运行 tf.keras.utils.plot_model(model, show_shapes=True, show_dtype=True) 使代码看起来有效。 运行 模型中的数据表明存在问题:模型采用最后一个特征并将其复制到所有层。

input_ = np.array([[1,2],[3,4],[5,6]])
model.predict(input_)

[array([2, 4, 6], dtype=int32), array([2, 4, 6], dtype=int32)]

方法一

我通过摆脱 for 循环并手动编写每一层来“解决”了 R=2 情况下的问题。

slice1 = tf.keras.layers.Lambda(lambda a: a[:,0], name=f"first_slice", dtype=tf.int32)(inp)
slice2 = tf.keras.layers.Lambda(lambda a: a[:,1], name=f"second_slice", dtype=tf.int32)(inp)
model = tf.keras.Model(inputs= inp, outputs = [slice1, slice2])
input_ = np.array([[1,2],[3,4],[5,6]])
model.predict(input_)

[array([1, 3, 5], dtype=int32), array([2, 4, 6], dtype=int32)]

出于多种原因,这显然是不可取的。

方法二

另一种方法是在原始特征上嵌入。不幸的是,我在嵌入操作前面有一个类似 CutMix 的层,阻止我嵌入原始特征。


如何让 for 循环正确复制张量的每个切片?

您的第一段代码不起作用的原因是您需要像这样编写 lambda 函数:lambda a,k=i: a[:,k]

R=2
inp = tf.keras.Input(shape = (R,), dtype=tf.int32)

SLICES = []
for i in range(R):
    slice_ = tf.keras.layers.Lambda(lambda a,k=i: a[:,k], name=f"slice_{i}", dtype=tf.int32)(inp)
    SLICES.append(slice_)

model = tf.keras.Model(inp, SLICES)

input_ = np.array([[1,2],[3,4],[5,6]])
print(model.predict(input_))

输出:

[array([1, 3, 5], dtype=int32), array([2, 4, 6], dtype=int32)]