Keras RNN LSTM精度不变

时间:2017-03-15 02:44:16

标签: python keras lstm

X_train

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

y_train

1
1
1
0
0
1

X_train中的第三和第四列是输出的明确指标。我正在尝试使用LSTM进行RNN,所以我选择了这个样本数据,我想过度使用它。

即使在 50 训练时期之后,准确性也没有任何变化 -

Epoch 1/60
6/6 [==============================] - 1s - loss: 5.3141 - acc: 0.6667
Epoch 2/60
6/6 [==============================] - 1s - loss: 5.3141 - acc: 0.6667
Epoch 3/60
6/6 [==============================] - 1s - loss: 5.3141 - acc: 0.6667
Epoch 4/60
6/6 [==============================] - 1s - loss: 5.3141 - acc: 0.6667
Epoch 5/60
6/6 [==============================] - 1s - loss: 5.3141 - acc: 0.6667

模型

model = Sequential()
model.add(Embedding(MAX_NB_WORDS, embedding_vecor_length, input_length=max_length,batch_input_shape=( batch_size, input_dim)))
model.add(LSTM(10, return_sequences=False))
model.add(Dense(1, activation='softmax'))

参数

MAX_NB_WORDS = 10
embedding_vecor_length = 32
max_length = 10
batch_size = 2
input_dim = max_length

我正在使用Theano后端。可能缺少的东西非常明显。请帮忙!

更新

道歉,提供半烤的东西。我正在编写模型 -

opt = SGD(lr=0.001)
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
print(model.summary())

print np.shape(X_train)

callbacks = [
            # EarlyStopping(monitor='val_loss', patience=3, verbose=2),
            RemoteMonitor(root='http://localhost:9000'),
            ModelCheckpoint(filepath="/tmp/weights.hdf5", monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto')
        ]

print X_train
print y_train

history = model.fit(X_train, y_train, nb_epoch=60, batch_size=batch_size, callbacks=callbacks) #, validation_data=(X_val, y_val)

UPDATE2

通过更改> softmax'的激活功能来纠正此问题。到了'sigmoid' 缺少正确的解释。我想"为什么"应该是答案而不是如何。

1 个答案:

答案 0 :(得分:0)

在训练模型之前,您需要配置学习过程,这是使用'compile'方法完成的 - model.compile()

然后,为了训练你的模型,你将不得不使用'fit'方法 - model.fit()

请阅读以下内容:

https://keras.io/getting-started/sequential-model-guide/

在你添加了更多信息后,我已经进行了一些测试。首先,我向X_train和y_train

添加了一行
X_train = 
[[0, 1, 1, 1, 1, 0, 0, 0, 0, 0,],
[0, 1, 1, 1, 1, 0, 0, 0, 0, 0,], 
[0, 1, 1, 1, 0, 0, 0, 0, 0, 0,],
[0, 1, 0, 0, 0, 1, 1, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 1, 0, 0, 0],
[0, 1, 1, 1, 1, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 0, 0, 0, 0, 0]]

y_train = [[1],[1],[1],[0],[0],[1],[1]]

还将batch_size更改为1。

结果并不令人意外:

Epoch 59/60
1/7 [===>..........................] - ETA: 0s - loss: 1.1921e-07 - acc: 1.0000
2/7 [=======>......................] - ETA: 0s - loss: 7.9712 - acc: 0.5000    
3/7 [===========>..................] - ETA: 0s - loss: 5.3141 - acc: 0.6667
4/7 [================>.............] - ETA: 0s - loss: 3.9856 - acc: 0.7500
5/7 [====================>.........] - ETA: 0s - loss: 3.1885 - acc: 0.8000
6/7 [========================>.....] - ETA: 0s - loss: 5.3141 - acc: 0.6667
7/7 [==============================] - 0s - loss: 4.5550 - acc: 0.7143

在每个时代中,7/7步骤总是相同的acc:0.7143但其他(1/7,2/7等等)是相当随机的。我的回答是:

您没有足够的数据来训练模型。在这个数据集上,netowork倾向于在这几个步骤中找到最佳解决方案,结果总是相同的。在这种情况下,结果将永远不值得。我可能错了,但尝试用数百/数千个数据进行测试