Tensorflow 在LSTM自动编码器中使用池层

Tensorflow 在LSTM自动编码器中使用池层,tensorflow,machine-learning,deep-learning,lstm,autoencoder,Tensorflow,Machine Learning,Deep Learning,Lstm,Autoencoder,我正在尝试使用Tensorflow在Python中创建一个用于长时间序列(100000多个点)的LSTM去噪自动编码器。我避开了典型的LSTM自动编码器结构,在该结构中,信息在最后一个时间步被卷成一个向量,然后输入解码器。我之所以避免这样做,是因为为了在编码中获得合理的压缩比,最终的编码层需要许多神经元 我的架构在每个LSTM层之后使用最大池层,将压缩扩展到序列长度和神经元数量。编码表示随后被视为编码器的最后一层输出的向量序列,而不仅仅是最终向量。我一直在使用Adam Optimizer对模型进

我正在尝试使用Tensorflow在Python中创建一个用于长时间序列(100000多个点)的LSTM去噪自动编码器。我避开了典型的LSTM自动编码器结构,在该结构中,信息在最后一个时间步被卷成一个向量,然后输入解码器。我之所以避免这样做,是因为为了在编码中获得合理的压缩比,最终的编码层需要许多神经元

我的架构在每个LSTM层之后使用最大池层,将压缩扩展到序列长度和神经元数量。编码表示随后被视为编码器的最后一层输出的向量序列,而不仅仅是最终向量。我一直在使用Adam Optimizer对模型进行训练。下面的代码可能更好地解释了这种体系结构

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上运行时,需要大约一天才能完成一个历元。这是什么原因?如何提高该模型的计算效率?我愿意接受任何建议,并很高兴听到它们。感谢您抽出时间来完成本文。

您尝试过CuDNNLSTM吗?它相当快,可以作为LSTM的替代品。但是它不支持退出正则化,并且激活函数也不能修改,因此它没有被广泛使用。这些单元的不灵活使我推迟使用它们,但根据你的建议,我替换了现有的LSTM单元。交换提供了所需的速度提升,谢谢!如果你决定写下来,我很乐意接受这个答案。