web-dev-qa-db-fra.com

enregistrer le temps de calcul pour chaque époque en Keras pendant model.fit ()

Je veux comparer le temps de calcul entre différents modèles. Pendant l'ajustement, le temps de calcul par époque est imprimé sur la console.

Epoch 5/5
160000/160000 [==============================] - **10s** ......

Je cherche un moyen de stocker ces temps de manière similaire aux métriques du modèle qui sont enregistrées dans chaque époque et disponibles via l'objet historique.

17
itamar kanter

Essayez le rappel suivant:

class TimeHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.times = []

    def on_Epoch_begin(self, batch, logs={}):
        self.Epoch_time_start = time.time()

    def on_Epoch_end(self, batch, logs={}):
        self.times.append(time.time() - self.Epoch_time_start)

Ensuite:

time_callback = TimeHistory()
model.fit(..., callbacks=[..., time_callback],...)
times = time_callback.times

Dans ce cas, times doit stocker les temps de calcul Epoch.

26
Marcin Możejko

se référer aux réponses de Marcin Możejko

import time

class TimeHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.times = []

    def on_Epoch_begin(self, Epoch, logs={}):
        self.Epoch_time_start = time.time()

    def on_Epoch_end(self, Epoch, logs={}):
        self.times.append(time.time() - self.Epoch_time_start)

puis

time_callback = TimeHistory()
model.fit(..., callbacks=[..., time_callback],...)

journal d'excution

Train on 17000 samples, validate on 8000 samples
Epoch 1/3
17000/17000 [==============================] - 5s 266us/step - loss: 36.7562 - mean_absolute_error: 4.5074 - val_loss: 34.2384 - val_mean_absolute_error: 4.3929
Epoch 2/3
17000/17000 [==============================] - 4s 253us/step - loss: 33.5529 - mean_absolute_error: 4.2956 - val_loss: 32.0291 - val_mean_absolute_error: 4.2484
Epoch 3/3
17000/17000 [==============================] - 5s 265us/step - loss: 31.0547 - mean_absolute_error: 4.1340 - val_loss: 30.6292 - val_mean_absolute_error: 4.1480

puis

print(time_callback.times)

production

[4.531331300735474, 4.308278322219849, 4.505300283432007]
9
ryh

Conformément à Benjamin Striner vous pouvez écrire un rappel de keras comme suit

from time import time
class TimingCallback(Callback):
  def __init__():
    self.logs=[]
  def on_Epoch_begin(Epoch, logs={}):
    self.starttime=time()
  def on_Epoch_end(Epoch, logs={}):
    self.logs.append(time()-self.starttime)
...
cb = TimingCallback()
model.fit(..., callbacks=[cb])
print(cb.logs)