ValueError: Слой sequential_7 никогда не был вызван и, следовательно, не имеет определенного ввода.

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

Когда я запускаю следующий код:

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 возникает, когда вы пытаетесь создать промежуточную модель на основе слоя, который не имеет определения вводных данных. Это обычно связано с тем, что входные данные для модели не были корректно подготовлены или обработаны.

Вот как можно исправить вашу программу:

  1. Подготовка входного изображения: Убедитесь, что вы правильно подготавливаете входное изображение для модели. Мы должны убедиться, что оно имеет правильную форму и тип данных, соответствующие входным требованиям модели.

  2. Обработка входных данных: Ваша функция 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)

Объяснение изменений:

  1. Нормализация: Я добавил нормализацию значений пикселей (разделил на 255.0), что часто требуется в моделях нейронных сетей.

  2. Проверка формы изображения: Добавлен код для проверки формы входного изображения, чтобы убедиться, что оно является RGB изображением.

  3. Безопасная визуализация: В цикле для отображения активаций используется min(16, activations.shape[-1]), чтобы избежать выхода за пределы массива, если активаций меньше 16.

Эти изменения должны помочь вам избежать вышеупомянутой ошибки и корректно визуализировать активации в указанном слое.

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

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