Tensorflow 数据集未将值解包到 fit() 方法

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

我正在构建一个模型,它接受 4 个编码文本输入(感谢 keras 的 TextVectorization 层)并返回 2 个标量输出。

当我在模型上调用 fit() 方法时,出现错误。

我收到以下错误:

ValueError: Layer "model" expects 4 input(s), but it received 1 input tensors. Inputs received: []

我读过这个问题:ValueError:Layer需要2个输入,但在训练CNN时它收到了1个输入张量但我没有得到答案以及如何将其应用到我的场景中,不仅我有多个输入,也有多个输出。

这是生成模型的代码:

def generate_model(max_tokens):
    inputs = []
    for _ in range(4):
        inputs.append(keras.layers.Input(shape=(None,), dtype="int64"))

    concatenate = keras.layers.concatenate(inputs)
    
    embedded = keras.layers.Embedding(input_dim=max_tokens, output_dim=256, mask_zero=False)(concatenate)

    x = keras.layers.Bidirectional(keras.layers.LSTM(32))(embedded)
    x = keras.layers.Dropout(0.5)(x)

    output_content = keras.layers.Dense(1, activation="linear", name="content")(x)
    output_wording = keras.layers.Dense(1, activation="linear", name="wording")(x)

    model = keras.models.Model(inputs=inputs, outputs=[output_content, output_wording])

    return model

为了构建 Tensorflow 数据集,我编写了以下代码:

max_tokens = 20000
max_length = 600

text_vectorization = keras.layers.TextVectorization(
 max_tokens=max_tokens,
 output_mode="int",
 output_sequence_length=max_length,
)

text_vectorization.adapt(all_texts) # A list of all my texts

train_features_tuple = tuple([train_features.iloc[:, i] for i in range(train_features.shape[1])])
train_targets_tuple = tuple([train_targets.iloc[:, i] for i in range(train_targets.shape[1])])

train_ds = tf.data.Dataset.from_tensor_slices((train_features_tuple, train_targets_tuple))

def preprocess_text_and_outputs(inputs, outputs):
    vectorized_inputs = [text_vectorization(text) for text in inputs]
    return vectorized_inputs, outputs


train_ds = train_ds.map(preprocess_text_and_outputs, num_parallel_calls=10)

这就是 train_ds 的样子(仅第一行):

for inputs, targets in train_ds:
    print(type(inputs))
    print(type(targets))
    break
<class 'tensorflow.python.framework.ops.EagerTensor'>
<class 'tuple'>

首先要注意的是,文本向量化步骤将第一个元组更改为

<class 'tensorflow.python.framework.ops.EagerTensor'>

for inputs, targets in train_ds:
    print(inputs.shape)
    print(targets) # targets is a tuple so I can't use shape
    break
(4, 600)
(<tf.Tensor: shape=(), dtype=float64, numpy=0.205682506482641>, <tf.Tensor: shape=(), dtype=float64, numpy=0.380537638762288>)

其次,如您所见,我在第一个张量中有 4 个输入,在第二个张量中有 2 个输出。

正如我所说,当我调用 fit() 方法时发生错误:

history = model.fit(train_ds, epochs=20, batch_size=32, callbacks=[callbacks])

然后我收到以下错误:

ValueError: Layer "model" expects 4 input(s), but it received 1 input tensors. Inputs received: []

为什么它无法解压我的数据集中的值?

事实上,我正在使用 François Chollet 所著的《Python 深度学习》一书,他也这么做了:

model.fit(int_train_ds, validation_data=int_val_ds, epochs=10,
 callbacks=callbacks)

而且它有效!但在书中,他只有1个输入和1个输出。

感谢您的帮助。

python tensorflow keras deep-learning
© www.soinside.com 2019 - 2024. All rights reserved.