为什么在这个简单的代码中我的精确度总是0.2

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (7)

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

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

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

0.039
0.198
0.392
0.597
0.788

由于某种原因,accuracy被使用(sparse_categorical_accuracy)正在考虑0.00.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检测为命中而不是未命中,我将编辑答案。

扫码关注云+社区

领取腾讯云代金券