Использование уровней пула в автоэнкодере LSTM - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь создать шумоподавляющий автоэнкодер LSTM для использования на длинных временных рядах (100 000+ точек) в Python с использованием Tensorflow. Я уклонился от типичной структуры LSTM Autoencoder, где информация на последнем шаге времени сворачивается в один вектор и затем подается в декодер. Причина, по которой я избежал этого, состоит в том, что для достижения разумного коэффициента сжатия в кодировании на конечном уровне кодирования потребовалось бы много нейронов.

Моя архитектура использует максимальное количество уровней пула после каждого уровня LSTM, чтобы распространить сжатие по сериям. длина и количество нейронов. Кодированное представление затем принимается за последовательность векторов, выводимых последним уровнем кодера, а не только за конечный вектор. Я тренировал модель, используя оптимизатор Адама. Возможно, эту архитектуру лучше объяснить следующим кодом:

series_input = tf.keras.layers.Input(shape=(2**14, 64), name='series_input')

x = tf.keras.layers.Bidirectional( tf.keras.layers.LSTM(16, return_sequences=True, activation='relu'))(x)
x = tf.keras.layers.MaxPool1D(4)(x)
x = tf.keras.layers.Bidirectional( tf.keras.layers.LSTM(8, return_sequences=True, activation='relu'))(x)
encoded = tf.keras.layers.MaxPool1D(4)(x)

x = tf.keras.layers.Bidirectional( tf.keras.layers.LSTM(8, return_sequences=True, activation='relu'))(encoded)
x = tf.keras.layers.UpSampling1D(4)(x)
x = tf.keras.layers.Bidirectional( tf.keras.layers.LSTM(16, return_sequences=True, activation='relu'))(x)
x = tf.keras.layers.UpSampling1D(4)(x)
x = tf.keras.layers.Bidirectional( tf.keras.layers.LSTM(1, return_sequences=True, activation='relu'))(x)

decoded = tf.keras.layers.Dense(1, activation='relu')(x)

autoencoder = tf.keras.Model(inputs=[series_input], outputs=[decoded])

autoencoder.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3,
                                                     clipvalue=10,
                                                     decay=0.005),
                        loss='mean_squared_error',
                        metrics=['accuracy'])

Мои первоначальные попытки обучить модель, похоже, показывают, что это жизнеспособная архитектура, способная изучать разумные стратегии шумоподавления. Проблема, однако, заключается в том, что эта конфигурация резко замедляет процесс обучения. Чтобы добавить немного цвета, он обучается значительно медленнее, чем другие сложенные структуры LSTM - вариация этой архитектуры заняла около суток, чтобы завершить одну эпоху при работе на 4 V100. Что является причиной этого? Что можно сделать, чтобы улучшить вычислительную эффективность этой модели? Я открыт для любых предложений и рад их услышать. Спасибо, что нашли время, чтобы дойти до конца этого поста.

...