Вопрос или проблема
Когда я запускаю следующий код:
import tensorflow as tf
from tensorflow.keras.models import load_model
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
def visualize_feature_maps(model_path, image_path, layer_name="conv2d"):
model = load_model(model_path)
conv_layer = model.get_layer(layer_name)
intermediate_model = tf.keras.Model(inputs=model.input, outputs=conv_layer.output)
img = Image.open(image_path)
img = tf.image.resize(img, [128,128], antialias=True)
img_array = np.array(img)
activations = intermediate_model.predict(img_array[np.newaxis, ...])
fig, axs = plt.subplots(4, 4, figsize=(10, 10))
for i in range(16):
ax = axs[i // 4, i % 4]
ax.imshow(activations[0, :, :, i], cmap='gray')
ax.axis('off')
plt.show()
model_path = r'C:\Users\gabri\OneDrive - ufu.br\TCC\VS Code\Models\Model ESTE.keras'
image_path = r'C:\Users\gabri\OneDrive - ufu.br\TCC\VS Code\Dataset\Diabrotica speciosa\diabroticaspeciosa (1).jpg'
model = load_model(model_path)
visualize_feature_maps(model_path, image_path)
Я получаю ошибку:
ValueError Traceback (most recent call last)
Cell In[30], line 33
30 image_path = r'C:\Users\gabri\OneDrive - ufu.br\TCC\VS Code\Dataset\Diabrotica speciosa\diabroticaspeciosa (1).jpg'
32 model = load_model(model_path)
---> 33 visualize_feature_maps(model_path, image_path)
Cell In[30], line 13
9 model = load_model(model_path)
11 conv_layer = model.get_layer(layer_name)
---> 13 intermediate_model = tf.keras.Model(inputs=model.input, outputs=conv_layer.output)
15 img = Image.open(image_path)
16 img = tf.image.resize(img, [128,128], antialias=True)
Код загружает сохраненную модель и должен отображать выходные данные первого сверточного слоя. Модель нельзя дообучить, так как это модель, уже используемая, которую нужно документировать. Я пытался использовать Gemini, чтобы это исправить, но ваше предложение заключается в том, чтобы дообучить модель.
Версия TensorFlow: 2.17.0
Версия Keras: 3.4.1
Версия Python: 3.11.9
Ответ или решение
Ошибка ValueError: The layer sequential_7 has never been called and thus has no defined input
возникает, когда вы пытаетесь создать промежуточную модель на основе слоя, который не имеет определения вводных данных. Это обычно связано с тем, что входные данные для модели не были корректно подготовлены или обработаны.
Вот как можно исправить вашу программу:
-
Подготовка входного изображения: Убедитесь, что вы правильно подготавливаете входное изображение для модели. Мы должны убедиться, что оно имеет правильную форму и тип данных, соответствующие входным требованиям модели.
-
Обработка входных данных: Ваша функция
visualize_feature_maps
должна преобразовывать изображение в формат, который ожидает модель (например, нормализовать значение пикселей).
Вот исправленный код с комментариями:
import tensorflow as tf
from tensorflow.keras.models import load_model
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
def visualize_feature_maps(model_path, image_path, layer_name="conv2d"):
# Загружаем модель
model = load_model(model_path)
# Получаем указанный слой
conv_layer = model.get_layer(layer_name)
# Создаем промежуточную модель
intermediate_model = tf.keras.Model(inputs=model.input, outputs=conv_layer.output)
# Загружаем и обрабатываем изображение
img = Image.open(image_path)
# Изменяем размер изображения (может быть необходимо изменить размер в зависимости от вашей модели)
img = img.resize((128, 128), Image.ANTIALIAS)
# Преобразуем изображение в массив и нормализуем значения пикселей
img_array = np.array(img) / 255.0 # Нормализация
# Убедимся, что форма массива соответствует ожидаемой модели
if img_array.shape[-1] == 3: # Входное изображение RGB
img_array = np.expand_dims(img_array, axis=0) # Добавляем размер для батча
else:
raise ValueError("Unexpected image shape: Expected an RGB image.")
# Получаем активации конволюционного слоя
activations = intermediate_model.predict(img_array)
# Отображение активаций
fig, axs = plt.subplots(4, 4, figsize=(10, 10))
for i in range(min(16, activations.shape[-1])): # Убедитесь, что количество активаций меньше 16
ax = axs[i // 4, i % 4]
ax.imshow(activations[0, :, :, i], cmap='gray')
ax.axis('off')
plt.show()
model_path = r'C:\Users\gabri\OneDrive - ufu.br\TCC\VS Code\Models\Model ESTE.keras'
image_path = r'C:\Users\gabri\OneDrive - ufu.br\TCC\VS Code\Dataset\Diabrotica speciosa\diabroticaspeciosa (1).jpg'
# Вызов функции для визуализации
visualize_feature_maps(model_path, image_path)
Объяснение изменений:
-
Нормализация: Я добавил нормализацию значений пикселей (разделил на 255.0), что часто требуется в моделях нейронных сетей.
-
Проверка формы изображения: Добавлен код для проверки формы входного изображения, чтобы убедиться, что оно является RGB изображением.
-
Безопасная визуализация: В цикле для отображения активаций используется
min(16, activations.shape[-1])
, чтобы избежать выхода за пределы массива, если активаций меньше 16.
Эти изменения должны помочь вам избежать вышеупомянутой ошибки и корректно визуализировать активации в указанном слое.