Keras模型的predict和predict_on_batch方法有什么区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras模型的predict和predict_on_batch方法有什么区别?相关的知识,希望对你有一定的参考价值。

根据keras documentation

predict_on_batch(self, x)
Returns predictions for a single batch of samples.

但是,当批量调用时,标准的predict方法似乎没有任何差别,无论它是一个还是多个元素。

model.predict_on_batch(np.zeros((n, d_in)))

是相同的

model.predict(np.zeros((n, d_in)))

(形状numpy.ndarray(n, d_out

答案

不同之处在于,当您传递大于一个批次的x数据时。

predict将逐批浏览所有数据,预测标签。因此,它在内部分批进行分批并一次喂食一批。

另一方面,predict_on_batch假设您传入的数据恰好是一批,因此将其提供给网络。它不会尝试拆分它(根据您的设置,如果阵列非常大,可能会对您的GPU内存造成问题)

另一答案

我只想添加一些不适合评论的内容。似乎predict检查 小心 输出形状:

class ExtractShape(keras.engine.topology.Layer):
    def call(self, x):
        return keras.backend.sum(x, axis=0)
    def compute_output_shape(self, input_shape):
        return input_shape

a = keras.layers.Input((None, None))
b = ExtractShape()(a)
m = keras.Model(a, b)
m.compile(optimizer=keras.optimizers.Adam(), loss='binary_crossentropy')
A = np.ones((5,4,3))

然后:

In [163]: m.predict_on_batch(A)
Out[163]: 
array([[5., 5., 5.],
       [5., 5., 5.],
       [5., 5., 5.],
       [5., 5., 5.]], dtype=float32)
In [164]: m.predict_on_batch(A).shape
Out[164]: (4, 3)

但:

In [165]: m.predict(A)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-165-c5ba5fc88b6e> in <module>()

----> 1 m.predict(A)

~/miniconda3/envs/ccia/lib/python3.6/site-packages/keras/engine/training.py in predict(self, x, batch_size, verbose, steps)
   1746         f = self.predict_function
   1747         return self._predict_loop(f, ins, batch_size=batch_size,
-> 1748                                   verbose=verbose, steps=steps)
   1749 
   1750     def train_on_batch(self, x, y,

~/miniconda3/envs/ccia/lib/python3.6/site-packages/keras/engine/training.py in _predict_loop(self, f, ins, batch_size, verbose, steps)
   1306                         outs.append(np.zeros(shape, dtype=batch_out.dtype))
   1307                 for i, batch_out in enumerate(batch_outs):
-> 1308                     outs[i][batch_start:batch_end] = batch_out
   1309                 if verbose == 1:
   1310                     progbar.update(batch_end)

ValueError: could not broadcast input array from shape (4,3) into shape (5,3)

我不确定这是不是一个错误。

以上是关于Keras模型的predict和predict_on_batch方法有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

model.predict(keras)输出中的类的顺序是啥?

用于多输入模型的 R Keras predict_prob 不起作用。我可以成功地训练模型,但是在评分时出现错误

Keras evaluate() 和 predict() 结果太离谱了

Keras evaluate()和predict()结果太过分了

tf.keras model.predict 导致内存泄漏

在 Keras 中使用 `predict` 以与给定相同的顺序预测一维数组