lstm自动编码器不使用潜在空间的完整维度进行降维



我正在尝试训练一个lstm自动编码器,将输入空间转换为潜在空间,然后将其可视化,我希望在潜在空间中找到一些有趣的模式。输入是来自9个传感器的数据。它们将被转换成一个三维空间。

问题是,当我运行代码时,有时数据会转换为三维,有时只使用一维或二维。其余尺寸为零。

这是自动编码器im使用:

class Autoencoder(Model):
def __init__(self, latent_dim):
super(Autoencoder, self).__init__()
self.latent_dim = latent_dim   

self.encoder = Sequential([
layers.LSTM(features, activation='relu', input_shape=(time,features), return_sequences=True),
layers.Dropout(0.3),
layers.LSTM(latent_dim, activation='relu', return_sequences=False),
layers.RepeatVector(time)
]) 

self.decoder = Sequential([
layers.LSTM(latent_dim, activation='relu', return_sequences=True),
layers.Dropout(0.3),
layers.LSTM(features, activation='relu', return_sequences=True),
layers.TimeDistributed(Dense(features))
]) 
def call(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return decoded

autoencoder = Autoencoder(latent_dim) 
autoencoder.compile(optimizer='adam', loss='mae')
history = autoencoder.fit(X, X, epochs=10, validation_split=0.2, shuffle=False)
encoded = autoencoder.encoder(X)
encoded_reshaped = pd.DataFrame(encoded.numpy().reshape(-1, latent_dim))

这是潜在的空间,正如你所看到的,编码器只使用了一个维度来表示数据

0         1    2
0      0.0  2.164718  0.0
1      0.0  2.056577  0.0
2      0.0  2.020535  0.0
3      0.0  2.134846  0.0
4      0.0  2.109566  0.0
5      0.0  1.902232  0.0
6      0.0  1.919019  0.0
7      0.0  2.021480  0.0
8      0.0  1.839327  0.0
9      0.0  1.740795  0.0
10     0.0  2.008053  0.0
11     0.0  1.966692  0.0
12     0.0  1.899480  0.0
13     0.0  1.811787  0.0
14     0.0  2.182250  0.0
15     0.0  2.146597  0.0
16     0.0  1.908313  0.0

有人知道原因以及如何避免这种情况发生吗?当仅使用一维时

当使用三个维度时

问题可能来自所使用的激活函数:relu激活将设置为零所有负值(relu(x)=max(0,x)),因此,如果您的潜在空间表示"需要";要使用负值,您将在应用激活步骤后松开它们。

尝试使用另一个允许负值的激活函数,或者通过更改阈值来修改relu函数。如果您正在使用keras,您可以在此处查看激活选项https://keras.io/api/layers/activations/

我也有同样的问题,它为我解决了!

相关内容

  • 没有找到相关文章

最新更新