【问题标题】:TF predict multiple predictions at onceTF 一次预测多个预测
【发布时间】:2022-08-19 02:50:45
【问题描述】:

我正在尝试批量预测我的模型的一些输入,该模型需要一个包含 2 个固定大小的 1D 列表的输入,如下所示:

[<tf.Tensor: shape=(1, 150), dtype=int64, numpy=array([[2,  924, ...]])>, <tf.Tensor: shape=(1, 150), dtype=int64, numpy=array([[2,  130, ...]])>]

假设这个输入被称为 input_in,我可以通过编写来预测一个样本:

transformer.predict(input_in)

因此 input_in 具有以下形状:

(2, 1, 150)

这有效。但是,我无法理解传递给 predict() 以一次预测多个预测所需的输入。直观地说,形状必须是这样的:

(X, 2, 1, 150)

其中 X 是要通过的预测数。

我试过这个,但我收到一个错误:

transformer.predict([input_in, input_in, input_in])

ValueError: in user code:

    File \"/usr/local/lib/python3.8/dist-packages/keras/engine/training.py\", line 1801, in predict_function  *
        return step_function(self, iterator)
    File \"/usr/local/lib/python3.8/dist-packages/keras/engine/training.py\", line 1790, in step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    File \"/usr/local/lib/python3.8/dist-packages/keras/engine/training.py\", line 1783, in run_step  **
        outputs = model.predict_step(data)
    File \"/usr/local/lib/python3.8/dist-packages/keras/engine/training.py\", line 1751, in predict_step
        return self(x, training=False)
    File \"/usr/local/lib/python3.8/dist-packages/keras/utils/traceback_utils.py\", line 67, in error_handler
        raise e.with_traceback(filtered_tb) from None
    File \"/usr/local/lib/python3.8/dist-packages/keras/engine/input_spec.py\", line 200, in assert_input_compatibility
        raise ValueError(f\'Layer \"{layer_name}\" expects {len(input_spec)} input(s),\'

    ValueError: Layer \"transformer\" expects 2 input(s), but it received 6 input tensors. Inputs received: [<tf.Tensor \'IteratorGetNext:0\' shape=(None, 12) dtype=int64>, <tf.Tensor \'IteratorGetNext:1\' shape=(None, 1) dtype=int64>, <tf.Tensor \'IteratorGetNext:2\' shape=(None, 12) dtype=int64>, <tf.Tensor \'IteratorGetNext:3\' shape=(None, 1) dtype=int64>, <tf.Tensor \'IteratorGetNext:4\' shape=(None, 12) dtype=int64>, <tf.Tensor \'IteratorGetNext:5\' shape=(None, 1) dtype=int64>]

有趣的是,如果我尝试预测一个输入但只是将输入更改为张量,我也会得到类似的错误:

transformer_test.predict(tf.convert_to_tensor([input_tensor,output_tensor]))


-> ValueError: Layer \"transformer\" expects 2 input(s), but it received 1 input tensors. Inputs received: [<tf.Tensor \'IteratorGetNext:0\' shape=(None, 1, 150) dtype=int64>]

有什么建议么?

编辑:我的 Transformer 模型如下所示:

我还复制了该问题的最小版本:https://colab.research.google.com/drive/1xYNjLURQcGPIXeWV-xo4_iA09KDJvNfi?usp=sharing

如果全部运行,最后 2 个单元格会出错。我一直在尝试使用批量预测的输入,但似乎没有任何效果......

  • 这意味着您的 input_ids 都是不同的形状,您是否将输入传递给标记器以对其进行标准化?
  • @EdwinCheong 你是对的,已修复,现在它们都被填充到相同的长度。但是我仍然不知道这个所需的形状并且仍然得到同样的错误......我现在编辑了这个问题
  • @Kurt 你的transformer 型号是什么?你得到的错误的完整堆栈跟踪是什么?
  • @thushv89 使用 model.summary() 的屏幕截图(出于格式化目的)和完整的堆栈跟踪更新了问题...希望没问题 :)
  • 我还更新了问题以包含一个展示错误的 colab 链接。

标签: python tensorflow machine-learning nlp tf.keras


【解决方案1】:

我不是专家,但您可以尝试使用 tf.stack 堆叠多个输入(input_in),而不是将它们作为列表传递。

transformer.predict (tf.stack([input_tensor, input_tensor, input_tensor]))

这是我最好的猜测

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2016-04-04
    • 1970-01-01
    • 2017-02-02
    • 2018-03-04
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多