Helpers - компьютеры, интернет, программирование

ошибка при преобразовании тензора в массив numpy

Я пытаюсь преобразовать input_image, который является тензором, в массив numpy. Следуя уже отвеченным вопросам здесь и несколько других, которые предложили использовать input_image.eval() или эквивалентно sess.run() для этого преобразования, я сделал то же самое, но выдает ошибку и, по-видимому, ожидает значение feed_dict для sess.run(). Но поскольку здесь я не пытаюсь запустить операцию, зависящую от неизвестных значений, я не вижу здесь необходимости в feed_dict, потому что все, что я здесь делаю, это просто преобразование.

Кроме того, просто для проверки я также попытался преобразовать значение tf.constant([1,2,3]) прямо над ним, используя тот же метод, и оно было успешно скомпилировано, несмотря на то, что его тип данных такой же, как input_image. Вот мой код, который является частью более крупного скрипта:

def call(self, x):
    input_image = Input(shape=(None, None, 3))
    print(input_image.shape)
    print(type(tf.constant([1,2,3])))
    print(type(input_image))
    print(type(K.get_session().run(tf.constant([1,2,3]))))
    print(type(K.get_session().run(input_image)))

и вот ошибка:

(?, ?, ?, 3)
<class 'tensorflow.python.framework.ops.Tensor'>
<class 'tensorflow.python.framework.ops.Tensor'>
<class 'numpy.ndarray'>
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py", line 1365, in _do_call
    return fn(*args)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py", line 1350, in _run_fn
    target_list, run_metadata)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py", line 1443, in _call_tf_sessionrun
    run_metadata)
tensorflow.python.framework.errors_impl.InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument: You must feed a value for placeholder tensor 'input_1' with dtype float and shape [?,?,?,3]
     [[{{node input_1}}]]
     [[input_1/_1051]]
  (1) Invalid argument: You must feed a value for placeholder tensor 'input_1' with dtype float and shape [?,?,?,3]
     [[{{node input_1}}]]
0 successful operations.
0 derived errors ignored.

Интересно, почему первый будет работать, а второй нет.


Ответы:


1

Просто добавляя (или развивая) то, что сказал @MatiasValdenegro,

TensorFlow следует тому, что называется выполнением графа (или определением, затем запуском). Другими словами, когда вы пишете программу TensorFlow, она определяет то, что называется графом потока данных, который показывает, как определенные вами операции связаны друг с другом. А затем вы выполняете фрагменты этого графика в зависимости от результатов, которые вам нужны.

Рассмотрим два примера. (Я переключаюсь на простую программу TensorFlow вместо битов Keras, так как это проясняет ситуацию - ведь K.get_session() возвращает объект Session).

Пример 1

Скажем, у вас есть следующая программа.

import tensorflow as tf

a = tf.placeholder(shape=[2,2], dtype=tf.float32)
b = tf.constant(1, dtype=tf.float32)
c = a * b

# Wrong: This is what you're doing essentially when you do sess.run(input_image)
with tf.Session() as sess:
    print(sess.run(c))

# Right: You need to feed values that c is dependent on
with tf.Session() as sess:
    print(sess.run(c, feed_dict={a: np.array([[1,2],[2,3]])}))

Всякий раз, когда результирующий тензор (например, c) зависит от placeholder, вы не можете выполнить его и получить результат без передачи значений всем зависимым заполнителям.

Пример 2

Когда вы определяете tf.constant(1), это ни от чего не зависит. Другими словами, вам не нужен feed_dict, и вы можете напрямую запускать на нем eval() или sess.run().

Обновление: дальнейшее объяснение того, почему вам нужен feed_dict для input_image

TLDR: вам нужен feed_dict, потому что ваш результирующий Tensor создается слоем Input.

Ваш input_image в основном является результирующим тензором, который вы получаете, вводя что-то в слой Input. Обычно в Keras вы не видите детали внутреннего уровня заполнителя. Но вы бы сделали это, используя model.fit() или model.evaluate(). Вы можете видеть, что слой Keras Input фактически использует заполнитель, анализируя эта строка.

Надеюсь, я ясно объяснил, что вам нужно вводить значение в заполнитель, чтобы успешно оценить выходные данные слоя Input. Потому что это в основном содержит заполнитель.

Обновление 2. Как передать данные слою Input

Итак, вы можете использовать feed_dict со слоем Keras Input следующим образом. Вместо определения аргумента shape вы сразу передаете заполнитель аргументу tensor, что позволит обойти внутреннее создание заполнителя в слое.

from tensorflow.keras.layers import InputLayer
import numpy as np
import tensorflow.keras.backend as K

x = tf.placeholder(shape=[None, None, None, 3], dtype=tf.float32)
input_image = Input(tensor=x)
arr = np.array([[[[1,1,1]]]])
print(arr.shape)
print(K.get_session().run(input_image, feed_dict={x: arr}))
24.11.2019
  • Пожалуйста, взгляните на приведенный выше код, я внес некоторые изменения, чтобы прояснить свои мысли. 25.11.2019
  • @conjuring Обновил мой ответ. Дайте мне знать, если вам нужно больше разъяснений по чему-то в обновленном ответе. 25.11.2019

  • 2

    Не существует такой вещи, как «преобразование» символического тензора в массив numpy, поскольку последний не может содержать ту же информацию, что и первый.

    Когда вы используете eval() или session.run(), вы вычисляете символьное выражение для получения числового результата, который представляет собой пустой массив, но это не преобразование. Вычисление выражения может потребовать или не потребовать дополнительных входных данных (для этого используется feed_dict), в зависимости от выражения.

    Для оценки константы (tf.constant) не требуются какие-либо входные данные, но для оценки вашего другого выражения требуются входные данные, поэтому вы не можете «преобразовать» это в массив numpy.

    24.11.2019
    Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

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

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..