TensorFlow: проверка модели при использовании отслеживаемой тренировки

Я использую API набора данных для импорта данных обучения и проверки. У меня есть TF 1.2. Поэтому я могу использовать только повторный инициализируемый итератор и не могу использовать итератор с возможностью подачи, так как итератор с возможностью подачи доступен только из TF 1.4.

1) Если мы хотим просто обучить сеть, мы можем просто использовать контролируемую тренировку. Но когда мы хотим проверить во время обучения, как мы должны это сделать? Должны ли мы сбросить контролируемую тренировку и использовать сеанс низкого уровня?

train_dataset = tf.contrib.data.TFRecordDataset([FLAGS.data_dir + "train.tfrecords"])
train_dataset = train_dataset.map(_parse_records)
train_dataset.shuffle(buffer_size=1000)
train_dataset = train_dataset.repeat()
train_dataset = train_dataset.batch(FLAGS.batch_size)

validation_dataset = tf.contrib.data.TFRecordDataset([FLAGS.data_dir + "test.tfrecords"])
validation_dataset = test_dataset.map(_parse_records)
validation_dataset = test_dataset.batch(FLAGS.batch_size)

iterator = tf.contrib.data.Iterator.from_structure(train_dataset.output_types, train_dataset.output_shapes)

train_init_op = iterator.make_initializer(train_dataset)
validation_init_op = iterator.make_initializer(validation_dataset)

next_example, next_label = iterator.get_next()
loss = model_function(next_example, next_label)

training_op = tf.train.AdagradOptimizer(...).minimize(loss)

with tf.train.MonitoredTrainingSession(...) as sess:
    sess.run(train_init_op)
    while not sess.should_stop():
        sess.run(training_op)

   # HOW TO VALIDATE?

2) Есть ли способ проверить модель в середине эпохи, используя Reinitializable итератор, поскольку он требует инициализировать итератор с начала набора данных, когда мы переключаемся между итераторами. Это возможно с Reinitializable итератором, или мы должны переключиться на feedable итератор, чтобы сделать это?

Это пример, приведенный в руководстве TF Dataset. Здесь, если в эпоху возможно 100 итераций, можем ли мы проверить модель на итерации 50, используя Reinitializable итератор? (Я думаю, что это возможно с помощью кормящего итератора)

# Run 20 epochs in which the training dataset is traversed, followed by the validation dataset.
for _ in range(20):
# Initialize an iterator over the training dataset.
    sess.run(training_init_op)
    for _ in range(100):
        sess.run(next_element)

# Initialize an iterator over the validation dataset.
sess.run(validation_init_op)
for _ in range(50):
    sess.run(next_element)

3) При использовании Reinitializable итератора, на последней итерации эпохи, что произойдет, если оставшиеся выборки обучающих данных меньше требуемого размера пакета? Используются ли несколько оставшихся образцов с уменьшенным размером партии или они игнорируются?

2 ответа

На ваш вопрос 3, я думаю, TensorFlow ведет себя плохо. Для этой последней партии может быть меньшее количество образцов. Это очень часто (всегда?) Приводит к ошибкам "Несовместимые формы" во время обучения. Пожалуйста, смотрите /questions/44812643/kak-dopolnit-fiksirovannyij-batchsize-v-tfdatadataset/44812662#44812662 чтобы узнать, как решить эту проблему с TensorFlow 1.4.

Пожалуйста, ознакомьтесь с разделом Как переключаться между набором данных обучения и проверки с помощью tf.MonitoredTrainingSession? Я думаю, что вы найдете ответ как 1), так и 2). Вы можете использовать feed_dict, чтобы изменить набор данных для оценки или просто повторно инициализировать его. По ссылке:

...
training_iterator = training_ds.make_initializable_iterator()
validation_iterator = validation_ds.make_initializable_iterator()
...
sess.run(next_element, feed_dict={handle: training_handle})
...
sess.run(next_element, feed_dict={handle: validation_iterator })
Другие вопросы по тегам