2017-09-05 3 views
2

Ich verwende ein Keras Sequential-Modell, bei dem die Eingaben und Beschriftungen für jeden Lauf identisch sind. Keras verwendet ein Tensorflow-Backend.Kann ich Keras Training deterministisch durchführen?

Ich habe die Ebenenaktivierungen auf "Nullen" gesetzt und Batch-Shuffling während des Trainings deaktiviert.

model = Sequential() 
model.add(Dense(128, 
       activation='relu', 
       kernel_initializer='zeros', 
       bias_initializer='zeros')) 
... 

model.compile(optimizer='rmsprop', loss='binary_crossentropy') 

model.fit(x_train, y_train, 
      batch_size = 128, verbose = 1, epochs = 200, 
      validation_data=(x_validation, y_validation), 
      shuffle=False) 

ich auch Numpy des random() Methode Impfen habe versucht:

np.random.seed(7) # fix random seed for reproducibility 

Mit der oben an Ort und Stelle erhalte ich immer noch unterschiedliche Genauigkeit und Verlustwerte nach dem Training.

Fehle ich etwas oder gibt es keine Möglichkeit, die Unterschiede zwischen den Trainings vollständig zu beseitigen?

+1

[Vielleicht relevant ] (https://github.com/fchollet/keras/issues/2280) – sascha

+0

Danke - yep, das ist ein bekanntes/offenes Problem. – RobertJoseph

Antwort

1

Da dies ein real issue zu sein scheint, wie vorher kommentiert, vielleicht könnten Sie gehen für Ihre Gewichte manuell zu initialisieren (anstatt Vertrauen auf den Parameter ‚Nullen‘ in der Schicht Konstruktor übergeben):

#where you see layers[0], it's possible that the correct layer is layers[1] - I can't test at this moment. 

weights = model.layers[0].get_weights() 
ws = np.zeros(weights[0].shape) 
bs = np.zeros(weights[1].shape) 
model.layers[0].set_weights([ws,bs]) 
+1

Die Idee ist genau diese Parameter zu vermeiden. In numpy wir vertrauen, aber vertrauen wir Keras Initialisierer, die dieses Problem in der Verbindung betrachten? –

Verwandte Themen