繁体   English   中英

将训练有素的Tensorflow模型加载到估算器中

[英]Loading trained Tensorflow model into estimator

假设我已经训练了Tensorflow Estimator:

estimator = tf.contrib.learn.Estimator(
  model_fn=model_fn,
  model_dir=MODEL_DIR,
  config=some_config)

我适合一些火车数据:

estimator.fit(input_fn=input_fn_train, steps=None)

我的想法是模型适合我的MODEL_DIR。 该文件夹包含一个检查点和几个.meta.index文件。

这非常有效。 我想用我的函数做一些预测:

estimator = tf.contrib.Estimator(
  model_fn=model_fn,
  model_dir=MODEL_DIR,
  config=some_config)

predictions = estimator.predict(input_fn=input_fn_test)

我的解决方案完美无缺,但有一个很大的缺点:你需要知道model_fn,这是我在Python中定义的模型。 但是,如果我通过在Python代码中添加密集层来更改模型,则此模型对于MODEL_DIR中保存的数据不正确,从而导致不正确的结果:

NotFoundError (see above for traceback): Key xxxx/dense/kernel not found in checkpoint

我该如何应对? 如何加载我的模型/估算器,以便我可以对一些新数据进行预测? 如何从MODEL_DIR加载model_fn或估算器?

避免糟糕的恢复

仅在模型和检查点兼容的情况下,才能从检查点恢复模型的状态。 例如,假设您训练了一个包含两个隐藏层的DNNClassifier Estimator,每个隐藏层有10个节点:

classifier = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[10, 10],
    n_classes=3,
    model_dir='models/iris')

classifier.train(
    input_fn=lambda:train_input_fn(train_x, train_y, batch_size=100),
        steps=200)

训练之后(因此,在models/iris创建检查点之后),假设您将每个隐藏层中的神经元数量从10更改为20,然后尝试重新训练模型:

classifier2 = tf.estimator.DNNClassifier(
    feature_columns=my_feature_columns,
    hidden_units=[20, 20],  # Change the number of neurons in the model.
    n_classes=3,
    model_dir='models/iris')

classifier.train(
    input_fn=lambda:train_input_fn(train_x, train_y, batch_size=100),
        steps=200)

由于检查点中的状态与classifier2描述的模型不兼容,因此重新训练失败并出现以下错误:

...
InvalidArgumentError (see above for traceback): tensor_name =
dnn/hiddenlayer_1/bias/t_0/Adagrad; shape in shape_and_slice spec [10]
does not match the shape stored in checkpoint: [20]

要运行训练和比较模型略有不同版本的实验,请保存创建每个model_dir的代码副本,可能需要为每个版本创建单独的git分支。 这种分离将使您的检查点可以恢复。

从tensorflow检查点doc复制。

https://www.tensorflow.org/get_started/checkpoints

希望能帮到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM