Tensorflow et ML en général étant relativement nouveau, je m'excuse par conséquent pour une question triviale (probable).
J'utilise la technique de décrochage pour améliorer les taux d'apprentissage de mon réseau, et cela semble bien fonctionner. Ensuite, je voudrais tester le réseau sur certaines données pour voir si cela fonctionne comme ceci:
def Ask(self, image):
return self.session.run(self.model, feed_dict = {self.inputPh: image})
Évidemment, cela donne des résultats différents chaque fois que le décrochage est toujours en place. Une solution à laquelle je peux penser est de créer deux modèles distincts - un pour une formation et l’autre pour une utilisation ultérieure du réseau, mais une telle solution me semble peu pratique.
Quelle est l'approche commune pour résoudre ce problème?
Le moyen le plus simple est de changer le keep_prob
paramètre avec un placeholder_with_default
:
prob = tf.placeholder_with_default(1.0, shape=())
layer = tf.nn.dropout(layer, prob)
de cette façon, lorsque vous vous entraînez, vous pouvez définir le paramètre comme suit:
sess.run(train_step, feed_dict={prob: 0.5})
et lorsque vous évaluez la valeur par défaut de 1.0 est utilisé.
vous devriez régler le keep_prob
dans la couche de décrochage du tensorflow, c'est-à-dire la probabilité de conserver le poids, je pense que vous définissez cette variable avec des valeurs comprises entre 0,5 et 0,8. Lors du test du réseau, vous devez simplement nourrir keep_prob
avec 1.
Vous devriez définir quelque chose comme ça:
keep_prob = tf.placeholder(tf.float32, name='keep_prob')
drop = tf.contrib.rnn.DropoutWrapper(layer1, output_keep_prob=keep_prob)
Puis changez les valeurs dans la session:
_ = 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
Avec le nouveau tf.estimator API
, vous spécifiez une fonction de modèle qui renvoie différents modèles, selon que vous soyez en formation ou en test, mais vous permet néanmoins de réutiliser votre code de modèle. Dans votre fonction de modèle, vous feriez quelque chose de similaire à:
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')
...
L'argument mode
est automatiquement passé selon que vous appelez estimator.train(...)
ou estimator.predict(...)
.
si vous ne voulez pas utiliser Estimator API
, vous pouvez créer le décrochage de cette façon:
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)
Donc, vous alimentez la session avec {'tf_is_training': False}
lors de l’évaluation au lieu de changer le taux d’abandon scolaire.
Avec la mise à jour de Tensorflow, la classe tf.layer.dropout doit être utilisée à la place de tf.nn.dropout.
Ceci supporte un paramètre is_training. L'utilisation de cette option permet à vos modèles de définir keep_prob une seule fois et de ne pas compter sur votre feed_dict pour gérer le paramètre externe. Cela permet un meilleur code refactorisé.
Plus d'infos: https://www.tensorflow.org/api_docs/python/tf/layers/dropout
Lorsque vous testez, n'êtes-vous pas censé multiplier le résultat de la couche par 1/drop_prob? Dans ce cas, vous devrez ajouter une étape de multiplication supplémentaire dans la phase de test.