我正在构建一个模型,它接受 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个输出。
感谢您的帮助。