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 的数据
来测试它
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 的数据
来测试它