Почему моя точность всегда 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 как хит, а не как промах.