我已经使用自定义估算器构建并训练了分类器。因为之后需要在单独的数据集上使用它,所以我将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