2017-10-23 4 views
0

Ich bin in Ordnung, die Einführung v3-Modell auf cifar10 Datensatz. Nach dem Speichern ist die Größe des Modells 175 Mo, vor dem Training sind es etwa 90 Mo, also frage ich mich, warum das fein abgestimmte Modell größer ist? Wenn ich die Anzahl der Parameter der beiden Modelle anschaue, ist es fast gleich.Keras Gewicht eines Modells größer als erwartet

Original-Modell: Gesamt params: 23851784 Trainierbare params: 23817352 Nicht trainierbar params: 34.432

Fein abgestimmte Modell: Gesamt params: 21823274 Trainierbare params: 21788842 Nicht trainierbar params: 34.432

Hat jemand eine Idee dazu? Um das Modell zu speichern, verwende ich die Funktion ModelCheckpoint in einem Callback innerhalb der Fit-Generator-Funktion.

checkpoints = ModelCheckpoint(output+'-{epoch:02d}.hdf5', verbose=1, save_best_only=False, period=checkpoint) 
callbacks_list = [callback_tensorboard, checkpoints] 

# train 
model.fit_generator(train_generator, 
     steps_per_epoch=step_train, 
     epochs=epochs, 
     verbose=1, 
     validation_data=test_generator, 
     validation_steps=step_test, 
     callbacks=callbacks_list) 

Antwort

1

standardmäßig ModelCheckpoint speichert alles über ein Modell, einschließlich der folgenden:

  • Modell Architektur
  • Gewichte
  • Trainings Konfiguration wie Optimierer und Verlustfunktion
  • Der Zustand des Optimierers , sodass Sie das Training direkt von einem Checkpoint aus fortsetzen können.

Wenn Sie einen Optimierer, den Zustand hält, wie ADAM oder RMSProp, wo ein gleitender Mittelwert für jeden Parameter gehalten, dann ist dieser Optimierer Zustand wird auch in die HDF5-Datei gespeichert, die endgültige Dateigröße um einen Faktor zu erhöhen definiert vom Optimierer.

Eine einfache Lösung besteht darin, entweder model.save_weights manuell zu verwenden, um nur die Gewichtungen zu speichern, oder den save_weights_only-Parameter in Ihrer Instanz ModelCheckpoint auf True zu setzen.

+0

Mit den Worten: "Der Zustand des Optimierers, damit Sie das Training direkt von einem Kontrollpunkt aus fortsetzen können" Meinen Sie den exponentiell gewichteten gleitenden Durchschnitt in einer Mitte der Epoche zu speichern? Ich meine, ich verstehe nicht, warum ich das Modell während des Trainings retten soll, wenn wir es vor dem Start des Zuges einmal speichern können. Wenn ich das Training wieder aufnehmen möchte, muss ich einfach wieder mit den Gewichten der letzten abgeschlossenen Epoche beginnen. Also die save_weights_only ist meiner Meinung nach nicht sinnvoll? Es sollte immer wahr sein, ich kann wirklich keinen Fall finden, wo ich das Modell während des Trainings speichern möchte? –

+0

@StavBodik Es ist nicht in der Mitte einer Epoche, es ist normalerweise am Ende von einem. Wenn Sie nicht mit gespeicherten gleitenden Durchschnitten beginnen, kann das Training instabil sein oder divergieren. –

+0

Aber die Gewichte werden trotzdem gespeichert, das ist eines der wichtigsten Features dieses Checkpoints, warum sollte ich das Modell auch während des Trainings speichern? Modell per definitionem ist etwas Konstantes, das sich während des Zuges nicht ändert. –

Verwandte Themen