我应该在自动编码器中使用最后一层的哪些激活函数和损失函数来重构事件序列? [凯拉斯]

问题描述

我的数据集是大小为(M,t,N)的3D数组,其中M是样本数,t是序列中的时间步数,N是时间可能发生的事件数t。通过选择一个特定的M,我们得到一个大小为(t,N)的2D数组,其中每一行都是一个时间步,每一列都是一个事件。如果该事件在时间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,return_sequences=False)(lstm_enc_1)
repeater = RepeatVector(timesteps)
# Decoder
lstm_dec_1 = LSTM(latent_dim,return_sequences=True)
lstm_dec_2 = LSTM(32,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”作为最后一个激活函数和丢失函数?

感谢任何输入。

解决方法

当我正确阅读时,N是一键编码的,听起来您想进行分类,而无需回归。

对于蜜蜂y一键编码,使用categorical_crossentropy是正确的。 如果y中的类多于4,则可以使用整数编码,并使用sparse_categorical_crossentropy,这将y值解码为一维矩阵。

mse更好地用于回归。

最后一种做法是,由于您已进行分类,因此您可能要使用softmax,它会为每个y类输出一个概率。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...