Keras RNN LSTM 精度不变

Keras RNN LSTM accuracy not changing

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)

更新2

通过将激活函数从 'softmax' 更改为 'sigmoid' 来纠正此问题 缺少适当的解释。我想 "why" 应该是答案而不是方法。

在训练模型之前,您需要配置学习过程,这是使用 '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

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

您没有足够的数据来训练模型。在这个数据集上,网络倾向于在这样几个步骤中找到最佳解决方案,结果总是相同的。在这种情况下,结果将永远一文不值。我可能是错的,但尝试用 hundreds/thousands 的数据

来测试它