wake-up-neo.com

Wie schalte ich Dropout zum Testen in Tensorflow aus?

Ich bin für Tensorflow und ML im Allgemeinen ziemlich neu, daher entschuldige ich mich hiermit für eine (wahrscheinlich) triviale Frage.

Ich verwende die Dropout-Technik, um die Lernraten meines Netzwerks zu verbessern, und es scheint gut zu funktionieren. Dann möchte ich das Netzwerk auf einige Daten testen, um zu sehen, ob es so funktioniert:

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

Offensichtlich liefert es jedes Mal unterschiedliche Ergebnisse, da der Ausfall noch vorhanden ist. Eine Lösung, die ich mir vorstellen kann, besteht darin, zwei separate Modelle zu erstellen - eines für eine Schulung und eines für eine spätere tatsächliche Nutzung des Netzwerks. Eine solche Lösung erscheint mir jedoch unpraktisch.

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

26
G. Mesch

Der einfachste Weg ist, das keep_prob Parameter mit einem placeholder_with_default :

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

auf diese Weise können Sie beim Trainieren den Parameter wie folgt einstellen:

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

und wenn Sie auswerten, wird der Standardwert 1.0 verwendet.

51
nessuno

du solltest das keep_prob in tensorflow dropout layer, das ist die wahrscheinlichkeit, das gewicht zu halten, ich denke sie setzen diese variable mit werten zwischen 0,5 und 0,8. Beim Testen des Netzwerks müssen Sie einfach keep_prob 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 ändern Sie die Werte in der Sitzung:

_ = 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
9
robbisg

Mit dem neuen tf.estimator API geben Sie eine Modellfunktion an, die verschiedene Modelle zurückgibt, je nachdem, ob Sie trainieren oder testen, und dennoch die Wiederverwendung Ihres Modellcodes ermöglicht. In Ihrer Modellfunktion würden Sie etwas Ähnliches tun wie:

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 Argument mode wird automatisch übergeben, je nachdem, ob Sie estimator.train(...) oder estimator.predict(...) aufrufen.

8
Jarno

wenn Sie Estimator API nicht verwenden möchten, können Sie das Dropout folgendermaßen 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)

Sie versorgen die Sitzung also mit {'tf_is_training': False}, Wenn Sie eine Auswertung durchführen, anstatt die Abbrecherquote zu ändern.

3
cinqS

Bei der Aktualisierung von Tensorflow sollte die Klasse tf.layer.dropout anstelle von tf.nn.dropout verwendet werden.

Dies unterstützt einen is_training-Parameter. Wenn Sie dies verwenden, können Ihre Modelle keep_prob einmal definieren und verlassen sich nicht auf Ihr feed_dict, um die externen Parameter zu verwalten. Dies ermöglicht einen besser überarbeiteten Code.

Weitere Informationen: https://www.tensorflow.org/api_docs/python/tf/layers/dropout

1
David Bernat

Wenn Sie testen, sollen Sie die Ausgabe der Ebene nicht mit 1/drop_prob multiplizieren? In diesem Fall müssten Sie einen zusätzlichen Multiplikationsschritt in die Testphase einfügen.

0
Epsilon1024