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