Как проверить, инициализированы ли данные обучения или тестирования?

Я использую 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 следует оценивать при каждом запуске.

Как это сделать? Я не хочу переопределять график для теста или обучения.

Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
0
0
125
2

Ответы 2

Хорошо, я уже нашел решение:

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)

Вы видите способ подтвердить, что это действительно работает во время выполнения? Идея кажется ясной. Один из основных недостатков, по-видимому, заключается в том, что при таком подходе время выполнения резко увеличивается.

Spenhouet 18.12.2018 15:17

@Spen Кажется, нет обсуждения или примера того, что B будет влиять на время. tf.control_dependencies также имеет множество приложений в официальном коде.

giser_yugang 18.12.2018 15:39

Завтра еще раз проверю. Может я что то не так сделал.

Spenhouet 18.12.2018 18:03

Другие вопросы по теме