首页 > 解决方案 > 我应该在自动编码器中使用最后一层的激活函数和损失函数来重建一系列事件?[凯拉斯]

问题描述

我的数据集是一个大小为 (M,t,N) 的 3D 数组,其中 M 是样本数,t 是序列中的时间步数,N 是在时间 t 可能发生的事件数。通过选择一个特定的 M,我们有一个大小为 (t,N) 的二维数组,其中每一行是一个时间步长,每一列是一个事件。如果该事件在时间 t 发生,则每列设置为 1,否则设置为 0。在任何给定时间步长上只能发生 1 个事件。

我想尝试构建一个用于异常检测的自动编码器,在我阅读的教程和博客中,最后一个激活层是“relu”,损失函数是“mse”。但是由于我试图基本上用 N 个类重建一个分类,“softmax”作为最后一层和“categorical_crossentropy”会更好吗?

inputs = Input(shape = (timesteps,n_features))
# Encoder
lstm_enc_1 = LSTM(32, activation='relu', input_shape=(timesteps, n_features), return_sequences=True)(inputs)
lstm_enc_2 = LSTM(latent_dim, activation='relu', return_sequences=False)(lstm_enc_1)
repeater = RepeatVector(timesteps)
# Decoder
lstm_dec_1 = LSTM(latent_dim, activation='relu', return_sequences=True)
lstm_dec_2 = LSTM(32, activation='relu', return_sequences=True)
time_dis = TimeDistributed(Dense(n_features,activation='softmax')) #<-- Does this make sense here?

z = repeater(lstm_enc_2)
h = lstm_dec_1(z)
decoded_h = lstm_dec_2(h)
decoded = time_dis(decoded_h)

ae = Model(inputs,decoded)
ae.compile(loss='categorical_crossentropy', optimizer='adam') #<-- Does this make sense here?

还是我应该,出于某种原因,仍然使用“relu”和“mse”作为最后的激活函数和损失函数?

任何输入表示赞赏。

标签: pythonkerasneural-networktime-seriesautoencoder

解决方案


当我正确阅读时,N 是单热编码的,听起来您想要进行分类,而不是回归。

对于 beeing y one-hot 编码,使用 categorical_crossentropy 是正确的。如果 y 中的类多于 4,则可以使用整数编码并使用 sparse_categorical_crossentropy,它会在途中将 y 值解码为单热矩阵。

mse 更适合用于回归。

作为最后的动作,既然你有一个分类,你可能想要使用 softmax,它为你的每个 y 类输出一个概率。

据我所知,你通常不使用 relu 是最后一层,如果你有回归任务,你一般更喜欢 sigmoid。


推荐阅读