Как отключить отсева для тестирования в 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? В этом случае вам придется добавить дополнительный этап умножения на этапе тестирования.