Обучение Keras LSTM. Как сформировать мои входные данные?
У меня есть набор данных 3000 наблюдений. Каждое наблюдение состоит из 3 временных рядов длиной 200 образцов. В качестве выхода у меня есть 5 классов меток.
Поэтому я строю поезд в виде тестовых наборов следующим образом:
test_split = round(num_samples * 3 / 4)
X_train = X_all[:test_split, :, :] # Start upto just before test_split
y_train = y_all[:test_split]
X_test = X_all[test_split:, :, :] # From test_split to end
y_test = y_all[test_split:]
# Print shapes and class labels
print(X_train.shape)
print(y_train.shape)
> (2250, 200, 3)
> (22250, 5)
Я строю свою сеть, используя функциональный API Keras:
from keras.models import Model
from keras.layers import Dense, Activation, Input, Dropout, concatenate
from keras.layers.recurrent import LSTM
from keras.constraints import maxnorm
from keras.optimizers import SGD
from keras.callbacks import EarlyStopping
series_len = 200
num_RNN_neurons = 64
ch1 = Input(shape=(series_len, 1), name='ch1')
ch2 = Input(shape=(series_len, 1), name='ch2')
ch3 = Input(shape=(series_len, 1), name='ch3')
ch1_layer = LSTM(num_RNN_neurons, return_sequences=False)(ch1)
ch2_layer = LSTM(num_RNN_neurons, return_sequences=False)(ch2)
ch3_layer = LSTM(num_RNN_neurons, return_sequences=False)(ch3)
visible = concatenate([
ch1_layer,
ch2_layer,
ch3_layer])
hidden1 = Dense(30, activation='linear', name='weighted_average_channels')(visible)
output = Dense(num_classes, activation='softmax')(hidden1)
model = Model(inputs= [ch1, ch2, ch3], outputs=output)
# Compile model
model.compile(loss='categorical_crossentropy', optimizer=SGD(), metrics=['accuracy'])
monitor = EarlyStopping(monitor='val_loss', min_delta=1e-4, patience=5, verbose=1, mode='auto')
Затем я пытаюсь соответствовать модели:
# Fit the model
model.fit(X_train, y_train,
epochs=epochs,
batch_size=batch_size,
validation_data=(X_test, y_test),
callbacks=[monitor],
verbose=1)
и я получаю следующую ошибку:
ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 3 array(s), but instead got the following list of 1 arrays...
Как мне изменить мои данные, чтобы решить проблему?
1 ответ
Вы волшебным образом предполагаете один вход с 3 временными рядами X_train
будет разделен на 4 канала и назначен на разные входы. Ну, этого не происходит, и именно на это жалуется ошибка. У вас есть 1 вход:
ch123_in = Input(shape=(series_len, 3), name='ch123')
latent = LSTM(num_RNN_neurons)(ch123_in)
hidden1 = Dense(30, activation='linear', name='weighted_average_channels')(latent)
Объединяя ряды в единый LSTM, модель может собирать отношения и во временные ряды. Теперь ваша целевая форма должна быть y_train.shape == (2250, 5)
первое измерение должно совпадать X_train.shape[0]
,
Еще один момент, у вас есть Dense
слой с линейной активацией, который практически бесполезен, так как не обеспечивает никакой нелинейности. Возможно, вы захотите использовать нелинейную функцию активации, например, relu.