python - 3向量级数LSTM不能突破0.5精度

标签 python tensorflow machine-learning keras lstm

我有一个 3 向量玩具系列数据集,格式为

[[0, 0, 2], [1, 0, 3], [2, 0, 4], [3, 0, 2], [4, 0, 3], [5, 0, 4] ... [10001, 0, 4]]

x 总是增加 1,y 总是 0,z 重复 2、3、4。我想在给定起始序列的情况下预测序列中的下一个 3 向量。我使用的窗口大小为 32,但也尝试过 256,结果相同。

在将每个维度发送到模型之前,我将其标准化为 0 到 1 之间。无论我添加多少层、多少单元、多少特征,模型的准确度都不会超过 0.5 左右,我想了解为什么。

我对第 33 项的预测是 [4973.29 0.000 3.005] 而实际值是 [32 0 4] 我不知道这是否是错误的因为 0.5 的精度或者其他原因。

我的模型如下所示:

# X_modified shape: (9970, 32, 3)
# Y_modified shape: (9970, 3)

model = Sequential()

model.add(LSTM(units=128, input_shape=(X_modified.shape[1], X_modified.shape[2]), return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(units=128, return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(units=128))
model.add(Dropout(0.2))

model.add(Dense(Y_modified.shape[1], activation='softmax'))

model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')

以下是摘要和图表:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_204 (LSTM)              (None, 32, 128)           67584     
_________________________________________________________________
dropout_199 (Dropout)        (None, 32, 128)           0         
_________________________________________________________________
lstm_205 (LSTM)              (None, 32, 128)           131584    
_________________________________________________________________
dropout_200 (Dropout)        (None, 32, 128)           0         
_________________________________________________________________
lstm_206 (LSTM)              (None, 128)               131584    
_________________________________________________________________
dropout_201 (Dropout)        (None, 128)               0         
_________________________________________________________________
dense_92 (Dense)             (None, 3)                 387       
=================================================================
Total params: 331,139
Trainable params: 331,139
Non-trainable params: 0
_________________________________________________________________
None

enter image description here

非常感谢任何见解,谢谢!

最佳答案

现在您的模型已设置为分类器,但从您的描述来看,您似乎正在尝试解决回归问题。如果我有误解,请告诉我。

尝试将最终密集层的激活更改为“线性”。 还将损失函数更改为“mean_squared_error”或其他回归损失。 https://keras.io/losses/

您将无法获得回归问题的准确度分数,相反,您将看到均方误差和您添加的任何其他回归指标,例如平均平均误差的“mae”,这对于更易于理解的错误非常有用数量。

您应该能够使用小型网络来解决此问题,因此无需增加层数和单元数。

回复您的评论:

如果时间序列彼此不交互,那么实际上没有任何理由同时预测它们,因此您必须首先做出决定。以下是您如何将它们更改为您想要的分类问题。

根据您的描述,我看不到将 X 轴视为分类问题的方法,因为它只是一个不断增加的数字。

对于 Y 轴,您可以让网络预测下一个点是否为零。因此,您可能希望该轴的标签为 0 或 1,具体取决于该点是否为 0。最终的激活将是一个具有 1 个单元和 sigmoid 激活的密集层。但是,如果非零值的出现完全随机,则无法准确预测。

对于 Z 轴,您可以将其视为多类分类问题。您的标签宽度为 3,其中正确的数字是 1 个热编码。因此,如果下一个 Z 轴值为 2,那么您的标签将为 [1, 0, 0]。最后一层应该是具有 3 个单元的致密层。激活应该是 softmax,因为您希望它选择 3 个选项中的 1 个,这与可以选择这三个选项的任意组合的 sigmoid 激活相反。

如果您使用 Kerases 功能模型 API 进行多输出,您可以在一个网络中预测所有这些。

关于python - 3向量级数LSTM不能突破0.5精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51145007/

相关文章:

python - 如何在 Python 中将参数传递给导入的脚本

python - 使用 For 循环重写 numpy.random.binomial

python - 是否有可应用于分类数据输入的特征选择算法?

python - model.fit() 是否在每个时期后重置指标?如何手动重置指标?

python - Bazel 构建 Retrainer 失败

python - 显示 SVM 中特征重要性的 Python 代码是什么?

python - 查找比较两个巨大但已排序文件的行的有效方法

python - 使用 whoosh 进行智能字符串搜索 python(也许)

python - 在 Keras 上使用回调 Tensorboard 时出现 AttributeError : 'Model' object has no attribute 'run_eagerly'

python - 值错误 : in user code while using keras model in R