我使用自定义估算器构建并训练了分类器 . 因为我需要在单独的数据集上使用它,然后我将model_fn放在一个单独的文件中 . 直接训练和评估我的数据集如下(为了便于阅读,缩短了input_fn)

# Instantiate the estimator
birdsclassifier = tf.estimator.Estimator(
    model_fn=cnn_model, model_dir=model_path)
tensors_to_log = {"probabilities": "softmax_tensor"}
logging_hook = tf.train.LoggingTensorHook(
          tensors=tensors_to_log, every_n_iter=50)

# Train the model   
def input_fn():
    #Training dataset preparation happens here
    return {'x': features}, labels
birdsclassifier.train(
    input_fn=input_fn,
    steps=num_steps,
    hooks=[logging_hook])
# Evaluate the model and print results
print('begin eval')
def eval_input_fn():
    #Validation dataset preparation happens here
    return {'x': featuresTest}, labelsT

eval_results = birdsclassifier.evaluate(input_fn=eval_input_fn)
print(eval_results)

并给出以下输出

{'accuracy': 0.5952381, 'loss': 1.4494723, 'global_step': 2000}

但是只运行一个带有评估代码的脚本(检查了混洗问题,并且两个验证数据集完全一致)

{'accuracy': 0.083333336, 'loss': 4.551247, 'global_step': 2000}

由于全局步骤是相同的,图表似乎至少部分地从检查点正确地重建 - 但是看起来好像变量没有被正确加载 . 还重复运行第二个脚本给我略有不同的输出 . 我还注意到,使用少量步骤重新运行训练脚本会不断增加global_step计数,但也会导致精度下降,这表明训练从随机重新开始

This thread以及this建议我的方法应该可以正常工作 .

注意:如果代码片段不足,则代码的其余部分位于:https://github.com/pbkowalski/cnn_classification_birds