WedX - журнал о программировании и компьютерных науках

Python - RNN на основе LSTM требует ввода 3D?

я пытаюсь построить сеть глубокого обучения на основе LSTM RNN, вот что пробовал

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.layers import Embedding
from keras.layers import LSTM
import numpy as np

train = np.loadtxt("TrainDatasetFinal.txt", delimiter=",")
test = np.loadtxt("testDatasetFinal.txt", delimiter=",")

y_train = train[:,7]
y_test = test[:,7]

train_spec = train[:,6]
test_spec = test[:,6]


model = Sequential()
model.add(LSTM(32, input_shape=(1415684, 8),return_sequences=True))
model.add(LSTM(64, input_dim=8, input_length=1415684, return_sequences=True))
##model.add(Embedding(1, 256, input_length=5000))
##model.add(LSTM(64,input_dim=1, input_length=10, activation='sigmoid',
##               return_sequences=True, inner_activation='hard_sigmoid'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='rmsprop')

model.fit(train_spec, y_train, batch_size=2000, nb_epoch=11)
score = model.evaluate(test_spec, y_test, batch_size=2000)

но это дает мне следующую ошибку

ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (1415684, 1)

Вот пример из набора данных

(Номер пациента, время в миллисекундах, акселерометр по оси x, оси y, оси z, величина, спектрограмма, метка (0 или 1))

1,15,70,39,-970,947321,596768455815000,0
1,31,70,39,-970,947321,612882670787000,0
1,46,60,49,-960,927601,602179976392000,0
1,62,60,49,-960,927601,808020878060000,0
1,78,50,39,-960,925621,726154800929000,0

в наборе данных я использую только спектрограмму в качестве входной функции и метку (0 или 1) в качестве вывода, общее количество образцов для обучения составляет 1 415 684.


Ответы:


1

Ваша главная ошибка — непонимание того, как работает LSTM (или любая RNN) и что он принимает на вход. Один обучающий пример для сети LSTM состоит из последовательности и метки. Например, это...

1,15,70,39,-970,947321,596768455815000,0
1,31,70,39,-970,947321,612882670787000,0
1,46,60,49,-960,927601,602179976392000,0
1,62,60,49,-960,927601,808020878060000,0
1,78,50,39,-960,925621,726154800929000,0

... представляет собой последовательность длины 5 с 8 признаками. Меткой для всей последовательности является столбец меток в следующей строке. Обратите внимание, что это всего лишь один пример; партия означает несколько таких последовательностей и меток.


Теперь, что касается Кераса, из этот ответ:

Слой LSTM является рекуррентным слоем, поэтому он ожидает трехмерный ввод (batch_size, timesteps, input_dim).

Давайте внимательно посмотрим на вашу спецификацию: input_shape=(1415684, 8) говорит keras ожидать последовательности длиной 1415684, в которой каждый элемент имеет 8 характеристик. И все это без учета размера партии, который составляет 2000.

Это явно не сработает, потому что 1415684 слишком длинная последовательность LSTM. Эмпирические данные показывают, что LSTM может обучаться до 100 временных шагов, поэтому подача больших последовательностей не улучшит его обучение. Не говоря уже о том, что это не экономит память и время.

Вместо этого вы должны выбрать меньший timesteps параметр, скажем, timesteps=64, и разбить ваши данные на фрагменты из timesteps последовательных строк. Фрагменты могут пересекаться. Пакет из них означает всего batch_size * timesteps строк, каждая из которых содержит 8 столбцов. y_train должен содержать основную истину для каждой обучающей последовательности. Keras не будет выполнять этот подготовительный шаг, поэтому вам придется сделать это вручную.

27.01.2018
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]