2

我是这个领域的新手,并试图重新运行从互联网复制的示例 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)
4

1 回答 1

0

您正在测量准确性,但您正在训练回归器。这意味着您的输出是浮点数而不是固定的分类值。

如果您将最后一个打印更改为具有 3 位小数的精度 ( print('%.3f' % value)),您将看到预测值非常接近基本事实,但并不完全相同,因此精度较低:

0.039
0.198
0.392
0.597
0.788

出于某种原因,accuracy正在使用的 ( sparse_categorical_accuracy) 将0.0and 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_accuracy0 检测为命中而不是未命中,我将编辑答案。

于 2019-06-04T19:05:51.277 回答