2017-07-07 3089 views
4

按照keras documentationKeras模型的预测和predict_on_batch方法有什么区别?

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))) 

(形状(n, d_outnumpy.ndarray

+0

数组的大小是多少? 'predict'采用'batch_size'参数,如果未设置,则默认为32。如果n <= 32,那么这两个函数调用应该是相同的。 – Toterich

回答

5

传递时作为x数据比一批较大的不同之处在于英寸

predict会遍历所有的数据,批处理,预测标签。 因此它内部分批分批并一次进料一批。

predict_on_batch另一方面,假设您传入的数据恰好是一个批次,因此将其馈送到网络。它不会尝试拆分它(如果阵列非常大,取决于您的设置,可能会证明您的GPU内存有问题)

+0

好的,thx。 batch_size实际上与SGD的(及其变体)minibatches大致相同。还证实[这里](https://stats.stackexchange.com/questions/221886/how-to-set-mini-batch-size-in-sgd-in-keras)。 – Phylliade

+0

是的,无论你看到什么“批次”,常见的假设是你正在谈论学习算法的minibatches。 – GPhilo

1

我只是想添加一些不适合评论的内容。看来,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) 

我不知道这是否是一个bug真的。

+0

我不明白'(5,3)'来自哪里。您的批次中有5个元素,但为什么第二个维度消失? – GPhilo

+0

@GPhilo请看https://github.com/keras-team/keras/blob/master/keras/engine/training.py#L1336输出列表是预先计算好的,输出形状是在第一维是“批次指数”。 –

+0

好了,我明白你的意思了。我认为“预测”必须检查输出的形状,因为它需要将所有结果放在一起并同时返回它们,因此它为此预先分配了空间。另一方面,'predict_batch'只需要返回一次评估运行的结果,所以它不需要关心返回结果的形状。所以是的,如果自定义图层不能为每个批次生成一个结果,“预测”将不起作用。我也不认为这是一个错误,虽然.. – GPhilo

相关问题