web-dev-qa-db-fra.com

Quelle est la différence entre les méthodes Predict et Predict_on_batch d'un modèle Keras?

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)

14
Phylliade

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)

16
GPhilo

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.

2
Jorge E. Cardona