Потеря / Точность плоха с использованием LSTM Autoencoders - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь создать автокодеры LSTM для данных временных рядов.Моя цель состоит в том, чтобы использовать закодированное представление этих последовательностей, которые генерируются автоэнкодером, и классифицировать их.Длина всех последовательностей действительно велика (около 1М), и у меня 9 таких последовательностей.Поэтому я использую подходящие генераторы вместе с LSTM для включения моих данных.Тем не менее, моя функция потерь не сходится, и точность действительно плоха для автокодеров LSTM.Вот часть моего кода.

encoder_input = Input(shape=(None, input_dim))
encoder_output = LSTM(latent_space)(encoder_input)
decoder_input = Lambda(repeat_vector, output_shape=(None, latent_space))([encoder_output, encoder_input])
decoder_out = LSTM(latent_space, return_sequences=True)(decoder_input)
decoder_output = TimeDistributed(Dense(input_dim))(decoder_out)

autoencoder = Model(encoder_input, decoder_output)
encoder = Model(encoder_input, encoder_output)

autoencoder.compile(optimizer="Adam", loss="mse", metrics=["accuracy"])

def generator(X_data, window_size, step_size):

    size_data = X_data.shape[0]
    # print('size:',size_data)

    while 1:

       for k in range(0, size_data - window_size, step_size):
                x_batch = X_data[k:k + window_size, :]
                x_batch = x_batch.reshape(1,x_batch.shape[0], x_batch.shape[1])
                # print(x_batch.shape)
                y_batch = x_batch
                # print("i = " + str(i))
                yield x_batch, y_batch
                # print('value: ', x_batch, y_batch)


sliding_window_size = 200
step_size_of_sliding_window = 200
n_epochs = 50


for epoch in range(n_epochs):
     print("At Iteration: " + str(epoch))
     losses = []
     csv_logger = CSVLogger('log.csv', append=True, separator=';')
     loss = autoencoder.fit_generator(generator(X_tr,sliding_window_size, step_size_of_sliding_window),steps_per_epoch=shots_train,epochs=1,verbose=2,callbacks=[csv_logger])
     losses.append(loss.history['loss'])

Вкратце я получаю следующие результаты:

Epoch 1/1
- 6s - loss: 0.0319 - acc: 0.5425
At Iteration: 6
Epoch 1/1
- 6s - loss: 0.0326 - acc: 0.4555
At Iteration: 7
Epoch 1/1
- 6s - loss: 0.0301 - acc: 0.4865
At Iteration: 8
Epoch 1/1
- 6s - loss: 0.0304 - acc: 0.5020
At Iteration: 9
Epoch 1/1
- 6s - loss: 0.0313 - acc: 0.4780
At Iteration: 10
Epoch 1/1
- 6s - loss: 0.0313 - acc: 0.5090
At Iteration: 11
Epoch 1/1
- 6s - loss: 0.0313 - acc: 0.4675

Точность действительно плохая, и восстановленная последовательность также отличается.Как я могу улучшить то же самое?Я уже пытался использовать разные размеры кода в LSTM.

...