我正在使用带有Tensorflow后端的Keras来构建此问题的模型:https://www.kaggle.com/cfpb/us-consumer-finance-complaints(只是练习)。
我使用tf.data.Dataset
API训练我的Keras模型。现在,我有一个Pandas DataFrame df_testing
,其列是complaint
(字符串)和label
(也是字符串)。我想对这些新样本进行预测。我创建一个tf.data.Dataset
对象,执行预处理,创建迭代器,并在模型上调用预测:
data = df_testing["complaint"].values
labels = df_testing["label"].values
dataset = tf.data.Dataset.from_tensor_slices((data))
dataset = dataset.map(lambda x: ({'reviews': x}))
dataset = dataset.batch(self.batch_size).repeat()
dataset = dataset.map(lambda x: self.preprocess_text(x, self.data_table))
dataset = dataset.map(lambda x: x['reviews'])
dataset = dataset.make_initializable_iterator()
我的培训使用的是tf.data.Dataset
,其中每个元素的格式均为({'reviews': "movie was great"}, "positive")
,因此在这里我将其模仿以进行预测。另外,我的预处理只是将我的字符串转换为Tensor
的整数。
当我打电话时:
preds = model.predict(dataset)
但是我被告知predict
通话失败:
ValueError: When using iterators as input to a model, you should specify the `steps` argument.
因此我将此调用修改为:
preds = model.predict(dataset, steps=3)
但现在我回来了:
ValueError: Please provide data as a list or tuple of 2 elements - input and target pair. Received Tensor("IteratorGetNext_2:0", shape=(?, 100), dtype=int32)
我在这里做错了什么?预测时,我不必提供2个元素的元组(我不需要标签)。
感谢您提供的任何帮助!
答案 0 :(得分:1)
您正在使用哪个版本的Keras?我无法在代码库中找到该特定错误消息,但我想我找到了它过去的位置。
这是我认为与您正在运行的版本接近的代码版本中的错误:commit
输入验证的条件已更改(在最新版本中,您的输入将被接受),但重要的是错误消息更加清晰:
raise ValueError(
'Please provide data as a list or tuple of 1, 2, or 3 elements '
' - `(input)`, or `(input, target)`, or `(input, target,'
'sample_weights)`. Received %s. We do not use the `target` or'
'`sample_weights` value here.' % inputs.output_shapes)
目标值从未在预测函数中使用,因此可以是任何值。永远不会使用功能next_element[1]
的其余部分。
[ TLDR ]使用当前版本,向数据添加虚拟目标值,或更新Keras。
答案 1 :(得分:0)
以下代码对我有用(在tensorflow 1.10.0上测试):
[TLDR] 仅将空字典插入为虚拟输入并指定步数:
model.predict(x={},steps=4)
完整代码:
import numpy as np
import tensorflow as tf
from tensorflow.data import Dataset
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.models import Model
# dummy data:
x = np.arange(4).reshape(-1, 1).astype('float32')
y = np.arange(5, 9).reshape(-1, 1).astype('float32')
# build the Datasets
ds_x = Dataset.from_tensor_slices(x).repeat().batch(4)
it_x = ds_x.make_one_shot_iterator()
ds_y = Dataset.from_tensor_slices(y).repeat().batch(4)
it_y = ds_y.make_one_shot_iterator()
# build compile and train the model
input_vals = Input(tensor=it_x.get_next())
output = Dense(1, activation='relu')(input_vals)
model = Model(inputs=input_vals, outputs=output)
model.compile('rmsprop', 'mse', target_tensors=[it_y.get_next()])
model.fit(steps_per_epoch=1, epochs=5, verbose=2)
# infer using the dataset
model.predict(x={},steps=4)