Не работает нейросеть на python keras
По гайду написал следующий код:
from numpy import loadtxt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
dataset = loadtxt('test.csv', delimiter=',')
X = dataset[:,0:2]
y = dataset[:,2]
print(X)
print(y)
model = Sequential()
model.add(Dense(2, activation='linear'))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer='sgd', metrics=['accuracy'])
model.fit(X, y, epochs=100)
model.predict(X)
CSV файл:
207,35,70.55
131,127,110.39
242,115.6,74.63
152,256,101.71
297,20,90.28
При обучении вижу такую картину:
1/1 [==============================] - 0s 453ms/step - loss: 117123.0625 - accuracy: 0.0000e+00
Epoch 2/100
1/1 [==============================] - 0s 0s/step - loss: 209229606702546944.0000 - accuracy: 0.0000e+00
Epoch 3/100
1/1 [==============================] - 0s 0s/step - loss: inf - accuracy: 0.0000e+00
Epoch 4/100
1/1 [==============================] - 0s 0s/step - loss: inf - accuracy: 0.0000e+00
Epoch 5/100
1/1 [==============================] - 0s 0s/step - loss: nan - accuracy: 0.0000e+00
Epoch 6/100
1/1 [==============================] - 0s 0s/step - loss: nan - accuracy: 0.0000e+00
Пробовал менять функции активации, оптимизатор, добавлял скрытые слои. Параметр loss менялся, но всё равно точность была 0. Что делать?
Ответы (1 шт):
Если нарисовать графики зависимости x-y, то похоже у вас там просто нет никакого сигнала в данных.
import seaborn as sns
sns.scatterplot(x=X[:,0],y=y)
sns.scatterplot(x=X[:,1],y=y)
Единственное что можно сделать - взять правильную метрику для регрессии и более традиционный оптимизатор, чтобы всё это не улетело в космос и тогда хотя бы процесс не будет совсем уж расходиться в бесконечность. Плюс таки немного побольше нейронов. Но нормальное решение это всё-равно не даст, повторюсь - в ваших данных просто нет сигнала, сэмплы противоречат друг другу.
model = Sequential()
model.add(Dense(50, activation='linear'))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(X, y, epochs=100)
pred = model.predict(X)
print(pred)
print(pred.flatten()-y)
На выходе:
Epoch 1/100
1/1 [==============================] - 0s 325ms/step - loss: 2362.1326 - mse: 2362.1326
Epoch 2/100
1/1 [==============================] - 0s 5ms/step - loss: 1997.6973 - mse: 1997.6973
...
Epoch 99/100
1/1 [==============================] - 0s 6ms/step - loss: 448.9284 - mse: 448.9284
Epoch 100/100
1/1 [==============================] - 0s 5ms/step - loss: 448.9018 - mse: 448.9018
[[ 66.2372 ]
[ 70.66355]
[ 97.78726]
[111.62021]
[ 86.65694]]
[ -4.31280212 -39.72644867 23.15726196 9.91020874 -3.62306335]
Какие-то результаты получить удалось, но с довольно большой погрешностью.
