我有 100 万个序列,我试图将其分类为 0 或 1。结果相当平衡(0 类:70%,1 类:30%)。最大序列长度为 50,并且我已用带零的序列进行后填充。有 100 个独特的序列符号。嵌入长度为 30。它是一个在两个输出上训练的 LSTM 神经网络(一个是主输出节点,另一个在 LSTM 之后)。代码如下。
作为健全性检查,我运行了三个版本:一个是随机化结果标签(我预计性能会很糟糕),另一个是标签是正确的,但我随机化每个序列中的事件序列,但结果标签是正确的(我也期望表现不佳),最后是一个一切都保持原样的标签(我期望表现良好)。
相反,我发现了以下内容:
- 打乱标签:准确度 = 69.5%(模型预测每个序列均为 0 类)
- 打乱序列符号:准确度 = 88%!
- 没有任何内容被打乱:准确率 = 90%
你对此有何看法?我能想到的是,从分析序列中获得的信号很少,也许大部分信号来自序列中符号的存在或不存在。也许 RNN 和 LSTM 在这里太过分了?
# Input 1: event type sequences
# Take the event integer sequences, run them through an embedding layer to get float vectors, then run through LSTM
main_input = Input(shape =(max_seq_length,), dtype = 'int32', name = 'main_input')
x = Embedding(output_dim = embedding_length, input_dim = num_unique_event_symbols, input_length = max_seq_length, mask_zero=True)(main_input)
lstm_out = LSTM(32)(x)
# Auxiliary loss here from first input
auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
# An abitrary number of dense, hidden layers here
x = Dense(64, activation='relu')(lstm_out)
# The main output node
main_output = Dense(1, activation='sigmoid', name='main_output')(x)
## Compile and fit the model
model = Model(inputs=[main_input], outputs=[main_output, auxiliary_output])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'], loss_weights=[1., 0.2])
print(model.summary())
np.random.seed(21)
model.fit([train_X1], [train_Y, train_Y], epochs=1, batch_size=200)
最佳答案
假设您已经研究过 LSTM 的大小,您的结论似乎是合理的。除此之外,很难说,因为这取决于数据集是什么。例如,较短的序列可能更难以预测,并且如果大多数序列都很短,那么这也将支持结论。
尝试截断序列长度(例如前 25 个条目)也是值得的。
关于tensorflow - 序列元素打乱后的奇怪序列分类性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50159492/