Erstellen keras Rückruf speichern von modellvorhersagen und Ziele für jede charge während der Ausbildung
Ich bin eine einfache Sequentielle Modell in Keras (tensorflow backend). Während der Ausbildung möchte ich untersuchen Sie die individuellen Trainings-Chargen und modellvorhersagen. Also, ich bin versuchen, um eine benutzerdefinierte Callback
das spart die modellvorhersagen und die Ziele für die einzelnen batch-training. Aber das Modell ist nicht mit der aktuellen charge, die für die Vorhersage, sondern die gesamten Trainingsdaten.
Wie kann ich die hand nur über das aktuelle Trainings-batch-der Callback
?
Und wie kann ich den Zugriff auf die Chargen und die Ziele, die Callback
speichert in sich selbst.predhis und selbst.Ziele?
Meine aktuelle version sieht wie folgt aus:
callback_list = [prediction_history((self.x_train, self.y_train))]
self.model.fit(self.x_train, self.y_train, batch_size=self.batch_size, epochs=self.n_epochs, validation_data=(self.x_val, self.y_val), callbacks=callback_list)
class prediction_history(keras.callbacks.Callback):
def __init__(self, train_data):
self.train_data = train_data
self.predhis = []
self.targets = []
def on_batch_end(self, epoch, logs={}):
x_train, y_train = self.train_data
self.targets.append(y_train)
prediction = self.model.predict(x_train)
self.predhis.append(prediction)
tf.logging.info("Prediction shape: {}".format(prediction.shape))
tf.logging.info("Targets shape: {}".format(y_train.shape))
Du musst angemeldet sein, um einen Kommentar abzugeben.
HINWEIS: die ursprüngliche akzeptierte Antwort war falsch, wie darauf hingewiesen wird in dem Kommentar. Da es akzeptiert und nicht gelöscht werden kann, habe ich umgeschrieben es eine gute Antwort.
Nach der Modell-Zusammenstellung, die den Platzhalter tensor für
y_true
ist inmodel.targets
undy_pred
ist inmodel.outputs
.Speichern die Werte dieser Platzhalter bei jeder charge können Sie:
on_batch_end
, und speichern des resultierenden arrays.Nun Schritt 1 ist ein bisschen betroffen, denn Sie müssen zum hinzufügen einer
tf.assign
op, um die Trainings-Funktionmodel.train_function
. Mit aktuellen Keras API, diese kann getan werden, indem einefetches
argumentK.function()
wenn die Trainings-Funktion aufgebaut ist.In
model._make_train_function()
gibt es eine Zeile:Den
fetches
argument mit dentf.assign
ops kann durchmodel._function_kwargs
(funktioniert nur nach Keras 2.1.0).Als Beispiel:
Sofern die Anzahl der samples dividiert durch die Losgröße, die Letzte charge wird eine andere Größe als die anderen Chargen. So
K.variable()
undK.update()
können nicht verwendet werden, in diesem Fall. Du wirsttf.Variable(..., validate_shape=False)
undtf.assign(..., validate_shape=False)
statt.Überprüfen Sie die Richtigkeit der gespeicherten arrays, können Sie fügen Sie eine Zeile in
training.py
drucken aus dem gemischten index array:Dem gemischten index-array ausgedruckt werden soll, während der Montage:
Und Sie können überprüfen, ob
cbk.targets
ist das gleiche wieY[index_array]
:Wie Sie sehen können, gibt es zwei Chargen in
cbk.targets
(ein "full charge" Größe 8 und die Letzte charge von Größe 2), und die Reihenfolge ist die gleiche wieY[index_array]
.y_train
charge hat die Form(20,)
. Allerdings, wenn Sie diemodel.fit()
Funktion von Keras und suchen im inneren einige Metrik wie Genauigkeit,y_true
Form(TensorShape([Dimension(None), Dimension(None)])
y_train
ist ein numpy-array, abery_true
ist ein TF-Platzhalter. Der Wert der numpy-array zugeführt wirdy_true
während passende Modell.y_train
eingespeist wird in die Platzhalter, deren Maße sollten Stimmenself.validation_data
im Rückrufe.inputs
undoutputs
zimmerreserviereung, ohne das Sie angeben, z.B.outputs[0]
. So etwas wietf.assign(cbk.outputs, model.outputs, validate_shape=False)
?fetches
Liste und dietf.Variable
s zu reduzieren doppelten code?K.eval(self.var_y_pred)
undK.eval(self.var_y_true)
bewertet von 0.0. Irgendwelche Ideen?model.train_function = None
nach dem laden des Modells, und nach der Einstellungmodel._function_kwargs = {'fetches': fetches}
, aber vormodel.fit()
, weilmodel._function_kwargs
Werte werden nicht gespeichert, in den checkpoint.model.fit()
"lädt" diese, wennmodel.train_function = None
. Für mehr details, schauen Sie sich die_make_train_function
Funktion intraining.py
model.train_function = None
imcompile
Methode derclass Model
im training.py untenhandle_metrics
imkeras/keras/engine/training.py
. Also, Einstellung-Methodemodel.train_function=None
, nach dem kompilieren, ändert sich nichts.