9

Ich bin ziemlich neu Tensorflow und ML im Allgemeinen, so entschuldige ich mich hiermit für eine (wahrscheinlich) triviale Frage.Wie wird das Dropout für Tests in Tensorflow deaktiviert?

Ich benutze die Dropout-Technik, um die Lernraten meines Netzwerks zu verbessern, und es scheint gut zu funktionieren. Dann würde Ich mag das Netzwerk auf einige Daten zu testen, um zu sehen, ob es funktioniert wie folgt:

def Ask(self, image): 
     return self.session.run(self.model, feed_dict = {self.inputPh: image}) 

Offensichtlich ergibt es unterschiedliche Ergebnisse jedes Mal, als der Ausfall noch vorhanden ist. Eine Lösung, die ich mir vorstellen kann, ist, zwei getrennte Modelle zu erstellen - eines für ein Training und das andere für eine tatsächliche spätere Nutzung des Netzwerks. Eine solche Lösung erscheint mir jedoch unpraktisch.

Was ist der übliche Ansatz zur Lösung dieses Problems?

Antwort

23

Der einfachste Weg ist Um den Parameter keep_prob mit einem placeholder_with_default:

prob = tf.placeholder_with_default(1.0, shape=()) 
layer = tf.nn.dropout(layer, prob) 
zu ändern

auf diese Weise, wenn Sie trainieren Sie den Parameter wie folgt einstellen:

sess.run(train_step, feed_dict={prob: 0.5}) 

und wenn Sie den Standardwert von 1,0 zu bewerten verwendet.

6

sollten Sie die keep_prob in Tensorflow Dropout-Schicht, das ist die Wahrscheinlichkeit, das Gewicht zu halten, ich denke, Sie setzen diese Variable mit Werten zwischen 0,5 und 0,8. Wenn das Netzwerk zu testen, müssen Sie einfach keep_prob füttern mit 1.

Sie sollten so etwas definieren:

keep_prob = tf.placeholder(tf.float32, name='keep_prob') 
drop = tf.contrib.rnn.DropoutWrapper(layer1, output_keep_prob=keep_prob) 

dann die Werte in der Sitzung ändern:

_ = sess.run(cost, feed_dict={'input':training_set, 'output':training_labels, 'keep_prob':0.8}) # During training 
_ = sess.run(cost, feed_dict={'input':testing_set, 'output':testing_labels, 'keep_prob':1.}) # During testing 
4

Mit der neuen tf.estimator API geben Sie eine Modellfunktion an, die verschiedene Modelle zurückgibt, je nachdem, ob Sie trainieren oder testen, aber dennoch Ihren Modellcode wiederverwenden können. In Ihrem Modell Funktion würden Sie etwas ähnliches tun:

def model_fn(features, labels, mode): 

    training = (mode == tf.estimator.ModeKeys.TRAIN) 
    ... 
    t = tf.layers.dropout(t, rate=0.25, training=training, name='dropout_1') 
    ... 

Das mode Argument übergeben wird automatisch je nachdem, ob Sie estimator.train(...) oder estimator.predict(...) nennen.

0

wenn Sie nicht Estimator API verwenden wollen, können Sie die Dropout auf diese Weise erstellen:

tf_is_traing_pl = tf.placeholder_with_default(True, shape=()) 
tf_drop_out = tf.layers.dropout(last_output, rate=0.8, training=tf.is_training_pl) 

Also, Sie die Sitzung mit {'tf_is_training': False} füttern, wenn Auswertung zu tun, anstatt die Dropout-Rate zu ändern.

Verwandte Themen