【问题标题】:How to combine independent CNN and LSTM networks如何结合独立的 CNN 和 LSTM 网络
【发布时间】:2020-11-04 20:02:27
【问题描述】:

我目前正在使用 tensorflow 和 keras 进行时间序列预测。我构建了一个性能相当好的 CNN 和一个基本的 LSTM,它也显示了相当好的结果。现在我正在考虑结合两个网络的优势。我的第一个想法是将 LSTM 堆叠在 CNN 之上,但无论结果如何,我都意识到我希望两个网络都能看到输入数据,以便 CNN 可以了解特征,而 LSTM 应该专注于与时间相关的方面。尝试构建这种架构的良好开端是什么?我还想知道连接两个网络的输出是否有意义?我经常看到这个,但我不明白为什么这会有用。我总是考虑连接两个不同的时间序列,这根本没有意义。我已经访问过似乎与我的问题相关的帖子,但这不是我想要的。独立

【问题讨论】:

    标签: tensorflow time-series lstm tf.keras conv-neural-network


    【解决方案1】:
    • 如果您使用 keras,您应该使用功能 API 或子类化 tf.keras.Model 来实现您的模型。
    • 连接两个网络的输出很好(就像不同的人看着同一个对象试图弄清楚它是什么 -> 结果会更准确)
    • 如果愿意,您可以尝试其他合并功能方法:
      • 具有可学习权重的加权和是一个很好且简单的选择
      • 使用注意力机制也可以给你很好的结果
    • 也许另一个不错的选择是分别训练两个网络,然后集成两个 世界的结果。

    我附上一个使用两个分支(CNN 和 LSTM)的简单模型示例

    import tensorflow as tf
    
    
    class CNNLSTMTimeseries(tf.keras.Model):
    
        def __init__(self, n_classes):
            super(CNNLSTMTimeseries, self).__init__()
    
            self.conv1 = tf.keras.layers.Conv1D(64, 7, padding='same', 
                                                activation=None)
            self.bn1 = tf.keras.layers.BatchNormalization()
    
            self.conv2 = tf.keras.layers.Conv1D(64, 5, padding='same',
                                                activation=None)
            self.bn2 = tf.keras.layers.BatchNormalization()
            
            self.lstm = tf.keras.layers.LSTM(64, return_sequences=True)
            
            self.classifier = tf.keras.layers.Dense(n_classes, activation='softmax')
    
        def call(self, x):
            conv_x = tf.nn.relu(self.bn1(self.conv1(x)))
            conv_x = tf.nn.relu(self.bn2(self.conv2(conv_x)))
    
            lstm_x = self.lstm(x)
    
            x = tf.concat([conv_x, lstm_x], axis=-1)
            x = tf.reduce_mean(x, axis=1) # Average all timesteps
    
            return self.classifier(x)
    
    
    TIMESTEPS = 16
    FEATURES = 32
    model = CNNLSTMTimeseries(3)
    print(model(tf.random.uniform([1, TIMESTEPS, FEATURES])).shape)
    

    这个例子非常简单,很可能不能作为一个经过深入研究的架构。 您应该修改示例并添加 Max pooling、dropouts 等。

    【讨论】:

    • 谢谢,我会调查的。目前我正在尝试你的 concat 方法。我的模型在卷积层之间包含 MaxPooling1D,从而减少了时间维度。但是 LSTM 的输出具有全时维度,因此我在两个输出上都使用了 GlobalMaxPooling1D 来获得相同的 concat 维度。是否有另一种解决方案,这样我就不需要从 LSTM 中丢失信息?
    • 关于您使用注意力的建议,我目前正在努力将这个概念应用于我的时间序列问题。我结合 seq2seq NLP 阅读了很多关于它的内容,但我未能对其进行修改以将其应用于我的需求。我阅读的所有论文都没有提供任何代码示例。我的目标是使用 TxD 矩阵来预测输入矩阵中不包含的目标特征。
    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    相关资源
    最近更新 更多