Ошибка Tensorflow Estimator.predict () - PullRequest
0 голосов
/ 21 декабря 2018

Я воссоздаю DnCNN, т. Е. Gaussian Denoiser, который делает предсказание от изображения к изображению с помощью ряда сверточных слоев.И он отлично работает, но когда я пытаюсь сделать список (model.predict (..)), я получаю ошибку:

Метки не должны быть ни одной

Я фактически поместил все аргументы спецификаций моего EstimatorSpec явно там, поскольку они лениво оцениваются в зависимости от метода (train / eval /вести), который вызывается Оценщиком.

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 голосов
/ 02 апреля 2019

С estimator.predict вызывает «ValueError: нет значений, которые не поддерживаются» :

"В вашем model_fn вы определяете потери в каждом режиме (поезд / оценка / прогнозирование). Этоозначает, что даже в режиме прогнозирования метки будут использоваться и должны быть предоставлены.

Когда вы находитесь в режиме прогнозирования, на самом деле вам просто нужно вернуть прогнозы, чтобы вы могли вернуться рано из функции: "

def model_fn(features, labels, mode):
#...
y = ...
if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=y)
#...
0 голосов
/ 26 декабря 2018

Я не совсем уверен, в чем именно заключалась ошибка, но мне удалось получить прогноз моей модели.

что я изменил (кроме добавления нормы партии UPDATE_OPS, которая не решила мою проблему) было короткое замыкание (т.е. раннее и отдельное возвращение) tf.estimator.EstimatorSpec в случае tf.estimator.ModeKeys.PREDICT:

if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(
        mode=mode,
        predictions=conv_last + input_layer
    )

, очевидно, что-то не так с утверждением doc (или я не понял его)правильно) в tf.estimator.EstimatorSpec :

model_fn может заполнять все аргументы независимо от режима.В этом случае некоторые аргументы будут игнорироваться оценщиком.Например, train_op будет игнорироваться в режимах eval и infer.

Кстати: учитывая, что mode является прогнозируемым, в какой-то момент метки автоматически заменяются на None в любом случае.

...