Selon les keras documentation :
predict_on_batch(self, x)
Returns predictions for a single batch of samples.
Cependant, il ne semble pas y avoir de différence avec la méthode standard predict
lorsqu'elle est appelée sur un lot, que ce soit avec un ou plusieurs éléments.
model.predict_on_batch(np.zeros((n, d_in)))
est le même que
model.predict(np.zeros((n, d_in)))
(une numpy.ndarray
de forme (n, d_out
)
La différence réside dans le fait que vous transmettez en tant que données x
supérieures à un lot.
predict
parcourra toutes les données, lot par lot , prédisant les étiquettes. Il effectue ainsi en interne le fractionnement en lots et l'alimentation d'un lot à la fois.
predict_on_batch
, d'autre part, suppose que les données que vous transmettez sont exactement un lot et les alimentent donc sur le réseau. Il n'essaiera pas de le diviser (ce qui, selon votre configuration, peut s'avérer problématique pour votre mémoire GPU si le tableau est très grand)
Je veux juste ajouter quelque chose qui ne rentre pas dans un commentaire. Il semble que predict
check soigneusement la forme de sortie:
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))
Alors:
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)
Mais:
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)
Je ne sais pas si c'est vraiment un bug.