python - train - ¿Cómo desactivar la deserción para probar en Tensorflow?
tensorflow tutorial pdf (4)
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(...)
.
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 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.
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.
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