Добавление слоев LSTM в Keras вызывает ошибку ввода

Прежде всего, извиняюсь, если я ошибаюсь, я относительно новичок в TensorFlow.

Я разрабатываю модель для простой классификации набора данных, каждый столбец является атрибутом, а последний столбец - классом. Я разделяю их и создаю фрейм данных обычным способом.

Если я сгенерировал модель с плотными слоями, она отлично работает:

def baseline_model():
# create model
model = Sequential()
model.add(Dense(30, input_dim=len(dataframe.columns)-2, activation='sigmoid'))
model.add(Dense(20,activation='sigmoid'))   
model.add(Dense(unique, activation='softmax'))

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

Если бы я добавил, скажем, к модели слой LSTM:

def baseline_model():
# create model
model = Sequential()
model.add(Dense(30, input_dim=len(dataframe.columns)-2, activation='sigmoid'))


#this bit here >
model.add(LSTM(20, return_sequences=True))
model.add(Dense(20,activation='sigmoid'))   
model.add(Dense(unique, activation='softmax'))

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

Когда я выполняю код, я получаю следующую ошибку:

ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2

Я не уверен, откуда берутся эти переменные, может быть, это классы? У меня есть три класса данных («ПОЛОЖИТЕЛЬНЫЕ», «ОТРИЦАТЕЛЬНЫЕ», «НЕЙТРАЛЬНЫЕ»), сопоставленные с наборами из более чем 2000 значений атрибутов - они представляют собой статистические извлечения данных мозговых волн ЭЭГ с временными окнами с нескольких электродов, классифицированных по эмоциональному состоянию.

Примечание: 'input_dim = len (dataframe.columns) -2' производит количество атрибутов (входов), я делаю это, так как я хочу, чтобы скрипт работал с наборами данных CSV разных размеров на лету

Кроме того, в моем вставленном коде нет вкладок, но он имеет отступ и будет компилироваться

Полный код вставлен сюда: https://pastebin.com/1aXp9uDA для презентационных целей. Заранее приносим свои извинения за ужасную практику! Это всего лишь начальный проект, я планирую очистить его позже!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
144
1

Ответы 1

В исходном коде у вас есть входной размер 2, который имеет форму (партия, функция). Когда вы добавляете LSTM, вы говорите Keras, что хотите провести классификацию с учетом последних N временных шагов, следовательно, вам нужен сформированный вход (пакет, временной шаг, функция). Легко подумать, что LSTM будет проверять все входные данные в пакете, но, к сожалению, это не так. Вы должны вручную организовать свои данные, чтобы представить все элементы временного шага вместе.

Чтобы разделить данные, вы обычно создаете скользящее окно длиной N (где N - это количество значений, которые вы хотите, чтобы LSTM просматривал). Вы можете сдвигать окно на N шагов каждый раз, что означает отсутствие перекрытия данных, или вы можете просто сдвинуть его на один образец, что означает, что вы получите несколько копий ваших данных. О том, как это сделать, написано множество блогов. Взгляните на этот Как изменить форму входных данных для LSTM.

У вас также есть еще одна проблема. Для вашего LSTM вам, вероятно, понадобится return_sequences = False. Если это значение равно True, вам потребуется выходное значение «Y» для каждого элемента вашего временного шага. Вероятно, вы хотите, чтобы ваше значение «Y» представляло следующее значение в вашем временном ряду. Помните об этом при организации данных.

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

Другие вопросы по теме