0
votes

En utilisant tensorflow, comment puis-je trouver le temps nécessaire à une époque lors de l'ajustement?

Je suis ce tutoriel,https://www.tensorflow.org/tutorials/keras/basic_classification

Lorsque model.fit(train_images, train_labels, epochs=5, verbose =1) le modèle en utilisant model.fit(train_images, train_labels, epochs=5, verbose =1) , les heures sont affichées dans la console python. Je veux obtenir l'heure du mur de chaque époque en utilisant time.clock() .

Je suppose que lorsque plus d'époques sont ajoutées, le temps d'adaptation augmente linéairement, mais je veux représenter graphiquement cela pour être sûr.

Outre le montage avec 1 époque, puis 2 époques, puis 3 époques, etc., comment puis-je calculer le temps de formation (temps d'adaptation) pour un nombre croissant d'époques?


0 commentaires

3 Réponses :


1
votes

À l'aide d'un rappel personnalisé, vous pouvez tracer le temps total nécessaire pour s'adapter à certaines époques.

def on_epoch_end(self,epoch,logs= {}):
    # same as the on_train_end function

Et puis passez ceci comme un rappel à la fonction model.fit comme ceci

timetaken = timecallback()
model.fit(train_images, train_labels, epochs=5,callbacks = [timetaken])

Cela trace un graphique à la fin de la formation qui montre le temps total nécessaire au modèle pour s'entraîner jusqu'à une certaine époque depuis le début.

Et si vous voulez tracer le temps par époque. Vous pouvez remplacer la méthode on_train_end par on_epoch_end.

class timecallback(tf.keras.callbacks.Callback):
    def __init__(self):
        self.times = []
        # use this value as reference to calculate cummulative time taken
        self.timetaken = time.clock()
    def on_epoch_end(self,epoch,logs = {}):
        self.times.append((epoch,time.clock() - self.timetaken))
    def on_train_end(self,logs = {}):
        plt.xlabel('Epoch')
        plt.ylabel('Total time taken until an epoch in seconds')
        plt.plot(*zip(*self.times))
        plt.show()


0 commentaires

0
votes

Bonne pratique pour utiliser les rappels. Comment enregistrer les durées de l'histoire?

Disons que nous utilisons history = model.fit( ..., callbacks=[my_training_callback])

Que dois-je écrire dans la définition de my_training_callback ? J'essaye de faire:

def my_training_callback(Callback):
    def __init__(self):
        mark = 0
        duration = 0
    def on_epoch_begin(self, epoch, logs=None):
        self.mark = time()
    def on_epoch_end(self, epoch, logs=None):
        self.duration = time() - self.mark

Cela fonctionne bien, mais j'ai du mal à ajouter la valeur de duration à l'historique. Merci


0 commentaires

0
votes

L'utilisation d'un rappel personnalisé fonctionne certainement, mais vous devez faire attention à la façon dont vous générez un horodatage. Le time.clock() recommandé fonctionne différemment sur les systèmes Windows et UNIX et peut ne pas générer le comportement souhaité. Par conséquent, je recommande une modification du code que d'autres ont recommandé, en utilisant la méthode intégrée tensorflow.timestamp () ( documentation ). Notez qu'il s'agit d'un objet tensoriel, donc si vous souhaitez tracer l'heure sous forme de texte, comme je l'ai fait, vous devrez extraire la valeur flottante. Je l'ai fait en utilisant .numpy() car il s'agit d'un EagerTensor .

model.fit(train_images, train_labels, epochs=5,callbacks = [timecallback()])

Ensuite, lors de l'appel de model fit:

import tensorflow as tf
import matplotlib.pyplot as plt
from datetime import datetime

class timecallback(tf.keras.callbacks.Callback):
    def __init__(self):
        self.times = []
        self.epochs = []
        # use this value as reference to calculate cummulative time taken
        self.timetaken = tf.timestamp()
    def on_epoch_end(self,epoch,logs = {}):
        self.times.append(tf.timestamp() - self.timetaken)
        self.epochs.append(epoch)
    def on_train_end(self,logs = {}):
        plt.xlabel('Epoch')
        plt.ylabel('Total time taken until an epoch in seconds')
        plt.plot(self.epochs, self.times, 'ro')
        for i in range(len(self.epochs)):
          j = self.times[i].numpy()
          if i == 0:
            plt.text(i, j, str(round(j, 3)))
          else:
            j_prev = self.times[i-1].numpy()
            plt.text(i, j, str(round(j-j_prev, 3)))
        plt.savefig(datetime.now().strftime("%Y%m%d%H%M%S") + ".png")


0 commentaires