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






В исходном коде у вас есть входной размер 2, который имеет форму (партия, функция). Когда вы добавляете LSTM, вы говорите Keras, что хотите провести классификацию с учетом последних N временных шагов, следовательно, вам нужен сформированный вход (пакет, временной шаг, функция). Легко подумать, что LSTM будет проверять все входные данные в пакете, но, к сожалению, это не так. Вы должны вручную организовать свои данные, чтобы представить все элементы временного шага вместе.
Чтобы разделить данные, вы обычно создаете скользящее окно длиной N (где N - это количество значений, которые вы хотите, чтобы LSTM просматривал). Вы можете сдвигать окно на N шагов каждый раз, что означает отсутствие перекрытия данных, или вы можете просто сдвинуть его на один образец, что означает, что вы получите несколько копий ваших данных. О том, как это сделать, написано множество блогов. Взгляните на этот Как изменить форму входных данных для LSTM.
У вас также есть еще одна проблема. Для вашего LSTM вам, вероятно, понадобится return_sequences = False. Если это значение равно True, вам потребуется выходное значение «Y» для каждого элемента вашего временного шага. Вероятно, вы хотите, чтобы ваше значение «Y» представляло следующее значение в вашем временном ряду. Помните об этом при организации данных.
По приведенной выше ссылке можно найти несколько хороших примеров, или вы можете поискать более подробные. Если вы будете следовать им, должно быть ясно, как реорганизовать вещи для LSTM.