Форма ввода LSTM для многомерных временных рядов? - PullRequest
0 голосов
/ 19 ноября 2018

Я знаю, что этот вопрос задают много раз, но я действительно не могу исправить эту проблему формы ввода для моего случая.

Моя форма x_train == (5523000, 13) // (13 временных рядов длиной 5523000)

Моя форма y_train == (5523000, 1)

количество классов == 2

Чтобы изменить форму x_train и y_train:

x_train= x_train.values.reshape(27615,200,13)  # 5523000/200 = 27615
y_train= y_train.values.reshape((5523000,1))   # I know I have a problem here but I dont know how to fix it

Вот моя сеть lstm:

def lstm_baseline(x_train, y_train):
    batch_size=200
    model = Sequential()
    model.add(LSTM(batch_size, input_shape=(27615,200,13),
                   activation='relu', return_sequences=True))
    model.add(Dropout(0.2))

    model.add(LSTM(128, activation='relu'))
    model.add(Dropout(0.1))

    model.add(Dense(32, activation='relu'))
    model.add(Dropout(0.2))

    model.add(Dense(1, activation='softmax'))

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

    model.fit(x_train,y_train, epochs= 15)

    return model

Всякий раз, когда я запускаюкод Я получаю эту ошибку:

ValueError: Вход 0 несовместим со слоем lstm_10: ожидается ndim = 3, найдено ndim = 4

Мой вопрос - что мне не хватаетВот?

PS: Идея проекта заключается в том, что у меня есть 13 сигналов, поступающих из 13 точек человеческого тела, я хочу использовать их для обнаружения определенного типа заболеваний (возбуждение).Используя LSTM, я хочу, чтобы моя модель определяла регионы, где у меня есть это возбуждение, на основе этих 13 сигналов.

.

В целом данные составляют 993 пациента, для каждого я использую 13 сигналов для выявления областей расстройства.

, если вы хотите, чтобы я поместил данные в трехмерные измерения:

(500000 ,13, 993) # (nb_recods, nb_signals, nb_patient)

для каждого пациентаУ меня 500000 наблюдений за 13 сигналами.nb_patient - 993

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

Обновление: вот примерные данные одного пациента.

Вот часть моих данных на первые 2000 строк

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Хорошо, я сделал некоторые изменения в вашем коде. Во-первых, я до сих пор не понимаю, что означает «200» в вашей попытке изменить ваши данные, поэтому я дам вам рабочий код и посмотрим, сможете ли вы его использовать или изменить, чтобы заставить ваш код работать , Размер ваших входных данных и ваших целей, должны совпадать. У вас не может быть входного x_train с 27615 строками (что означает x_train [0] = 27615) и целевого набора y_train с 5523000 значениями.

Я взял первые две строки из примера данных, который вы предоставили для этого примера:

x_sample = [[-17,  -7, -7,  0, -5, -18, 73, 9, -282, 28550, 67],
            [-21, -16, -7, -6, -8,  15, 60, 6, -239, 28550, 94]]

y_sample = [0, 0]

Давайте изменим x_sample :

x_train = np.array(example)

#Here x_train.shape = (2,11), we want to reshape it to (2,11,1) to
#fit the network's input dimension
x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], 1)

Вы используете категориальную потерю, поэтому вы должны изменить свои цели на категориальные (chek https://keras.io/utils/)

y_train = np.array(target)
y_train = to_categorical(y_train, 2)

Теперь у вас есть две категории, я предположил две категории, так как в данных, которые вы указали, все целевые значения равны 0, поэтому я не знаю, сколько возможных значений может принять ваша цель. Если ваша цель может принимать 4 возможных значения, то число категорий в функции to_categorical будет равно 4. Каждый вывод вашего последнего плотного слоя будет представлять категорию и значение этого выхода, вероятность того, что ваши входные данные принадлежат этой категории .

Теперь нам просто нужно немного изменить модель LSTM:

def lstm_baseline(x_train, y_train):
   batch_size = 200
   model = Sequential()
   #We are gonna change input shape for input_dim
   model.add(LSTM(batch_size, input_dim=1,
                  activation='relu', return_sequences=True))
   model.add(Dropout(0.2))

   model.add(LSTM(128, activation='relu'))
   model.add(Dropout(0.1))

   model.add(Dense(32, activation='relu'))
   model.add(Dropout(0.2))

   #We are gonna set the number of outputs to 2, to match with the
   #number of categories
   model.add(Dense(2, activation='softmax'))

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

   model.fit(x_train, y_train, epochs=15)

return model
0 голосов
/ 21 ноября 2018

Вы можете попробовать некоторые модификации, подобные этой ниже:

x_train = x_train.reshape(1999, 1, 13)
# double-check dimensions
x_train.shape

def lstm_baseline(x_train, y_train, batch_size):
    model = Sequential()
    model.add(LSTM(batch_size, input_shape=(None, 13),
                   activation='relu', return_sequences=True))
    model.add(Dropout(0.2))

    model.add(LSTM(128, activation='relu'))
    model.add(Dropout(0.1))

    model.add(Dense(32, activation='relu'))
    model.add(Dropout(0.2))

    model.add(Dense(1, activation='softmax'))

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

    return model    
...