Я использую API набора данных TensorFlow с механизмом переключения для переключения между обучением и набором тестов.
dataset_iter = tf.data.Iterator.from_structure(train_dataset.output_types, train_dataset.output_shapes)
features, labels = dataset_iter.get_next()
train_init_op = dataset_iter.make_initializer(train_dataset)
test_init_op = dataset_iter.make_initializer(test_dataset)
features
и labels
используются для построения графика, например:
logits = tf.layers.dense(features, units=dataset.labels.shape[-1])
loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)
Для каждой эпохи тестирования и обучения набор данных переключается путем вызова соответствующего инициализатора (train_init_op
, test_init_op
).
Теперь я хотел бы использовать слой исключения, но я не знаю, как определить, как проверить, инициализирован ли для текущего прогона обучающий или тестовый набор:
is_training = ???
net = tf.layers.dropout(net, rate=0.25, training=is_training)
is_training
должен быть переменной и не должен оцениваться по времени построения графика. If следует оценивать при каждом запуске.
Как это сделать? Я не хочу переопределять график для теста или обучения.
Хорошо, я уже нашел решение:
is_training = tf.Variable(False, dtype=tf.bool)
train_init_op = tf.group(dataset_iter.make_initializer(train_dataset), tf.assign(is_training, True))
test_init_op = tf.group(dataset_iter.make_initializer(test_dataset), tf.assign(is_training, False))
Я добавил дополнительную переменную, которая отслеживает состояние (обучение / тестирование). Эта переменная также вызывается, когда вызывается инициализатор и устанавливает правильное значение.
Я надеялся, что есть встроенная / готовая к использованию версия этого.
Если кто-то знает одно из таких решений, пожалуйста, дайте дополнительный ответ.
Может, стоит попробовать tf.control_dependencies
:
with tf.control_dependencies([train_init_op]):
net = tf.layers.dropout(net, rate=0.25, training=True)
@Spen Кажется, нет обсуждения или примера того, что B будет влиять на время. tf.control_dependencies
также имеет множество приложений в официальном коде.
Завтра еще раз проверю. Может я что то не так сделал.
Вы видите способ подтвердить, что это действительно работает во время выполнения? Идея кажется ясной. Один из основных недостатков, по-видимому, заключается в том, что при таком подходе время выполнения резко увеличивается.