具有 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)]
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)]