Caricamento di un modello Keras addestrato e continua la formazione

| | |

Mi chiedevo se fosse possibile salvare un modello Keras parzialmente addestrato e continuare l'addestramento dopo aver caricato nuovamente il modello.

Il motivo è che in futuro avrò più dati di addestramento e Non voglio riqualificare di nuovo l'intero modello.

Le funzioni che sto utilizzando sono:

#Partly train model model.fit(first_training, first_classes, batch_size= 32, nb_epoch=20) #Salva modello con training parziale model.save("partly_trained.h5") #Carica modello con training parziale da keras.models import load_model model = load_model("partly_trained.h5") #Continua training model.fit(second_training , second_classes, batch_size=32, nb_epoch=20) 

Modifica 1: aggiunto esempio completamente funzionante

Con il primo dataset dopo 10 epoche la perdita dell'ultima epoca sarà 0,0748 e l'accuratezza 0,9863.

Dopo aver salvato, eliminato e ricaricato il modello, la perdita e l'accuratezza del modello addestrato sul secondo dataset saranno 0,1711 e 0,9504 Rif rispettivamente.

È causato dai nuovi dati di addestramento o da un modello completamente riqualificato?

""" Modello di: http://machinelearningmastery.com/ """ # carica (scaricato se necessario) il set di dati MNIST import numpy da keras.datasets import mnist da keras.models import Sequential da keras.layers import Dense da keras.utils import np_utils da 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", optimizationr="adam", metrics=["accuracy"]) restituisce il modello if __name__ == "__main__": # carica i dati (X_train, y_train), ( X_test, y_test) = mnist.load_data() # appiattisce 28*28 immagini in un vettore 784 per ogni immagine 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") # normalizza gli input da 0-255 a 0-1 X_train = X_train / 255 X_test = X_test / 255 # una codifica a caldo emette 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) # Valutazione finale dei punteggi del modello = model.evaluate(X_test, y_test, verbose=0) print("Errore di base: %. 2f%%" %. :] 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("Errore di base: %.2f%%" % (100-scores[1]*100)) 

Modifica 2: osservazioni tensorflow.keras

Per tensorflow.keras modificare il parametro nb_epochs in epochs nell'adattamento del modello. Le funzioni di importazione e modello base sono:

import numpy da tensorflow.keras.datasets import mnist da tensorflow.keras.models import Sequential da tensorflow.keras.layers import Dense da tensorflow.keras.utils import to_categorical da tensorflow.keras.models import load_model numpy.random.seed(7) def baseline_model(): model = Sequential() model.add(Dense(num_pixels, input_dim=num_pixels, activation="relu")) model.add( Dense(num_classes, activation="softmax")) model.compile(loss="categorical_crossentropy", optimizationr="adam", metrics=["accuracy"]) modello di ritorno