TensorFlow: как изменить keep_prob для Dropout без использования feed_dict
Я построил модель TensorFlow, которая работает с пакетами обучения и тестирования, предоставляемыми входными очередями. Таким образом, я не предоставляю данные для обучения в явном виде, используя стандартный feed_dict. Тем не менее, мне нужно реализовать dropout, который требует заполнителя keep_prob, чтобы отключить dropout во время тестирования.
Я не могу найти, как решить это без отдельной модели. Есть какие-нибудь предложения?
Спасибо
2 ответа
Мой вопрос устарел, я сделал его слишком сложным.
При вызове sess.run() все еще можно передавать значения местозаполнителям через feed_dict, даже если есть входная очередь, предоставляющая обучающие примеры напрямую.
Допустим, ваш тензор layer1 определяется следующим образом:
layer1 = tf.nn.relu(tf.matmul(w,x)+b)
чтобы применить отсев, вы просто делаете
dropout_layer1 = tf.nn.dropout(layer1, keep_prob)
где твой keep_prob
где-то определено, и я обычно управляю им с помощью FLAGS, но вы можете использовать обычное объявление внутри программы. Тогда вы можете использовать dropout_layer1
как нормальный тензор. Здесь у вас есть тривиальный пример использования:
import tensorflow as tf
import numpy as np
tf.reset_default_graph()
keep_prob = 0.5
a = tf.get_variable('a', initializer=np.random.normal())
b = tf.get_variable('b', initializer=np.random.normal())
x=[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.]
y=list(map(lambda i: i+np.random.normal(0, 0.1), x))
f=tf.multiply(x,a)+b
f_dropout = tf.nn.dropout(f,keep_prob)
loss = tf.reduce_sum(tf.pow(f_dropout-y, 2))
train = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
sess = tf.Session() #
init = tf.global_variables_initializer()
sess.run(init)
for i in range(1000):
_, l, slope, intercept = sess.run([train, loss, a, b])
print(list(map(lambda i: i*slope+intercept, x)))
print('a: %.2f' %slope)
print('b: %.2f' %intercept)
Это плохой пример с точки зрения регрессии, но он показывает, как запрограммировать отсев и легко выводит, что делает отсев. Я надеюсь, вам понравится:)