it-swarm.com.de

Laden Sie ein trainiertes Keras-Modell und setzen Sie das Training fort

Ich fragte mich, ob es möglich war, ein teilweise trainiertes Keras-Modell zu speichern und das Training nach dem erneuten Laden des Modells fortzusetzen.

Der Grund dafür ist, dass ich zukünftig mehr Trainingsdaten haben werde und das gesamte Modell nicht noch einmal trainieren möchte.

Die Funktionen, die ich verwende, sind:

#Partly train model
model.fit(first_training, first_classes, batch_size=32, nb_Epoch=20)

#Save partly trained model
model.save('partly_trained.h5')

#Load partly trained model
from keras.models import load_model
model = load_model('partly_trained.h5')

#Continue training
model.fit(second_training, second_classes, batch_size=32, nb_Epoch=20)

Edit 1: voll funktionsfähiges Beispiel hinzugefügt

Beim ersten Datensatz nach 10 Epochen wird der Verlust der letzten Epoche 0,0748 und die Genauigkeit 0,9863 sein.

Nach Speichern, Löschen und erneutem Laden des Modells werden Verlust und Genauigkeit des im zweiten Datensatz trainierten Modells 0,1711 bzw. 0,9504 betragen.

Wird dies durch die neuen Trainingsdaten oder durch ein vollständig neu trainiertes Modell verursacht?

"""
Model by: http://machinelearningmastery.com/
"""
# load (downloaded if needed) the MNIST dataset
import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from keras.models import load_model
numpy.random.seed(7)

def baseline_model():
    model = Sequential()
    model.add(Dense(num_pixels, input_dim=num_pixels, init='normal', activation='relu'))
    model.add(Dense(num_classes, init='normal', activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

if __== '__main__':
    # load data
    (X_train, y_train), (X_test, y_test) = mnist.load_data()

    # flatten 28*28 images to a 784 vector for each image
    num_pixels = X_train.shape[1] * X_train.shape[2]
    X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
    X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
    # normalize inputs from 0-255 to 0-1
    X_train = X_train / 255
    X_test = X_test / 255
    # one hot encode outputs
    y_train = np_utils.to_categorical(y_train)
    y_test = np_utils.to_categorical(y_test)
    num_classes = y_test.shape[1]

    # build the model
    model = baseline_model()

    #Partly train model
    dataset1_x = X_train[:3000]
    dataset1_y = y_train[:3000]
    model.fit(dataset1_x, dataset1_y, nb_Epoch=10, batch_size=200, verbose=2)

    # Final evaluation of the model
    scores = model.evaluate(X_test, y_test, verbose=0)
    print("Baseline Error: %.2f%%" % (100-scores[1]*100))

    #Save partly trained model
    model.save('partly_trained.h5')
    del model

    #Reload model
    model = load_model('partly_trained.h5')

    #Continue training
    dataset2_x = X_train[3000:]
    dataset2_y = y_train[3000:]
    model.fit(dataset2_x, dataset2_y, nb_Epoch=10, batch_size=200, verbose=2)
    scores = model.evaluate(X_test, y_test, verbose=0)
    print("Baseline Error: %.2f%%" % (100-scores[1]*100))
50

Tatsächlich speichert model.save alle Informationen, die Sie für den Neustart des Trainings in Ihrem Fall benötigen. Das einzige, was durch das Neuladen des Modells beschädigt werden könnte, ist der Status Ihres Optimierers. Um dies zu überprüfen, versuchen Sie, save zu laden, das Modell erneut zu laden und die Trainingsdaten zu trainieren.

13
Marcin Możejko

Beachten Sie, dass Keras manchmal Probleme mit geladenen Modellen hat, wie in hier . Dies kann Fälle erklären, in denen Sie nicht mit derselben trainierten Genauigkeit beginnen.

2
shahar_m

Das Problem kann sein, dass Sie ein anderes Optimierungsprogramm verwenden oder andere Argumente als Ihr Optimierungsprogramm. Ich hatte gerade das gleiche Problem mit einem benutzerdefinierten Vorab-Modell 

reduce_lr = ReduceLROnPlateau(monitor='loss', factor=lr_reduction_factor,
                              patience=patience, min_lr=min_lr, verbose=1)

für das vorbereitete Modell, bei dem die ursprüngliche Lernrate bei 0,0003 beginnt und während des vorbereitenden Trainings auf die min_learning-Rate reduziert wird, die 0,000003 beträgt

Ich habe diese Zeile gerade in das Skript kopiert, das das vorab trainierte Modell verwendet, und dabei sehr schlechte Genauigkeiten erhalten. Bis ich bemerkte, dass die letzte Lernrate des vorbereiteten Modells die minimale Lernrate war, d. H. 0,000003. Und wenn ich mit dieser Lernrate beginne, bekomme ich genau die gleichen Genauigkeiten wie die Ausgabe des vortrainierten Modells - was sinnvoll ist, wenn man von einer Lernrate ausgeht, die 100-mal höher ist als die zuletzt im Vortraining verwendete Lernrate Das Modell führt zu einer erheblichen Überschreitung von Gd und damit zu stark verringerten Genauigkeiten. 

2
Wolfgang

Sie könnten auch auf Concept Drift stoßen, siehe Sollten Sie ein Modell neu trainieren, wenn neue Beobachtungen verfügbar sind . Es gibt auch das Konzept des katastrophalen Vergessens, das in einer Reihe von wissenschaftlichen Arbeiten diskutiert wird. Hier ist eine mit MNIST Empirische Untersuchung des katastrophalen Vergessens

0
Gustavo

Alles oben genannte hilft, muss mit derselben Lernrate () wie der LR fortfahren, wenn das Modell und die Gewichte gespeichert wurden. Setzen Sie es direkt am Optimierer. 

Beachten Sie, dass eine Verbesserung von dort nicht garantiert werden kann, da das Modell möglicherweise das lokale Minimum erreicht hat, das global sein kann. Es ist nicht sinnvoll, ein Modell wieder aufzunehmen, um nach einem anderen lokalen Minimum zu suchen, es sei denn, Sie beabsichtigen, die Lernrate kontrolliert zu erhöhen und das Modell in ein möglicherweise besseres Minimum zu verschieben, nicht weit entfernt.

0
flowgrad