Сложно настроить базовый LSTM на основе ввода массива - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь настроить LSTM, чтобы снабдить его своими массивными функциями и метками.

Вот моя первая попытка:

nb_features =len(seq_cols)
print("initial shape:", X_train.shape)
print("nb features", nb_features)
# X_train = X_train.reshape(X_train.shape + (1,))

print("Seq length ", seq_length)
print('New shape ', X_train.shape)

model = Sequential()

model.add(LSTM(
         input_shape=(nb_features, 1),
         units=100,
         return_sequences=True))
model.add(Dropout(0.2))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=200, verbose=1,
          callbacks = [EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto')])

Что дает мне вывод

initial shape: (175850, 4)
nb features 4
Seq length  50
New shape  (175850, 4)

    ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-99-50959413cb62> in <module>()
      1 model.fit(X_train, y_train, epochs=10, batch_size=200, verbose=1,
----> 2           callbacks = [EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto')])

2 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    126                         ': expected ' + names[i] + ' to have ' +
    127                         str(len(shape)) + ' dimensions, but got array '
--> 128                         'with shape ' + str(data_shape))
    129                 if not check_batch_axis:
    130                     data_shape = data_shape[1:]

ValueError: Error when checking input: expected lstm_28_input to have 3 dimensions, but got array with shape (175850, 4)

Итак, я пытаюсь изменить форму, раскомментировав строку 4

nb_features =len(seq_cols)
print("initial shape:", X_train.shape)
print("nb features", nb_features)
X_train = X_train.reshape(X_train.shape + (1,))

print("Seq length ", seq_length)
print('New shape ', X_train.shape)

model = Sequential()

model.add(LSTM(
         input_shape=(nb_features, 1),
         units=100,
         return_sequences=True))
model.add(Dropout(0.2))

model.add(Dense(units=1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=200, verbose=1,
          callbacks = [EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto')])

, которая теперь дает мне ошибку, что у меня неправильные размеры

initial shape: (175850, 4)
nb features 4
Seq length  50
New shape  (175850, 4, 1)

ValueError: Error when checking input: expected lstm_28_input to have 3 dimensions, but got array with shape (175850, 4)

Я думаю, мне просто интересно делать случайные изменения. Может кто-нибудь, пожалуйста, дайте мне понять, что я пропускаю из головоломки? Я новичок в этой области, и ошибки мне не очень помогают.

P.S: X_train - это массив numy

1 Ответ

1 голос
/ 09 июня 2019

Keras input_shape игнорирует первое измерение, потому что оно указывает количество обучающих примеров, м.Это потому, что Keras может работать с любым количеством обучающих примеров, он заботится только о фактических входных измерениях.

Например, input_shape = (nb_features, 1) = (4,1) означает, что он ожидаетвход должен быть (None, 4, 1), где none - количество обучающих примеров.Вы также можете увидеть это, набрав model.summary () после компиляции, но до того, как вы ее укомплектуете.

Это 3 измерения, поэтому возникает ошибка «ожидается, что lstm_28_input будет иметь 3 измерения».Вы кормите его (175850, 4), который представляет собой двумерный массив.

...