LSTM自动编码器噪声重建
我正在尝试建立一个用于时间序列压缩的LSTM自动编码器(目前只有一维,但也可以用于多维)。
先了解一下上下文:
我正在使用DeepNote开发模型,根据终端,安装的TensorFlow版本是带有Keras version 2.4.3
(Linux)的2.4.1
。
对于训练数据,我使用来自Intel Berkeley Research Lab Dataset的大约400.000个特定传感器的数据点作为训练数据,另外40.000个作为测试数据。所有数据点都是传感器收集的温度。数据被分成小序列(通常每个序列20个数据点),因此重塑后的数据的结果形状是看起来像(19456, 20, 1)
的(num_examples, sequence_length, dims)
。该模型将一次对这20个长度的序列中的一个进行预测。
这是模型的最简单形式的代码
n_dims = data.shape[2]
sample_size = data.shape[1]
inputs = Input(shape=(data.shape[1],n_dims), batch_size=batch_size)
# encoder
x = LSTM(n_dims, activation='relu', return_sequences=False, stateful=True, kernel_regularizer=regularizers.l2(regularization))(inputs)
# decoder
# Because sequences are not returned by encoder for (better) compression, have to be spread
# for decoder
x = RepeatVector(sample_size)(x)
decoding = LSTM(n_dims, activation='relu', return_sequences=True, stateful=True, kernel_regularizer=regularizers.l2(regularization))(x)
model = Model(inputs=inputs, outputs=decoding)
model.compile(optimizer=optimizer, loss=loss)
模型摘要:
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(1, 20, 1)] 0
_________________________________________________________________
lstm (LSTM) (1, 1) 12
_________________________________________________________________
repeat_vector (RepeatVector) (1, 20, 1) 0
_________________________________________________________________
lstm_1 (LSTM) (1, 20, 1) 12
=================================================================
Total params: 24
Trainable params: 24
Non-trainable params: 0
这是训练模型的代码:
model.fit(
x_train, x_train, # learns an identity function, thus x_train is label and input at the same time
epochs=num_epochs, batch_size=batch_size,
shuffle=False,
validation_data=(x_test, x_test),
verbose=verbosity
)
我的问题是:
该模型或多或少能够重建数据所遵循的趋势,然而,如果放大,就会出现这种奇怪的周期性行为。以下是模型输出的图像。在显示输出时,我将每个序列连接在一起,这样我就可以得到数据的原始形状。第一张图片显示的是放大的on 5000 data points,第二张图片是放大的on 100 data points
令人费解的是,句号的长度总是等于sequence length
(例如,上面代码中的20 )。如果我将其更改为40,这些凹凸将每50个数据点发生一次。我的理论是,这是由于LSTM单元在每个训练示例之后重新设置了它们的状态,因此无法“携带”任何状态或上下文到新的状态或上下文中。通过互联网读取,我将stateful
参数设置为true,因为这将阻止模型重置我所理解的状态。同样为了训练,我设置了shuffle=False
,这样序列的顺序是正确的。
转载请注明出处:http://www.txqp3.com/article/20230517/1166058.html