Tensorflow Estimator.predict()失败

时间:2018-12-21 10:44:43

标签: predict tensorflow-estimator

我正在重新创建DnCNN,即高斯Denoiser,它使用一系列卷积层来进行图像到图像的预测。而且它训练得很好,但是当我尝试执行列表(model.predict(..))时, 我得到错误:

  

标签不能为空

实际上,我将EstimatorSpec的所有spec参数明确地放在了其中,因为根据Estimator调用的方法(train / eval / predict)对它们进行了惰性计算。

def DnCNN_model_fn (features, labels, mode):
   # some convolutinons here
   return tf.estimator.EstimatorSpec(
        mode=mode,
        predictions=conv_last + input_layer,
        loss=tf.losses.mean_squared_error(
            labels=labels, 
            predictions=conv_last + input_layer),
        train_op=tf.train.AdamOptimizer(learning_rate=0.001, epsilon=1e-08).minimize(
            loss=tf.losses.mean_squared_error(
                labels=labels,
                predictions=conv_last + input_layer),
            global_step=tf.train.get_global_step()),
        eval_metric_ops={
            "accuracy": tf.metrics.mean_absolute_error(
                labels=labels,
                predictions=conv_last + input_layer)}
      )

将其放入估算器中

d = datetime.datetime.now()

DnCNN = tf.estimator.Estimator(
    model_fn=DnCNN_model_fn,
    model_dir=root + 'model/' +
              "DnCNN_{}_{}_{}_{}".format(d.month, d.day, d.hour, d.minute),
    config=tf.estimator.RunConfig(save_summary_steps=2,
                                  log_step_count_steps=10)
)

训练模型后,我进行如下预测:

test_input_fn = tf.estimator.inputs.numpy_input_fn(
    x= test_data[0:2,:,:,:],
    y= None,
    batch_size=1,
    num_epochs=1,
    shuffle=False)

predicted = DnCNN.predict(input_fn=test_input_fn) 
list(predicted) # this is where the error occurs

追溯表明,tf.losses.mean_squared_error导致了此问题。

    Traceback (most recent call last):
      File "<input>", line 16, in <module>
      File "...\venv2\lib\site-packages\tensorflow\python\estimator\estimator.py", line 551, in predict
        features, None, model_fn_lib.ModeKeys.PREDICT, self.config)
      File "...\venv2\lib\site-packages\tensorflow\python\estimator\estimator.py", line 1169, in _call_model_fn
        model_fn_results = self._model_fn(features=features, **kwargs)
      File "<input>", line 95, in DnCNN_model_fn
      File "...\venv2\lib\site-packages\tensorflow\python\ops\losses\losses_impl.py", line 663, in mean_squared_error
        raise ValueError("labels must not be None.")
    ValueError: labels must not be None.

2 个答案:

答案 0 :(得分:0)

我不确定确切的错误是什么,但是我设法使模型能够预测。

在{{1}的情况下,我所做的更改(除了添加了不能解决我的问题的批处理规范UPDATE_OPS)是使tf.estimator.EstimatorSpec短路(即,提前并单独返回) }:

tf.estimator.ModeKeys.PREDICT

显然,在tf.estimator.EstimatorSpec处找到的doc语句似乎有问题(或者我没有正确理解):

  

model_fn可以独立于模式填充所有参数。在这种情况下,一些参数会被Estimator忽略。例如。在eval和推断模式下,train_op将被忽略。

顺便说一句:给定if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec( mode=mode, predictions=conv_last + input_layer ) 是可以预测的,在某些情况下,标签在任何情况下都会自动替换为无。

答案 1 :(得分:0)

来自estimator.predict raises "ValueError: None values not supported"

“”在您的model_fn中,您定义了每种模式(火车/评估/预测)下的损失。这意味着即使在预测模式下,也将使用并需要提供标签。

处于预测模式时,实际上只需要返回预测,这样就可以从函数中早返回:”

def model_fn(features, labels, mode):
#...
y = ...
if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=y)
#...