web-dev-qa-db-fra.com

Comment retourner l'historique de perte de validation dans Keras

Utilisation de Anaconda Python 2.7 Windows 10.

Je suis en train de former un modèle de langage en utilisant l'exemple de 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 de Keras, la méthode model.fit Renvoie un rappel de l'historique, qui possède un attribut d'historique contenant les listes de pertes successives et d'autres métriques.

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

Après avoir entraîné mon modèle, si je lance print(model.history), le message d'erreur suivant s'affiche:

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

Comment puis-je retourner l'historique de mon modèle après avoir formé mon modèle avec le code ci-dessus?

MISE À JOUR

Le problème était que:

Les éléments suivants devaient d'abord être définis:

from keras.callbacks import History 
history = History()

L'option callbacks devait être appelée

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

Mais maintenant si j'imprime

print(history.History)

il revient

{}

même si j'ai couru une itération.

37
ishido

C'est résolu.

Les pertes ne sauvent que l'histoire au fil des époques. J'exécutais des itérations au lieu d'utiliser l'option construite par Keras à l'époque.

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

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

Maintenant, il retourne la perte pour chaque époque:

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

Juste un exemple a commencé à partir de

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

Vous pouvez utiliser

print(history.history.keys())

pour lister toutes les données de l'historique.

Ensuite, vous pouvez imprimer l’historique de la perte de validation comme ceci:

print(history.history['val_loss'])
22
Jeremy Anifacc

Le code simple suivant fonctionne très bien pour moi:

    seqModel =model.fit(x_train, y_train,
          batch_size      = batch_size,
          epochs          = num_epochs,
          validation_data = (x_test, y_test),
          shuffle         = True,
          verbose=0, callbacks=[TQDMNotebookCallback()]) #for visualization

Assurez-vous d’affecter la fonction d’ajustement à une variable de sortie. Ensuite, vous pouvez accéder à cette variable très facilement

# visualizing losses and accuracy
train_loss = seqModel.history['loss']
val_loss   = seqModel.history['val_loss']
train_acc  = seqModel.history['acc']
val_acc    = seqModel.history['val_acc']
xc         = range(num_epochs)

plt.figure()
plt.plot(xc, train_loss)
plt.plot(xc, val_loss)

J'espère que cela t'aides. source: https://keras.io/getting-started/faq/#how-can-i-record-the-training-validation-loss-accuracy-at-each-Epoch

6
Rami Alloush

Le dictionnaire avec des historiques de "acc", "perte", etc. est disponible et sauvegardé dans hist.history variable.

5
Marcin Możejko

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

2
Jimmy

J'ai également constaté que vous pouvez utiliser verbose=2 pour que les keras impriment les pertes:

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

Et cela afficherait de jolies lignes comme ceci:

Epoch 1/1
 - 5s - loss: 0.6046 - acc: 0.9999 - val_loss: 0.4403 - val_acc: 0.9999

Selon leur documentation :

verbose: 0, 1, or 2. Verbosity mode. 0 = silent, 1 = progress bar, 2 = one line per Epoch.
2

En fait, vous pouvez également le faire avec la méthode d'itération. Parce que nous avons parfois besoin d’utiliser la méthode des itérations au lieu de la méthode des époques intégrée pour visualiser les résultats de l’entraînement après chaque itération.

history = [] #Creating a empty list for holding the loss later
for iteration in range(1, 3):
    print()
    print('-' * 50)
    print('Iteration', iteration)
    result = model.fit(X, y, batch_size=128, nb_Epoch=1) #Obtaining the loss after each training
    history.append(result.history['loss']) #Now append the loss after the training to the list.
    start_index = random.randint(0, len(text) - maxlen - 1)
print(history)

Cela vous permet d’obtenir la perte que vous souhaitez tout en maintenant votre méthode d’itération.

0
Raven Cheuk

Pour tracer la perte directement les travaux suivants:

model.fit(X, Y, epochs= ... )
plt.plot(list(model.history.history.values())[0],'k-o')
0
horseshoe