Оценщик Tensorflow - высокие оценочные значения данных обучения

Я использую Tensorflow 1.10 со специальным оценщиком. Чтобы протестировать мой цикл обучения / оценки, я просто каждый раз загружаю в сеть одно и то же изображение / метку, поэтому я ожидал, что сеть быстро сойдется, что и происходит.

Я также использую то же изображение для оценки, но получаю гораздо большую потерю, чем при тренировке. После тренировки 2000 шагов потеря составляет:

ИНФОРМАЦИЯ: тензорный поток: потеря для последнего шага: 0,01181452

но оценивается как:

Потеря оценки на этапе 2000: 0,41252694

Мне это кажется неправильным. Похоже на ту же проблему, что и в this поток. Есть ли что-то особенное, что нужно учитывать при использовании evaluate метода Estimator?


Еще немного о моем коде:

Я определил свою модель (FeatureNet) как здесь как наследование tf.keras.Model методами init и call.

Мой model_fn выглядит так:

def model_fn(features, labels, mode):

    resize_shape = (180, 320)
    num_dimensions = 16

    model = featurenet.FeatureNet(resize_shape, num_dimensions=num_dimensions)

    training = (mode == tf.estimator.ModeKeys.TRAIN)
    seg_pred = model(features, training)

    predictions = {
       # Generate predictions (for PREDICT mode)
       "seg_pred": seg_pred
    }
    if mode == tf.estimator.ModeKeys.PREDICT:
        return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

    # Calculate Loss (for both TRAIN and EVAL modes)
    seg_loss = tf.reduce_mean(tf.keras.backend.binary_crossentropy(labels['seg_true'], seg_pred))
    loss = seg_loss

    # Configure the Training Op (for TRAIN mode)
    if mode == tf.estimator.ModeKeys.TRAIN:
        optimizer = tf.train.MomentumOptimizer(learning_rate=1e-4, momentum=0.9)

        train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())

        return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

    # Add evaluation metrics (for EVAL mode)
    return tf.estimator.EstimatorSpec(mode=mode, loss=loss)

Затем в основной части я тренируюсь и оцениваю с помощью специального оценщика:

# Create the Estimator
estimator = tf.estimator.Estimator(
    model_fn=model_fn,
    model_dir="/tmp/discriminative_model"
    )

def input_fn():
    features, labels = create_synthetic_image()

    training_data = tf.data.Dataset.from_tensors((features, labels))
    training_data = training_data.repeat(None)
    training_data = training_data.batch(1)
    training_data = training_data.prefetch(1)
    return training_data

estimator.train(input_fn=lambda: input_fn(), steps=2000)
eval_results = estimator.evaluate(input_fn=lambda: input_fn(), steps=50)
print('Eval loss at step %d: %s' % (eval_results['global_step'], eval_results['loss']))

Где create_synthetic_image каждый раз создает одно и то же изображение / метку.


person kielnino    schedule 31.10.2018    source источник


Ответы (1)


Я обнаружил, что обработка BatchNormalization может вызывать такие ошибки, как описано здесь .

Использование control_dependencies в model-fn решило проблему для меня (см. Здесь).

if mode == tf.estimator.ModeKeys.TRAIN:
    optimizer = tf.train.MomentumOptimizer(learning_rate=1e-4, momentum=0.9)

    with tf.control_dependencies(model.get_updates_for(features)):
        train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())

    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
person kielnino    schedule 01.11.2018