为什么在这个简单的代码中,我的准确度总是 0.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)

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

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

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 检测为命中而不是未命中,我将编辑答案。

相关内容

  • 没有找到相关文章

最新更新