【发布时间】:2020-12-21 16:45:21
【问题描述】:
我正在测试 LSTM 自动编码器在 2D 输入异常检测方面的不同实现。 我的问题不是关于代码本身,而是关于理解每个网络的底层行为。
两种实现都具有相同数量的单元 (16)。模型 2 是一个“典型的”seq to seq 自动编码器,编码器的最后一个序列重复“n”次以匹配解码器的输入。 我想了解为什么模型 1 似乎很容易超过模型 2,以及为什么模型 2 不能做得比平均水平更好?
模型 1:
class LSTM_Detector(Model):
def __init__(self, flight_len, param_len, hidden_state=16):
super(LSTM_Detector, self).__init__()
self.input_dim = (flight_len, param_len)
self.units = hidden_state
self.encoder = layers.LSTM(self.units,
return_state=True,
return_sequences=True,
activation="tanh",
name='encoder',
input_shape=self.input_dim)
self.decoder = layers.LSTM(self.units,
return_sequences=True,
activation="tanh",
name="decoder",
input_shape=(self.input_dim[0],self.units))
self.dense = layers.TimeDistributed(layers.Dense(self.input_dim[1]))
def call(self, x):
output, hs, cs = self.encoder(x)
encoded_state = [hs, cs] # see https://www.tensorflow.org/guide/keras/rnn
decoded = self.decoder(output, initial_state=encoded_state)
output_decoder = self.dense(decoded)
return output_decoder
模型 2:
class Seq2Seq_Detector(Model):
def __init__(self, flight_len, param_len, hidden_state=16):
super(Seq2Seq_Detector, self).__init__()
self.input_dim = (flight_len, param_len)
self.units = hidden_state
self.encoder = layers.LSTM(self.units,
return_state=True,
return_sequences=False,
activation="tanh",
name='encoder',
input_shape=self.input_dim)
self.repeat = layers.RepeatVector(self.input_dim[0])
self.decoder = layers.LSTM(self.units,
return_sequences=True,
activation="tanh",
name="decoder",
input_shape=(self.input_dim[0],self.units))
self.dense = layers.TimeDistributed(layers.Dense(self.input_dim[1]))
def call(self, x):
output, hs, cs = self.encoder(x)
encoded_state = [hs, cs] # see https://www.tensorflow.org/guide/keras/rnn
repeated_vec = self.repeat(output)
decoded = self.decoder(repeated_vec, initial_state=encoded_state)
output_decoder = self.dense(decoded)
return output_decoder
我在数据样本(89, 1500, 77) 上为这两个模型拟合了 200 个 Epochs,每个输入都是(1500, 77) 的二维数组。以及测试数据(10,1500,77)。两个模型都只有16 units。
这里还是自动编码器对测试数据的一个特征的结果。
结果模型 1:(黑线为真实,红色为重建图像)
结果模型 2:
我知道第二个更严格,因为来自输入序列的所有信息都被压缩到一个步骤中,但我仍然感到惊讶的是,它几乎无法比预测平均值做得更好。
另一方面,我觉得模型 1 往往更容易受到新数据的“影响”,而没有回馈输入。请参阅下面的模型 1 示例,其中输入为平线:
PS:我知道这种模型的数据不多,我有更多可用的数据,但在这个阶段我只是在试验并试图建立我的理解。
PS 2:两个模型都没有过度拟合他们的数据,训练和验证曲线几乎就像教科书一样。
有谁能解释为什么在行为方面存在如此大的差距?
谢谢
【问题讨论】:
-
你是如何分割训练集/测试集的?随机还是基于时间序列?
-
@jonnor 拆分尊重序列,对数据进行排序,然后训练基于前 90% 并测试剩余的 10%。
标签: python tensorflow lstm autoencoder anomaly-detection