【发布时间】: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