Почему моя точность всегда 0,2 в этом простом коде - PullRequest
2 голосов
/ 04 июня 2019

Я новичок в этой области и пытаюсь повторно запустить пример кода 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 Ответ

0 голосов
/ 04 июня 2019

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

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

...