Вопрос или проблема
Похоже, что есть проблема с предсказанием с использованием моей модели 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)
Подходы к устранению проблем
-
Проверьте совместимость версий: Убедитесь, что версии TensorFlow и Keras на Raspberry Pi совпадают с теми, которые вы использовали для обучения модели.
-
Убедитесь, что модель правильно загружена: Перед началом предсказания убедитесь, что ваша модель успешно загружена на Raspberry Pi.
-
Изолируйте среду: Рассмотрите возможность использования виртуальных сред или контейнеров Docker, чтобы гарантировать, что зависимости программного обеспечения одинаковы в различных средах.
-
Отладка: Если проблемы продолжаются, рассмотрите возможность добавления дополнительной отладочной информации, чтобы понять, в какой момент процесс идет не так, как ожидалось.
Заключение
Ситуации, подобные описанной, являются выводом недопонимания управления графами в TensorFlow. Стратегическое использование контекста графов при предсказаниях поможет избежать этой ошибки. Убедитесь, что вы правильно обрабатываете модель и данные с учетом всех вышеперечисленных рекомендаций, и вы сможете успешно выполнять предсказания и на Raspberry Pi.