2016-04-30 6 views
17

En utilisant Anaconda Python 2.7 de Windows 10.Comment retourner l'histoire de la perte de validation Keras

Je suis la formation d'un modèle de langage en utilisant la exmaple Keras:

print('Build model...') 
model = Sequential() 
model.add(GRU(512, return_sequences=True, input_shape=(maxlen, len(chars)))) 
model.add(Dropout(0.2)) 
model.add(GRU(512, return_sequences=False)) 
model.add(Dropout(0.2)) 
model.add(Dense(len(chars))) 
model.add(Activation('softmax')) 

model.compile(loss='categorical_crossentropy', optimizer='rmsprop') 

def sample(a, temperature=1.0): 
    # helper function to sample an index from a probability array 
    a = np.log(a)/temperature 
    a = np.exp(a)/np.sum(np.exp(a)) 
    return np.argmax(np.random.multinomial(1, a, 1)) 


# train the model, output generated text after each iteration 
for iteration in range(1, 3): 
    print() 
    print('-' * 50) 
    print('Iteration', iteration) 
    model.fit(X, y, batch_size=128, nb_epoch=1) 
    start_index = random.randint(0, len(text) - maxlen - 1) 

    for diversity in [0.2, 0.5, 1.0, 1.2]: 
     print() 
     print('----- diversity:', diversity) 

     generated = '' 
     sentence = text[start_index: start_index + maxlen] 
     generated += sentence 
     print('----- Generating with seed: "' + sentence + '"') 
     sys.stdout.write(generated) 

     for i in range(400): 
      x = np.zeros((1, maxlen, len(chars))) 
      for t, char in enumerate(sentence): 
       x[0, t, char_indices[char]] = 1. 

      preds = model.predict(x, verbose=0)[0] 
      next_index = sample(preds, diversity) 
      next_char = indices_char[next_index] 

      generated += next_char 
      sentence = sentence[1:] + next_char 

      sys.stdout.write(next_char) 
      sys.stdout.flush() 
     print() 

Selon la documentation Keras, la méthode renvoie model.fit un rappel d'historique, qui possède un attribut d'historique contenant les listes de pertes successives et d'autres mesures.

hist = model.fit(X, y, validation_split=0.2) 
print(hist.history) 

Après la formation de mon modèle, si je lance print(model.history) je reçois l'erreur:

AttributeError: 'Sequential' object has no attribute 'history' 

Comment puis-je retourner mon histoire de modèle après la formation de mon modèle avec le code ci-dessus?

MISE À JOUR

La question est que:

Ce qui suit doit d'abord être défini:

from keras.callbacks import History 
history = History() 

L'option callbacks devait être appelé

model.fit(X_train, Y_train, nb_epoch=5, batch_size=16, callbacks=[history]) 

Mais maintenant, si j'imprime

print(history.History) 

retourne

{} 

même si je courais une itération.

+0

Pourriez-vous spécifier si vous exécutez ce code à partir de la console ou exécutez-vous votre script à partir de la ligne de commande (ou IDE)? Avez-vous accès à hist variable après la formation? –

+0

Je m'en sépare Anaconda. J'ai trouvé une solution qui me permet d'accéder à la variable hist. Mais il renvoie toujours un support bouclé vide. – ishido

Répondre

11

Cela a été résolu.

Les pertes ne sauvent que l'histoire au cours des époques. Je faisais des itérations au lieu d'utiliser l'option Keras construite en epochs.

donc au lieu de faire 4 itérations J'ai maintenant

model.fit(......, nb_epoch = 4) 

Maintenant, il retourne la perte pour chaque course de l'époque:

print(hist.history) 
{'loss': [1.4358016599558268, 1.399221191623641, 1.381293383180471, h1.3758836857303727]} 
3

Le dictionnaire contenant les historiques "acc", "loss", etc. est disponible et enregistré dans la variable hist.history.

+0

Si je tape "hist" dans la console, il me donne seulement le code que j'ai exécuté cette session. – ishido

+0

Et pour hist.history? –

+1

Salut Marcin, je l'ai résolu. Le problème était que les pertes n'épargnaient que sur des périodes pendant que j'exécutais des itérations externes. Donc, à chaque itération mon histoire effacée – ishido

3

Juste un exemple a commencé de

history = model.fit(X, Y, validation_split=0.33, nb_epoch=150, batch_size=10, verbose=0) 

Vous peut utiliser

print(history.history.keys()) 

pour répertorier toutes les données de l'historique.

Ensuite, vous pouvez imprimer l'histoire de la perte de validation comme ceci:

print(history.history['val_loss']) 
0

Une autre option est CSVLogger: https://keras.io/callbacks/#csvlogger. Il crée un fichier csv qui ajoute le résultat de chaque époque. Même si vous interrompez l'entraînement, vous voyez comment cela a évolué.