我的数据集是一个大小为(M,t,N(的3D数组,其中M是样本数,t是序列中的时间步数,N是时间t可能发生的事件数。如果事件发生在时间t,则每列都设置为1,否则设置为0。在任何给定的时间步长只能发生一个事件。
我想尝试构建一个用于异常检测的自动编码器,在我阅读的教程和博客中,最后一个激活层是"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"one_answers"mse"作为最后一个激活函数和损失函数吗?
欢迎提供任何意见。
如果我读对了,N是一个热编码,听起来你想进行分类,而不是回归。
对于一个热编码,使用categorical_crossentry是正确的。如果y中的类多于4,则可以使用整数编码,并使用spare_categorical_crossentry,它会在途中将y值解码为一个热矩阵。
mse更好地用于回归。
作为最后一次活动,由于您有一个分类,您可能想要使用softmax,它为您的每个y类输出一个概率。
据我所知,你通常不使用relu是最后一层,如果你有回归任务,你通常更喜欢sigmoid。