Tensorflow 数据集 API:顺序需要 1 个输入,但它收到 2 个输入张量

Tensoflow Dataset API: sequential expects 1 input but it received 2 input tensors

我使用的是 TF 2.6.2 版。使用 Dataset API

我有一本包含标签列表和编码列表的字典。

使用以下方法创建了一个 TF 数据集:

ds = tf.data.Dataset.from_tensor_slices(dictionary)

为了进行一些自定义批处理,我使用了这行代码:

ds = ds.group_by_window(key_func=lambda elem: tf.cast(elem['label'], tf.int64)%20, reduce_func=lambda _, window: window.batch(batch_size), window_size=batch_size)

本质上,它根据标签列上的取模规则进行批处理。

接下来我创建一个非常简单的模型来吃掉长度为 30 的编码:

model = tf.keras.models.Sequential()
model.add(tf.keras.Input(shape=(30,)))
model.add(tf.keras.layers.Dense(16, activation='relu'))
model.add(tf.keras.layers.Dense(8, activation='relu'))

使用 TripletSemiHardLoss 编译:

model.compile(
    optimizer=tf.keras.optimizers.Adam(0.001),
    loss=tfa.losses.TripletSemiHardLoss(y_true = "label", y_pred = "encodings"))

适合:

history = model.fit(
    ds,
    epochs=5)

这给了我错误:

ValueError: Layer sequential_7 expects 1 input(s), but it received 2 input tensors. Inputs received: [<tf.Tensor 'ExpandDims:0' shape=(None, 1) dtype=int32>, <tf.Tensor 'IteratorGetNext:1' shape=(None, 30) dtype=float64>]

知道如何解决这个问题吗?该模型似乎不知道区分数据集的标签和编码部分。

也许在 ds 中切换 xy 位置:

ds = ds.map(lambda x: (x['positives'], x['id_col']))
history = model.fit(
    ds,
    epochs=5)

或者根据您的数据结构,也许:

ds = ds.map(lambda x: (x[1], x[0]))
history = model.fit(
    ds,
    epochs=5)