Cómo devolver el historial de pérdida de validación en Keras


Usando Anaconda Python 2.7 Windows 10.

Estoy entrenando un modelo de lenguaje usando el exmaple 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()

De acuerdo con la documentación de Keras, el método model.fit devuelve una devolución de llamada de Historial, que tiene un atributo de historial que contiene las listas de pérdidas sucesivas y otras métricas.

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

Después de entrenar mi modelo, si corro print(model.history) obtengo el error:

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

¿Cómo devuelvo mi historial de modelos después de entrenar a mi modelo con lo anterior código?

UPDATE

La cuestión era que:

Primero hubo que definir lo siguiente:

from keras.callbacks import History 
history = History()

La opción callbacks tenía que ser llamada

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

Pero ahora si imprimo

print(history.History)

Devuelve

{}

Aunque corrí una iteración.

Author: Marcin Możejko, 2016-04-30

7 answers

Se ha resuelto.

Las pérdidas solo se guardan en la Historia sobre las épocas. Estaba ejecutando iteraciones en lugar de usar la opción Keras built in epochs.

Así que en lugar de hacer 4 iteraciones ahora tengo

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

Ahora devuelve la pérdida para cada corrida de época:

print(hist.history)
{'loss': [1.4358016599558268, 1.399221191623641, 1.381293383180471, h1.3758836857303727]}
 15
Author: ishido,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-01 07:58:39

Solo un ejemplo comenzó desde

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

Puede usar

print(history.history.keys())

Para enumerar todos los datos en la historia.

Luego, puede imprimir el historial de pérdida de validación de esta manera:

print(history.history['val_loss'])
 6
Author: Jeremy Anifacc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-26 09:19:02

El diccionario con historias de "acc"," pérdida", etc. está disponible y guardado en la variable hist.history.

 4
Author: Marcin Możejko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-30 18:30:17

Otra opción es CSVLogger: https://keras.io/callbacks/#csvlogger. Crea un archivo csv anexando el resultado de cada época. Incluso si interrumpes el entrenamiento, puedes ver cómo evolucionó.

 2
Author: Jimmy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-25 04:32:14

El siguiente código simple funciona muy bien para mí:

    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

Asegúrese de asignar la función fit a una variable de salida. Entonces puede acceder a esa variable muy fácilmente

# 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)

Espero que esto ayude. fuente: https://keras.io/getting-started/faq/#how-can-i-record-the-training-validation-loss-accuracy-at-each-epoch

 2
Author: Rami Alloush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-02 18:01:20

También he encontrado que puedes usar verbose=2 para hacer que keras imprima las Pérdidas:

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

Y eso imprimiría lineas bonitas como esta:

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

Según su documentación :

verbose: 0, 1, or 2. Verbosity mode. 0 = silent, 1 = progress bar, 2 = one line per epoch.
 1
Author: Roozbeh Zabihollahi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-17 07:18:07

En realidad, también puedes hacerlo con el método de iteración. Porque a veces es posible que necesitemos usar el método de iteración en lugar del método de épocas incorporado para visualizar los resultados del entrenamiento después de cada iteración.

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)

De esta manera le permite obtener la pérdida que desea mientras mantiene su método de iteración.

 0
Author: Raven Cheuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-17 05:03:43