API оценщика: AttributeError: у объекта 'NoneType' нет атрибута 'dtype' - PullRequest
0 голосов
/ 21 сентября 2018

Я уже посмотрел предыдущие ответы на эту проблему, но она еще не решена.Я реализую алгоритм YOLO (для обнаружения объектов) с нуля, и у меня возникли проблемы в обучающей части.

Для обучения я использую tf.estimator API и использую код, аналогичный коду CNN MNIST в программе tenorflow пример .Я получаю следующую ошибку:

Traceback (most recent call last):
  File "recover_v3.py", line 663, in <module>
    model.train(input_fn=train_input_fn, steps=1)
  File "/home/nyu-mmvc-019/miniconda3/envs/tf_0/lib/python3.6/site-packages/tensorflow/python/estimator/estimator.py", line 376, in train
    loss = self._train_model(input_fn, hooks, saving_listeners)
  File "/home/nyu-mmvc-019/miniconda3/envs/tf_0/lib/python3.6/site-packages/tensorflow/python/estimator/estimator.py", line 1145, in _train_model
    return self._train_model_default(input_fn, hooks, saving_listeners)
  File "/home/nyu-mmvc-019/miniconda3/envs/tf_0/lib/python3.6/site-packages/tensorflow/python/estimator/estimator.py", line 1170, in _train_model_default
    features, labels, model_fn_lib.ModeKeys.TRAIN, self.config)
  File "/home/nyu-mmvc-019/miniconda3/envs/tf_0/lib/python3.6/site-packages/tensorflow/python/estimator/estimator.py", line 1133, in _call_model_fn
    model_fn_results = self._model_fn(features=features, **kwargs)
  File "recover_v3.py", line 584, in cnn_model_fn
    loss=loss, global_step=tf.train.get_global_step())
  File "/home/nyu-mmvc-019/miniconda3/envs/tf_0/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py", line 400, in minimize
    grad_loss=grad_loss)
  File "/home/nyu-mmvc-019/miniconda3/envs/tf_0/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py", line 494, in compute_gradients
    self._assert_valid_dtypes([loss])
  File "/home/nyu-mmvc-019/miniconda3/envs/tf_0/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py", line 872, in _assert_valid_dtypes
    dtype = t.dtype.base_dtype
AttributeError: 'NoneType' object has no attribute 'dtype'

Код, связанный с функцией потерь в основном файле, показан ниже (аналогично официальному примеру CNN MNIST):

if mode == tf.estimator.ModeKeys.TRAIN:
    # This gives the LOSS for each image in the batch.
    # It is importing loss function from another file (called loss_fn)
    # Apparently it returns None (not sure)
    loss = loss_fn.loss_fn(logits, labels)

    optimizer = tf.train.AdamOptimizer(learning_rate=params["learning_rate"])

    train_op = optimizer.minimize(
        loss=loss, global_step=tf.train.get_global_step())

    # Wrap all of this in an EstimatorSpec.
    spec = tf.estimator.EstimatorSpec(
        mode=mode,
        loss=loss,
        train_op=train_op,
        eval_metric_ops=None)

    return spec

Предыдущий ответы на аналогичную проблему предполагают, что функция потерь ничего не возвращает.Однако, когда я пытаюсь использовать функцию потерь со случайно сгенерированными массивами, она работает нормально и выдает нормальные значения.

Кроме того, если я возвращаю постоянную, такую ​​как 10.0, из функции потерь, я все равно получаю ту же ошибку.

Я не уверен, как действовать сейчас.Кроме того, есть ли способ распечатать потерю, возвращенную функцией потерь.Очевидно, API tf.estimator запускает сеанс tenorflow сам по себе, и если я пытаюсь создать другой сеанс (чтобы напечатать значение, возвращаемое функцией loss), я получаю другие ошибки.

1 Ответ

0 голосов
/ 21 сентября 2018

Однако, когда я пытаюсь использовать функцию потерь со случайно сгенерированными массивами, она работает нормально и выдает нормальные значения.

Похоже, у вас проблема с input_fn.Вы уверены, что это правильно реализовано?

Кроме того, есть ли способ распечатать потерю, возвращенную функцией потерь.

Оценщик автоматически выводит значение функции потерь в консоли каждые global_step%'save_summary_steps.Вы также можете отслеживать функцию потерь, используя скалярную сводку, например так:

tf.summary.scalar('loss', loss)
...