首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras / Tensorflow:使用tf.data.Dataset API进行预测

Keras / Tensorflow:使用tf.data.Dataset API进行预测
EN

Stack Overflow用户
提问于 2018-11-19 23:33:34
回答 2查看 7.4K关注 0票数 8

我使用带有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对象,执行了预处理,制作了一个Iterator,并对我的模型进行了调用:

代码语言:javascript
复制
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

当我打电话:

代码语言:javascript
复制
preds = model.predict(dataset)

但我听说我的predict电话失败了:

代码语言:javascript
复制
ValueError: When using iterators as input to a model, you should specify the `steps` argument.

因此,我将这个调用修改为:

代码语言:javascript
复制
preds = model.predict(dataset, steps=3)

但现在我回来了

代码语言:javascript
复制
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个元素组成的元组(我不需要标签)。

感谢您提供的任何帮助!

EN

回答 2

Stack Overflow用户

发布于 2018-11-20 01:17:28

你用的是什么版本的Keras?我在代码库中找不到特定的错误消息,但我想我找到了它以前的位置。

下面是代码版本中的错误,我认为它接近您正在运行的版本:提交

下面是该错误的更新版本:eager.py#L464

输入验证的条件已经改变(在最新版本中,您的输入将被接受),但与此相关的是,错误消息要清楚得多:

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2019-04-11 03:54:52

以下代码适用于我(在tensorflow 1.10.0上进行了测试):

TLDR只插入空字典作为虚拟输入,并指定步骤数:

代码语言:javascript
复制
model.predict(x={},steps=4)

完整代码:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53384168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档