Почему моя точность всегда 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)

1 ответ

Вы измеряете точность, но вы тренируете регрессор. Это означает, что вы выводите число с плавающей запятой, а не фиксированное категориальное значение.

Если вы измените последний отпечаток, чтобы иметь 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 как хит, а не как промах.

Другие вопросы по тегам