如何结合独立的CNN和LSTM网络

How to combine independent CNN and LSTM networks

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

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

我附上一个使用两个分支(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 等。