ValueError: Тензор Tensor(“activation_5/Softmax:0”, размер=(?, 2), тип=float32) не является элементом этого графа.

Вопрос или проблема

Похоже, что есть проблема с предсказанием с использованием моей модели keras. Я обучал её с помощью следующего кода keras:

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(150, 150,3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))

model.add(Conv2D(32, (3, 3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))

model.add(Conv2D(64, (3, 3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))

model.add(Flatten())  # это преобразует наши 3D карты признаков в 1D векторы признаков
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2))
model.add(Activation('softmax'))

model.compile(loss="binary_crossentropy",
          optimizer="rmsprop",
          metrics=['accuracy'])

Тем не менее, когда я делаю предсказание на своей локальной системе после обучения с формой (1,150,150,3), оно предсказывает точно с точностью выше 90%. Однако, когда я загружаю свою модель на своем Raspberry Pi и вводлю изображение той же формы (1,150,150,3), она возвращает ошибку. Ниже приведен код, загруженный на Raspberry Pi для предсказания из модели keras.

    data = numpy.fromstring(stream.getvalue() , dtype = numpy.uint8)
    image5 = cv.imdecode(data , 1)
    print(image5.shape)
    #cv.imwrite('uhhu.png',image5)
    img = cv.resize(image5,(150,150))
    x = img_to_array(img)
    x = x.reshape((1,) + x.shape)
    x = x/255
    x = numpy.float32(x)
    print(x.shape)
    score = loaded_model.predict(x)
    print(score)

Решение этой проблемы заключается в том, чтобы делать предсказание из модели keras при работе с графом tensorflow по умолчанию.

import tensorflow as tf
graph = tf.get_default_graph()

global graph
with graph.as_default():
    result = loaded_model.predict(x)

Ответ или решение

Ошибка ValueError: Tensor Tensor("activation_5/Softmax:0", shape=(?, 2), dtype=float32) is not an element of this graph возникает при попытке использования модели Keras, которая была создана в одном контексте графа TensorFlow, но затем используется в другом. Это распространенная проблема, особенно когда модель загружается и используется в различных средах, таких как локальный компьютер и Raspberry Pi.

Понимание проблемы

Когда вы создаете и обучаете модель Keras, TensorFlow создает граф вычислений, который управляет всеми операциями, связанными с вашей моделью. Если вы пытаетесь выполнять предсказания с использованием модели, которая была загружена вне контекста графа, с которым она была связана, это приводит к возникновению вышеупомянутой ошибки.

Ваша модель была обучена и проверена на локальной машине и работает корректно, но при загрузке на Raspberry Pi контекст графа может отличаться, что и вызывает эту ошибку.

Решение

Как вы уже отметили в вашем последнем блоке кода, один из способов решения этой проблемы — явным образом указать, что предсказание должно выполняться в контексте графа по умолчанию. Ниже приведен рекомендуемый способ, как это можно сделать:

import tensorflow as tf
import numpy as np
import cv2 as cv
from keras.preprocessing.image import img_to_array

# Загрузка модели
loaded_model = ...  # Убедитесь, что модель загружена корректно

# Предобработка изображения
data = np.fromstring(stream.getvalue(), dtype=np.uint8)
image5 = cv.imdecode(data, 1)
print(image5.shape)

img = cv.resize(image5, (150, 150))
x = img_to_array(img)
x = x.reshape((1,) + x.shape)
x = x / 255
x = np.float32(x)
print(x.shape)

# Использование графа по умолчанию
graph = tf.get_default_graph()  # Получение графа по умолчанию

with graph.as_default():
    score = loaded_model.predict(x)
    print(score)

Подходы к устранению проблем

  1. Проверьте совместимость версий: Убедитесь, что версии TensorFlow и Keras на Raspberry Pi совпадают с теми, которые вы использовали для обучения модели.

  2. Убедитесь, что модель правильно загружена: Перед началом предсказания убедитесь, что ваша модель успешно загружена на Raspberry Pi.

  3. Изолируйте среду: Рассмотрите возможность использования виртуальных сред или контейнеров Docker, чтобы гарантировать, что зависимости программного обеспечения одинаковы в различных средах.

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

Заключение

Ситуации, подобные описанной, являются выводом недопонимания управления графами в TensorFlow. Стратегическое использование контекста графов при предсказаниях поможет избежать этой ошибки. Убедитесь, что вы правильно обрабатываете модель и данные с учетом всех вышеперечисленных рекомендаций, и вы сможете успешно выполнять предсказания и на Raspberry Pi.

Оцените материал
Добавить комментарий

Капча загружается...