Как отключить отсева для тестирования в Tensorflow?

Я новичок в Tensorflow и ML вообще, поэтому я извиняюсь за (вероятный) тривиальный вопрос.

Я использую метод отсева, чтобы улучшить скорость обучения в моей сети, и, похоже, он работает нормально. Затем я хотел бы проверить сеть на некоторых данных, чтобы увидеть, работает ли она так:

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

Очевидно, что он дает разные результаты каждый раз, когда выпадение все еще на месте. Одно из решений, о котором я могу думать, - создать две отдельные модели - одну для обучения, а другую для фактического последующего использования сети, однако такое решение кажется мне непрактичным.

Какой общий подход к решению этой проблемы?

Ответ 1

Самый простой способ - изменить параметр keep_prob с помощью placeholder_with_default:

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

таким образом, когда вы тренируетесь, вы можете установить такой параметр:

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

и при оценке используется значение по умолчанию 1.0.

Ответ 2

вы должны установить keep_prob в слоте droporflow dropflow, то есть вероятность сохранить вес, я думаю, вы установили эту переменную со значениями от 0,5 до 0,8. При тестировании сети вы должны просто подать keep_prob с помощью.

Вы должны определить что-то вроде этого:

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

Затем измените значения в сеансе:

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

Ответ 3

С новым tf.estimator API вы указываете функцию модели, которая возвращает разные модели в зависимости от того, проходите ли вы обучение или тестирование, но все же позволяет вам повторно использовать код модели. В вашей модели функции вы бы сделали что-то похожее на:

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

Аргумент mode автоматически передается в зависимости от того, вызываете ли вы estimator.train(...) или estimator.predict(...).

Ответ 4

если вы не хотите использовать Estimator API, вы можете создать исключение таким образом:

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)

Итак, вы проводите сеанс {'tf_is_training': False} при выполнении оценки вместо изменения скорости отсева.

Ответ 5

С обновлением Tensorflow вместо tf.nn.dropout следует использовать класс tf.layer.dropout.

Это поддерживает параметр is_training. Использование этого позволяет вашим моделям определять keep_prob один раз, и не полагаться на ваш feed_dict для управления внешним параметром. Это позволяет улучшить рефакторинг кода.

Дополнительная информация: https://www.tensorflow.org/api_docs/python/tf/layers/dropout

Ответ 6

Когда вы тестируете, не должны ли вы умножить вывод слоя на 1/drop_prob? В этом случае вам придется добавить дополнительный этап умножения на этапе тестирования.