3矢量系列LSTM不能超过0.5精度

时间:2018-07-02 23:54:28

标签: 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

任何见解都将受到感激,谢谢!

1 个答案:

答案 0 :(得分:3)

现在,您的模型已设置为分类器,但是从您的描述看来,您似乎正在尝试解决回归问题。让我知道我是否误会了。

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

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

您应该可以使用小型网络来解决此问题,因此不必增加层数和单位数。

针对您的评论:

如果时序不互相影响,那么实际上没有任何理由同时预测它们,因此您必须先决定。这是将它们更改为所需分类问题的方法。

根据您的描述,我看不到将X轴构造为分类问题的方法,因为它只是数量的增加。

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

对于Z轴,您可以将其框架化为多类分类问题。标签的宽度为3,其中正确的数字是一个热编码。因此,如果下一个Z轴值为2,则您的标签将为[1、0、0]。最后一层应该是3个单元的密集层。激活应该是softmax,因为您希望它选择3个选项中的1个,如S型激活那样,可以选择这3个选项的任意组合。

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