首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LSTM预测二进制分类-精度停留在50% -如何使用状态

使用LSTM预测二进制分类-精度停留在50% -如何使用状态
EN

Data Science用户
提问于 2019-05-02 09:41:53
回答 1查看 4.5K关注 0票数 2

我试图使用LSTM模型进行二进制分类;但是,当我训练该模型时,损失保持在0.69左右(即。- -\ln(0.5))和0.5的准确度,这表明这个模型并不是在学习,因为这些是随机猜测所期望的数字。我试着玩学习速度,改变单元数量,把LSTM放在一起,但是我觉得我错过了一些关于状态的使用,但我不确定是什么。

我的时间序列是t = [x_0, ..., x_N]格式的,我希望使用一个跨距10的滚动窗口来使用100个元素预测下一个元素的符号。例如:我想让元素0到99来预测第100元素的符号;然后我想使用元素10到109来预测第110元素等等。

因此,我将我的训练集构建为

X = \begin{bmatrix} x_{0} & x_{1} & x_{2} & \dots & x_{99} \\ x_{10} & x_{11} & x_{12} & \dots & x_{109} \\ ...\\ \end{bmatrix}

我的目标向量是,其中x的正号是1,负0。

y = \begin{bmatrix} \text{sgn}(x_{100}) \\ \text{sgn}(x_{110}) \\ \vdots \\ \end{bmatrix}

在我的例子中,N = 1047700,所以我有长度为10010477序列。我的想法是在下面的代码中使用LSTM

代码语言:javascript
复制
model = Sequential()

model.add(LSTM(32, activation='tanh',input_shape=(X.shape[1],1)))
model.add(Dense(1,activation='sigmoid'))
adm = Adam(lr=0.001)
model.compile(loss='binary_crossentropy', optimizer=adm, metrics=['accuracy'])

model.fit(train_array,classified_returns, epochs=200, verbose=1,
         shuffle=False, validation_split=0.1)

以下是模型摘要

代码语言:javascript
复制
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_2 (LSTM)                (None, 32)                4608      
_________________________________________________________________
dense_13 (Dense)             (None, 1)                 33        
=================================================================
Total params: 4,641
Trainable params: 4,641
Non-trainable params: 0
_________________________________________________________________

这是拟合的输出。

代码语言:javascript
复制
Train on 9429 samples, validate on 1048 samples
Epoch 1/200
9429/9429 [==============================] - 18s 2ms/step - loss: 0.6932 - acc: 0.5002 - val_loss: 0.6931 - val_acc: 0.503849
Epoch 2/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6933 - acc: 0.4984 - val_loss: 0.6931 - val_acc: 0.5048
Epoch 3/200
9429/9429 [==============================] - 15s 2ms/step - loss: 0.6932 - acc: 0.4994 - val_loss: 0.6930 - val_acc: 0.5048
Epoch 4/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4992 - val_loss: 0.6930 - val_acc: 0.5048
Epoch 5/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4987 - val_loss: 0.6930 - val_acc: 0.5048
Epoch 6/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4980 - val_loss: 0.6930 - val_acc: 0.5048
Epoch 7/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4978 - val_loss: 0.6930 - val_acc: 0.5038
Epoch 8/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4984 - val_loss: 0.6930 - val_acc: 0.5048
Epoch 9/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4986 - val_loss: 0.6930 - val_acc: 0.5048
Epoch 10/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4977 - val_loss: 0.6930 - val_acc: 0.5057
Epoch 11/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4980 - val_loss: 0.6930 - val_acc: 0.5057
Epoch 12/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4981 - val_loss: 0.6930 - val_acc: 0.5067
Epoch 13/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4987 - val_loss: 0.6930 - val_acc: 0.5076
Epoch 14/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4978 - val_loss: 0.6930 - val_acc: 0.5076
Epoch 15/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4974 - val_loss: 0.6930 - val_acc: 0.5076
Epoch 16/200
9429/9429 [==============================] - 15s 2ms/step - loss: 0.6932 - acc: 0.4976 - val_loss: 0.6930 - val_acc: 0.5076
Epoch 17/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4968 - val_loss: 0.6930 - val_acc: 0.5076
Epoch 18/200
9429/9429 [==============================] - 16s 2ms/step - loss: 0.6932 - acc: 0.4971 - val_loss: 0.6930 - val_acc: 0.5076

正如我们所看到的,模型并不是学习。有人能给我指明正确的方向吗?

EN

回答 1

Data Science用户

发布于 2019-05-02 10:55:34

如何使用有状态的LSTM在官方Keras文档中有很好的文档。有一个不错的博客帖子在这里

在经常性图层部分有一个说明:

关于在RNN中使用状态性,您可以将RNN层设置为“有状态的”,这意味着为一个批中的样本计算的状态将被重用为下一批中的样本的初始状态。这假设样本之间在不同的连续批次之间进行一对一的映射。要启用状态:-在层构造函数中指定stateful=True。-通过将if顺序模型:batch_input_shape=(...)传递到模型的第一层,为您的模型指定一个固定的批处理大小。对于具有一个或多个输入层的功能模型:batch_shape=(...)对模型中的所有第一层。这是您的输入的预期形状,包括批处理大小。它应该是整数的元组,例如(32, 10, 100)。-在调用fit()时指定shuffle=False。若要重置模型的状态,请在特定层或整个模型上调用.reset_states()

Small gotcha

您必须自己解决的一个小问题是确保您的样本数量是您批次大小的整数倍数:num_samples % batch_size == 0。您需要确保这一点,因为Keras只会为最后一批获取剩余的样本,而且这通常比您希望的批大小要小。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/51264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档