¿Cómo desactivar la deserción para probar en Tensorflow?

Soy bastante nuevo en Tensorflow y ML en general, por lo que me disculpo por una pregunta (probablemente) trivial.

Utilizo la técnica de abandono para mejorar las tasas de aprendizaje de mi red, y parece que funciona bien. Luego, me gustaría probar la red en algunos datos para ver si funciona así:

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

Obviamente, produce resultados diferentes cada vez que el abandono todavía está en su lugar. Una solución en la que puedo pensar es crear dos modelos separados, uno para un entrenamiento y el otro para un uso real posterior de la red, sin embargo, tal solución me parece poco práctica.

¿Cuál es el enfoque común para resolver este problema?

La forma más fácil es cambiar el parámetro keep_prob usando un placeholder_with_default :

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

De esta manera, cuando entrenas puedes configurar el parámetro de esta manera:

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

y cuando se evalúa se usa el valor por defecto de 1.0.

debe configurar keep_prob en la capa de deserción de tensorflow, es decir, la probabilidad de mantener el peso, creo que establece esa variable con valores entre 0,5 y 0,8. Al probar la red, simplemente debe alimentar keep_prob con 1.

Deberías definir algo así:

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

Luego cambia los valores en la sesión:

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

Con la nueva tf.estimator API usted especifica una función de modelo, que devuelve diferentes modelos, dependiendo de si está entrenando o probando, pero aún le permite reutilizar su código de modelo. En tu función de modelo harías algo similar a:

 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') ... 

El argumento de mode se pasa automáticamente dependiendo de si llama estimator.train(...) o estimator.predict(...) .

Si no desea utilizar la Estimator API , puede crear el abandono de esta manera:

 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) 

Entonces, alimenta la sesión con {'tf_is_training': False} al realizar la evaluación en lugar de cambiar la tasa de abandono.

Con la actualización de Tensorflow, se debe usar la clase tf.layer.dropout en lugar de tf.nn.dropout.

Esto soporta un parámetro is_training. El uso de esto le permite a sus modelos definir keep_prob una vez, y no confiar en su feed_dict para administrar el parámetro externo. Esto permite un mejor código refactorizado.

Más información: https://www.tensorflow.org/api_docs/python/tf/layers/dropout