我是这个领域的新手,并试图重新运行从互联网复制的示例 LSTM 代码。LSTM 模型的精度始终为 0.2,但预测输出完全正确,这意味着精度应为 1。谁能告诉我为什么?
from numpy import array
from keras.models import Sequential, Dense, LSTM
length = 5
seq = array([i/float(length) for i in range(length)])
print(seq)
X = seq.reshape(length, 1, 1)
y = seq.reshape(length, 1)
# define LSTM configuration
n_neurons = length
n_batch = 1000
n_epoch = 1000
# create LSTM
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(1, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
# train LSTM
model.fit(X, y, epochs=n_epoch, batch_size=n_batch)#, verbose=2)
train_loss, train_acc = model.evaluate(X, y)
print('Training set accuracy:', train_acc
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result:
print('%.1f' % value)
您正在测量准确性,但您正在训练回归器。这意味着您输出的是浮点数,而不是固定的分类值。
如果将最后打印更改为精度小数点后 3 位 (print('%.3f' % value)
),您将看到预测值非常接近基本事实,但不完全相同,因此精度较低:
0.039
0.198
0.392
0.597
0.788
出于某种原因,正在使用的accuracy
(sparse_categorical_accuracy
)将0.0
和0.039
(或类似)视为命中而不是未命中,所以这就是为什么你得到20%
而不是0%
。
如果将序列更改为不包含零,则准确性将0%
,这不会令人困惑:
seq = array([i/float(length) for i in range(1, length+1)])
最后,为了纠正这一点,您可以使用mae
而不是accuracy
作为指标,您将在其中看到错误下降:
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mae'])
另一种选择是切换到分类框架(将浮点数更改为分类值)。
希望这有帮助!如果我能深入研究为什么sparse_categorical_accuracy
将 0 检测为命中而不是未命中,我将编辑答案。