Точность Keras для моей модели всегда 0 при обучении

Я новичок в keras. Я создал простую сеть, чтобы попробовать:

import numpy as np;

from keras.models import Sequential;
from keras.layers import Dense,Activation;

data= np.genfromtxt("./kerastests/mydata.csv", delimiter=';')
x_target=data[:,29]
x_training=np.delete(data,6,axis=1)
x_training=np.delete(x_training,28,axis=1)

model=Sequential()
model.add(Dense(20,activation='relu', input_dim=x_training.shape[1]))
model.add(Dense(10,activation='relu'))
model.add(Dense(1));

model.compile(optimizer='adam',loss='mean_squared_error',metrics=['accuracy'])
model.fit(x_training, x_target)

Из моих исходных данных я удалил 2 столбца, как вы можете видеть. Один из них - это колла, который пришел с датой в строковом формате (в наборе данных рядом с ним у меня есть кол-во для другого дня в месяц, а другое - год, поэтому мне не нужен этот столбец), а другой столбец - столбец, который я использую как цель для модели).

Когда я тренирую эту модель, я получаю этот вывод:

32/816 [>.............................] - ETA: 23s - loss: 13541942.0000 - acc: 0.0000e+00
800/816 [============================>.] - ETA: 0s - loss: 11575466.0400 - acc: 0.0000e+00 
816/816 [==============================] - 1s - loss: 11536905.2353 - acc: 0.0000e+00     
Epoch 2/10
 32/816 [>.............................] - ETA: 0s - loss: 6794785.0000 - acc: 0.0000e+00
816/816 [==============================] - 0s - loss: 5381360.4314 - acc: 0.0000e+00     
Epoch 3/10
 32/816 [>.............................] - ETA: 0s - loss: 6235184.0000 - acc: 0.0000e+00
800/816 [============================>.] - ETA: 0s - loss: 5199512.8700 - acc: 0.0000e+00
816/816 [==============================] - 0s - loss: 5192977.4216 - acc: 0.0000e+00     
Epoch 4/10
 32/816 [>.............................] - ETA: 0s - loss: 4680165.5000 - acc: 0.0000e+00
736/816 [==========================>...] - ETA: 0s - loss: 5050110.3043 - acc: 0.0000e+00
816/816 [==============================] - 0s - loss: 5168771.5490 - acc: 0.0000e+00     
Epoch 5/10
 32/816 [>.............................] - ETA: 0s - loss: 5932391.0000 - acc: 0.0000e+00
768/816 [===========================>..] - ETA: 0s - loss: 5198882.9167 - acc: 0.0000e+00
816/816 [==============================] - 0s - loss: 5159585.9020 - acc: 0.0000e+00     
Epoch 6/10
 32/816 [>.............................] - ETA: 0s - loss: 4488318.0000 - acc: 0.0000e+00
768/816 [===========================>..] - ETA: 0s - loss: 5144843.8333 - acc: 0.0000e+00
816/816 [==============================] - 0s - loss: 5151492.1765 - acc: 0.0000e+00     
Epoch 7/10
 32/816 [>.............................] - ETA: 0s - loss: 6920405.0000 - acc: 0.0000e+00
800/816 [============================>.] - ETA: 0s - loss: 5139358.5000 - acc: 0.0000e+00
816/816 [==============================] - 0s - loss: 5169839.2941 - acc: 0.0000e+00     
Epoch 8/10
 32/816 [>.............................] - ETA: 0s - loss: 3973038.7500 - acc: 0.0000e+00
672/816 [=======================>......] - ETA: 0s - loss: 5183285.3690 - acc: 0.0000e+00
816/816 [==============================] - 0s - loss: 5141417.0000 - acc: 0.0000e+00     
Epoch 9/10
 32/816 [>.............................] - ETA: 0s - loss: 4969548.5000 - acc: 0.0000e+00
768/816 [===========================>..] - ETA: 0s - loss: 5126550.1667 - acc: 0.0000e+00
816/816 [==============================] - 0s - loss: 5136524.5098 - acc: 0.0000e+00     
Epoch 10/10
 32/816 [>.............................] - ETA: 0s - loss: 6334703.5000 - acc: 0.0000e+00
768/816 [===========================>..] - ETA: 0s - loss: 5197778.8229 - acc: 0.0000e+00
816/816 [==============================] - 0s - loss: 5141391.2059 - acc: 0.0000e+00    

Почему это происходит? Мои данные - это временная серия. Я знаю, что для временных рядов люди обычно не используют плотные нейроны, но это всего лишь тест. То, что действительно меня обманывает, это то, что точность всегда равна 0. И с другими тестами я даже проигрывал: доходит до значения "NAN".

Может ли кто-нибудь помочь здесь?

Приветствия.

Ответы

Ответ 1

Ваша модель, по-видимому, соответствует модели регрессии по следующим причинам:

  • Вы используете linear (по умолчанию) функцию активации в выходном слое (и relu в слое раньше).

  • Ваша потеря - loss='mean_squared_error'.

Однако метрика, которую вы use- metrics=['accuracy'] соответствует проблеме классификации. Если вы хотите сделать регрессию, удалите metrics=['accuracy']. То есть, используйте

model.compile(optimizer='adam',loss='mean_squared_error')

Вот список показателей keras для регрессии и классификации (взято из этого сообщения в блоге):

Показатели регрессии Keras

• Ошибка среднего квадрата: mean_squared_error, MSE или mse

• Средняя абсолютная ошибка: mean_absolute_error, MAE, mae

• Средняя абсолютная процентная ошибка: mean_absolute_percentage_error, MAPE, mape

• Косинус Близость: cosine_proximity, косинус

Показатели классификации Keras

• Бинарная точность: бинарная ошибка, acc

• Категориальная точность: категориальная погрешность, acc

• Разрешенная категориальная точность: sparse_categorical_accuracy

• Top k Категориальная точность: top_k_categorical_accuracy (требуется указать параметр ak)

• Sparse Top k Категориальная точность: sparse_top_k_categorical_accuracy (требуется указать параметр ak)

Ответ 2

Добавьте следующее, чтобы получить метрики:

   history = model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mean_squared_error'])
   # OR
   history = model.compile(optimizer='adam', loss='mean_absolute_error', metrics=['mean_absolute_error'])
   history.history.keys()
   history.history