首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow估计-训练数据的高评价值

Tensorflow估计-训练数据的高评价值
EN

Stack Overflow用户
提问于 2018-10-31 19:11:44
回答 1查看 555关注 0票数 1

我使用Tensorflow 1.10和自定义估计器。为了测试我的训练/评估循环,我每次都把相同的图像/标签输入到网络中,所以我希望网络能够快速收敛,它就是这样做的。

我也用同样的图像来评价,但损失比训练时大得多。在培训2000步之后,损失如下:

信息:tensorflow:最终步骤损失:0.01181452

但评价如下:

步骤2000的Eval损失:0.41252694

这在我看来是不对的。它看起来与线程中的问题相同。在使用evaluateEstimator方法时,有什么特别的考虑吗?

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

我已经将类似于FeatureNet的模型( 这里 )定义为使用initcall方法继承tf.keras.Model

我的model_fn看起来是这样的:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
# 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每次创建相同的图像/标签。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-01 11:29:59

我已经发现,BatchNormalization的处理会导致这样的错误,就像描述的这里一样。

control_dependenciesmodel-fn中的使用为我解决了这个问题(请看这里)。

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53090463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档