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

Tensorflow 如何结合独立的CNN和LSTM网络,tensorflow,time-series,lstm,tf.keras,cnn,Tensorflow,Time Series,Lstm,Tf.keras,Cnn,我目前正在使用tensorflow和keras进行时间序列预测。我建立了一个CNN,它的表现相当好,一个基本的LSTM,它的节目效果也相当好。现在我想把这两个网络的优势结合起来。我的第一个想法是将LSTM叠加在CNN上,但不管结果如何,我意识到我希望两个网络都能看到输入数据,这样CNN就可以了解特征,而LSTM应该关注与时间相关的方面。尝试建造这种建筑的良好开端是什么?我还想知道连接两个网络的输出是否有意义?我经常看到这一点,但我不明白为什么这会有用。我总是想连接两个不同的时间序列,这根本没有意

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

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

将tensorflow导入为tf
类CNNLSTMTimeseries(tf.keras.Model):
定义初始化(自,n类):
超级(cnnlstmtimeries,self)。\uuuu init
self.conv1=tf.keras.layers.Conv1D(64,7,padding='same',
激活=无)
self.bn1=tf.keras.layers.BatchNormalization()
self.conv2=tf.keras.layers.Conv1D(64,5,padding='same',
激活=无)
self.bn2=tf.keras.layers.BatchNormalization()
self.lstm=tf.keras.layers.lstm(64,返回序列=True)
self.classifier=tf.keras.layers.density(n_类,activation='softmax'))
def呼叫(自我,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],轴=-1)
x=tf.减少平均值(x,轴=1)#平均所有时间步
返回自分类器(x)
时间步长=16
特征=32
型号=CNNLSTMTimeseries(3)
打印(模型(tf.random.uniform([1,TIMESTEPS,FEATURES])).shape)
这个示例非常简单,可能无法作为一个经过充分研究的体系结构工作。 您应该修改示例并添加最大池、退出等。

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

将tensorflow导入为tf
类CNNLSTMTimeseries(tf.keras.Model):
定义初始化(自,n类):
超级(cnnlstmtimeries,self)。\uuuu init
self.conv1=tf.keras.layers.Conv1D(64,7,padding='same',
激活=无)
self.bn1=tf.keras.layers.BatchNormalization()
self.conv2=tf.keras.layers.Conv1D(64,5,padding='same',
激活=无)
self.bn2=tf.keras.layers.BatchNormalization()
self.lstm=tf.keras.layers.lstm(64,返回序列=True)
self.classifier=tf.keras.layers.density(n_类,activation='softmax'))
def呼叫(自我,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],轴=-1)
x=tf.减少平均值(x,轴=1)#平均所有时间步
返回自分类器(x)
时间步长=16
特征=32
型号=CNNLSTMTimeseries(3)
打印(模型(tf.random.uniform([1,TIMESTEPS,FEATURES])).shape)
这个示例非常简单,可能无法作为一个经过充分研究的体系结构工作。
您应该修改示例并添加最大池、辍学等。

谢谢,我将对此进行研究。目前我正在尝试你的concat方法。我的模型在卷积层之间包含MaxPoolg1d,这减少了时间维度。然而,LSTM的输出具有完整的时间维度,因此我在两个输出上使用了GlobalMapooling1D来获得concat的相同维度。有没有其他解决方案,这样我就不需要从LSTM中丢失信息了?关于你关于使用注意力的建议,我目前正在努力将这个概念应用到我的timeseries问题中。我结合seq2seq NLP阅读了很多关于它的文章,但我未能修改它以将其应用于我的需要。我读到的所有文章都没有提供任何代码示例。我的目标是使用TxD矩阵预测输入矩阵中未包含的目标功能。谢谢,我将对此进行研究。目前我正在尝试你的concat方法。我的模型在卷积层之间包含MaxPoolg1d,这减少了时间维度。但是,LSTM的输出具有完整的时间维度,