【问题标题】:Keras LSTM model not learning binary sequenceKeras LSTM 模型不学习二进制序列
【发布时间】:2017-10-07 13:38:04
【问题描述】:

我有一个整数 {0,1} 的二进制序列,我想创建一个 LSTM 模型来根据序列中的前 3 个数字预测下一个二进制项。

因此,例如,给定火车序列 [0,1,1,0,1,0,0,1],对于前 3 个数字 [0,1,1],模型应该输出数字 0,对于下一个序列 [1,1,0] 模型应该输出 1,下一个序列 [1,0,1] 输出 0,依此类推。

为此,考虑到上面的示例,我创建了以下名为 vecX 的训练输入集

array([[[0],
        [1],
        [1]],

       [[1],
        [1],
        [0]],

       [[1],
        [0],
        [1]],

       [[0],
        [1],
        [0]],

       [[1],
        [0],
        [0]]])

以及对应的名为vecY的训练输出集:

array([[0],
[1],
[0],
[0],
[1]])

我还为更大的训练集创建了以下 keras LSTM 网络

LSTM_net = Sequential()
LSTM_net.add(LSTM(1,input_shape=(3,1)))
LSTM_net.add(Dense(1,activation="softmax"))
LSTM_net.compile(optimizer="adagrad", loss="binary_crossentropy",metrics=["accuracy"])
LSTM_net.fit(vecX,vecY,batch_size=256,epochs=100,verbose=2)

当我训练这个模型时,它会在整个训练过程中以恒定的精度卡住

1s - loss: 0.7534 - acc: 0.4992
Epoch 2/1000
0s - loss: 0.7533 - acc: 0.4992
Epoch 3/1000
0s - loss: 0.7534 - acc: 0.4992
Epoch 4/1000
0s - loss: 0.7534 - acc: 0.4992
Epoch 5/1000
0s - loss: 0.7534 - acc: 0.4992

所得到的训练模型对训练集或测试集中的所有输入仅给出恒定的 0 预测,而且它似乎已经学到了关于序列的任何内容。

我尝试了其他激活,如 softmax、sigmoid 和线性,但我没有看到准确性有任何提高。我什至尝试使用 shuffle=False 参数进行拟合,但得到了相同的结果。

我做错了什么?

【问题讨论】:

  • 如果这个问题更多是关于机器学习的方法而不是实际编程,也许stats.stackexchange.com 的人可以提供帮助
  • 您使用的是 relu 还是它的一种变体?

标签: python-3.x machine-learning deep-learning keras lstm


【解决方案1】:

Softmax 用于分类分类。许多课程只有一个是正确的。

总和总是 1。因为你只有一个班级,所以无论如何你的结果总是 1。

请改用sigmoid

【讨论】:

  • 我将激活函数更改为sigmoid,但仍然得到相同的结果。我尝试了以下代码:
  • 那么也许你的参数太少了。 1 个单元格并不是一个非常明亮的层。
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2020-10-07
  • 2021-01-06
  • 2018-02-25
  • 1970-01-01
  • 2016-02-25
  • 2019-05-21
相关资源
最近更新 更多