【问题标题】:How to use Keras' predict_on_batch in tf.data.Dataset.map()?如何在 tf.data.Dataset.map() 中使用 Keras 的 predict_on_batch?
【发布时间】:2019-08-24 10:33:54
【问题描述】:

我想找到一种在tf.data.Dataset.map()TF2.0. 中使用Keras 的predict_on_batch 的方法

假设我有一个 numpy 数据集

n_data = 10**5
my_data    = np.random.random((n_data,10,1))
my_targets = np.random.randint(0,2,(n_data,1))

data = ({'x_input':my_data}, {'target':my_targets})

还有一个tf.keras 模型

x_input = Input((None,1), name = 'x_input')
RNN     = SimpleRNN(100,  name = 'RNN')(x_input)
dense   = Dense(1, name = 'target')(RNN)

my_model = Model(inputs = [x_input], outputs = [dense])
my_model.compile(optimizer='SGD', loss = 'binary_crossentropy')

我可以用

创建一个批处理的dataset
dataset = tf.data.Dataset.from_tensor_slices(data)
dataset = dataset.batch(10)
prediction_dataset = dataset.map(transform_predictions)

其中transform_predictions 是一个用户定义的函数,它从predict_on_batch 获取预测

def transform_predictions(inputs, outputs):
    predictions = my_model.predict_on_batch(inputs)
    # predictions = do_transformations_here(predictions)
    return predictions

这给出了来自predict_on_batch 的错误:

AttributeError: 'Tensor' object has no attribute 'numpy'

据我了解,predict_on_batch 需要一个 numpy 数组,并且它正在从数据集中获取一个张量对象。

似乎一种可能的解决方案是将predict_on_batch 包装在一个`tf.py_function 中,尽管我也无法让它工作。

有人知道怎么做吗?

【问题讨论】:

  • R here 有一个类似的问题没有解决方案

标签: python tensorflow keras tensorflow-datasets tensorflow2.0


【解决方案1】:

Dataset.map() 返回没有 numpy() 方法的<class 'tensorflow.python.framework.ops.Tensor'>

遍历数据集返回 <class 'tensorflow.python.framework.ops.EagerTensor'> 有一个 numpy() 方法。

为 predict() 系列方法提供一个热切的张量可以正常工作。

你可以试试这样的:

dataset = tf.data.Dataset.from_tensor_slices(data)
dataset = dataset.batch(10)

for x,y in dataset:
    predictions = my_model.predict_on_batch(x['x_input'])
    #or 
    predictions = my_model.predict_on_batch(x)

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 2019-08-09
    • 2017-12-11
    • 1970-01-01
    • 2019-12-22
    • 2020-08-09
    • 1970-01-01
    • 2018-07-07
    • 2019-08-21
    相关资源
    最近更新 更多