CNN+LSTM ValueError: Вход 0 слоя sequential_10 несовместим со слоем: ожидается ndim=5, найден ndim=4

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

в настоящее время я занимаюсь распознанием человеческих действий для определения мошенничества на экзамене с помощью камер видеонаблюдения, используя AlexNet+LSTM

Мои данные — это необработанные изображения в каждой папке класса, как это

Но я получил ошибку, как эта:

ValueError: в пользовательском коде:

/usr/local/lib/python3.7/dist-packages/keras/engine/training.py:830 train_function  *
    return step_function(self, iterator)
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py:813 run_step  *
    outputs = model.train_step(data)
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py:770 train_step  *
    y_pred = self(x, training=True)
/usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py:989 __call__  *
    input_spec.assert_input_compatibility(self.input_spec, inputs, self.name)
/usr/local/lib/python3.7/dist-packages/keras/engine/input_spec.py:212 assert_input_compatibility  *
    raise ValueError('Input ' + str(input_index) + ' of layer ' +

ValueError: Input 0 of layer sequential_10 is incompatible with the layer: expected ndim=5, found ndim=4. Полная форма получена: (None, None, None, None)

Ошибка возникает, когда я делаю model.fit.

Из того, что я читал, говорилось, что проблема в input_shape, но я все еще не нашел решения для своей проблемы. Ссылка на мой код в collab доступна здесь,

Я все еще не понимаю, в чем проблема, я проверял документацию по input_shape в TimeDistributed, и она такая же для (timeSteps, height, width, channels)

Я пробовал пересоздать модель, но проблема все еще та же

Это связано с моим ImageDataGenerator?

Я был бы признателен, если кто-то с опытом в этом вопросе попробует помочь мне с моей проблемой

Большое спасибо!

Документация TimeDistributed говорит, что входные данные должны иметь форму (batch, time, другие . . .). В вашем случае (пакет изображений в временном ряде) форма должна быть (batch, time, r, g, b).

Но генератор изображений в вашем коде считывает изображения из каталога в пакете, выдавая тензоры с формой (batch, r, g, b). Таким образом, у вас отсутствует временное измерение.

Если вы хотите использовать слои TimeDistributed, вам нужно будет собрать ваши изображения в виде временного ряда, затем применить пакетирование.

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

Для решения приведённой проблемы с ошибкой ValueError: Input 0 of layer sequential_10 is incompatible with the layer: expected ndim=5, found ndim=4 необходимо тщательно проанализировать процесс подготовки данных и конфигурацию вашей модели. Давайте подробно рассмотрим основные аспекты и шаги, которые помогут вам исправить эту ошибку.

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

Ваш подход к распознаванию действий человека включает использование сети AlexNet в сочетании с LSTM. Ошибка, которую вы получаете, связана с ожиданием модели входного тензора с 5 измерениями, в то время как фактически подается тензор с 4 измерениями. Это происходит из-за того, что TimeDistributed слой ожидает данные в формате (batch_size, time_steps, height, width, channels), но ImageDataGenerator (или другой механизм получения данных) предоставляет данные в формате (batch_size, height, width, channels).

2. Подготовка данных

Чтобы решить эту проблему, вам необходимо гарантировать, что ваши входные данные имеют правильные размеры. Для этого необходимо проявить следующие шаги:

  • Формирование временных последовательностей: Вам нужно собрать ваши изображения в временные последовательности. Например, если у вас есть 10 кадров для одного действия, вам нужно сформировать массив размером (1, 10, height, width, channels).

  • Изменение ImageDataGenerator: Если вы используете ImageDataGenerator, он требуется настроить так, чтобы он возвращал данные, уже сгруппированные в временные последовательности. К сожалению, стандартный ImageDataGenerator не поддерживает формирование временных последовательностей напрямую. Вместо этого вам придется самостоятельно реализовать логику для формирования временных последовательностей.

3. Пример создания временных последовательностей

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

import numpy as np

# Пример: Предположим, у вас есть массив `all_images` с формой (num_samples, height, width, channels)
# и вы хотите создать временные последовательности по 10 кадров
time_steps = 10
samples = len(all_images) // time_steps

# Теперь формируем новый массив 
X = np.zeros((samples, time_steps, height, width, channels))

for i in range(samples):
    X[i] = all_images[i*time_steps:(i+1)*time_steps]

# После этого X будет иметь форму (samples, time_steps, height, width, channels)

4. Обновление модели

Когда формат входных данных будет соответствовать требуемому (5 измерений), вам нужно убедиться, что структура вашей модели учитывает эту изменённую входную форму:

from keras.models import Sequential
from keras.layers import TimeDistributed, Conv2D, LSTM, Dense

model = Sequential()

# Пример конфигурации модели
model.add(TimeDistributed(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'), input_shape=(time_steps, height, width, channels)))
model.add(TimeDistributed(...))  # другие слои
model.add(LSTM(128))
model.add(Dense(num_classes, activation='softmax'))

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

5. Обучение модели

Теперь, когда все данные подготовлены должным образом и модель настроена, вы можете безопасно использовать метод model.fit():

model.fit(X, y_labels, epochs=10, batch_size=32)

Заключение

Ваша ошибка вызвана несовпадением ожидаемой и фактической формы входных данных, что является распространенной проблемой, особенно в задачах, требующих обработки временных последовательностей. Убедившись, что ваши данные имеют нужный формат с 5 измерениями и соответствуют требованиям TimeDistributed слоя, вы сможете успешно обучить вашу модель.

Если возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью!

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

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