Ошибка недопустимого аргумента предварительно обученной модели Tensorflow

Я делаю свой проект, используя tensorflow с предварительно обученной моделью mobilenet_v2, которую можно найти на https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md.

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

if __name__ == '__main__':
    im = Image.open('./sample/maltiz.png')
    im3 = im.resize((300, 300))

    image = np.asarray(im)[:,:,:3]

    model_path = 'models/ssd_mobilenet_v2_coco_2018_03_29/'

    meta_path = os.path.join(model_path, 'model.ckpt.meta')
    model = tf.train.import_meta_graph(meta_path)

    sess = tf.Session()
    model.restore(sess, tf.train.latest_checkpoint(model_path))

    data = np.array([image])
    data = data.astype(np.uint8)

    X = tf.placeholder(tf.uint8, shape=[None, None, None, 3])

    graph = tf.get_default_graph()

    for i in graph.get_operations():
        if "Relu" in i.name:
            print(sess.run(i.values(), feed_dict = { X : data}))

Я получил это сообщение об ошибке

File "load_model.py", line 42, in <module>

    print(sess.run(i.values(), feed_dict = { X : data}))
InvalidArgumentError: You must feed a value for placeholder tensor 'image_tensor' with dtype uint8 and shape [?,?,?,3]

[[node image_tensor (defined at load_model.py:24) ]]

Я распечатал заполнитель и форму данных.

заполнитель был набран uint8 [?,?,?,3] и изображение имело форму с [1,300,300,3] Я не знаю, в чем проблема.

Похоже, просто идеальное совпадение с типом в сообщении об ошибке.

Пожалуйста, дайте мне знать, в чем проблема.

Можете ли вы попробовать np.array(image) вместо np.array([image])

vb_rises 30.04.2019 14:24

Я только что получил почти ту же ошибку с предыдущим. (Форма не соответствует) ValueError: невозможно передать значение формы (300, 300, 3) для тензора «Заполнитель: 0», который имеет форму «(?,?,?, 3)»

C.H.Song 30.04.2019 15:03

Можете ли вы напечатать форму данных и их тип после строки data = data.astype(np.uint8)?

vb_rises 30.04.2019 15:10

uint8 print(data.dtype) (1, 300, 300, 3) print(data.shape) Спасибо

C.H.Song 30.04.2019 15:35

К вашему сведению, тензор («Заполнитель: 0», форма = (?, ?, ?, 3), dtype = uint8) print(X)

C.H.Song 30.04.2019 15:40

Попробуйте это tf.reset_default_graph()print(x.name)x=tf.get_default_graph().get_tensor_by_name("Placeholder:0") Прочитайте ссылку, приведенную ниже, там есть несколько полезных комментариев. Ссылка: связь

vb_rises 30.04.2019 15:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
484
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы загружаете предопределенный график и восстанавливаете график до последней контрольной точки, график уже определен. Но когда вы делаете

X = tf.placeholder(tf.uint8, shape=[None, None, None, 3])

Вы создаете дополнительный узел в графе. и этот узел не имеет ничего общего с узлами, которые вы хотите оценить, узлы из graph.get_operations() зависят не от этого дополнительного узла, а от какого-то другого узла, и, поскольку этот другой узел не получает значений, ошибка говорит о недопустимых аргументах.

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

im = Image.open('./sample/maltiz.png')
im3 = im.resize((300, 300))

image = np.asarray(im)[:,:,:3]

model_path = 'models/ssd_mobilenet_v2_coco_2018_03_29/'

meta_path = os.path.join(model_path, 'model.ckpt.meta')
model = tf.train.import_meta_graph(meta_path)

sess = tf.Session()
model.restore(sess, tf.train.latest_checkpoint(model_path))

data = np.array([image])
data = data.astype(np.uint8)

graph = tf.get_default_graph()
X = graph.get_tensor_by_name('image_tensor:0')

for i in graph.get_operations():
    if "Relu" in i.name:
        print(sess.run(i.values(), feed_dict = { X : data}))

PS: я сам попробовал описанный выше подход, но есть некоторая внутренняя ошибка tensorflow (версия 1.13.1), которая не позволяет мне оценить все узлы, в именах которых есть Relu. Но все же некоторые узлы можно оценить таким образом.

Другие вопросы по теме