【问题标题】:Tensorflow Estimator - High evaluation values on training dataTensorflow Estimator - 训练数据的高评估值
【发布时间】:2019-04-05 00:56:09
【问题描述】:

我正在使用带有自定义 Estimator 的 Tensorflow 1.10。为了测试我的训练/评估循环,我每次只将相同的图像/标签输入网络,所以我希望网络能够快速收敛,它确实做到了。

我也使用相同的图像进行评估,但得到的损失值比训练时大得多。训练 2000 步后,损失为:

INFO:tensorflow:Loss for final step:0.01181452

但计算结果为:

2000 步的评估损失:0.41252694

这对我来说似乎是错误的。它看起来与this 线程中的问题相同。在使用Estimatorevaluate 方法时,有什么特别需要考虑的吗?


关于我的代码的更多细节:

我已将我的模型(FeatureNet)定义为 here 之类的 tf.keras.Model 的继承,使用 initcall 方法。

我的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)

然后在主要部分中,我使用自定义 Estimator 进行训练和评估:

# 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 每次都创建相同的图像/标签。

【问题讨论】:

    标签: python tensorflow tensorflow-estimator


    【解决方案1】:

    我发现,BatchNormalization 的处理可能会导致此类错误,如 here 所述。

    model-fncontrol_dependencies 的使用为我解决了这个问题 (see here)。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-07
      • 2018-09-12
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      相关资源
      最近更新 更多