Нейронная сеть не учится - простая задача классификации - PullRequest
0 голосов
/ 01 июня 2019

Я сейчас пытаюсь научиться простой нейронной сети распознавать 4 разных выхода. Есть 2 входа значения, которые на самом деле что-то вроде этого:

выход + униформа (-0,2,0,2) + 1

Есть только 200 записей этих данных, но для меня важно, чтобы было как можно меньше данных.

Пример ввода и вывода рядом с ним:

0.9936288071867917,1.0163870658585894  -  0

2.0133450399223953,1.9965272907556022  -  1

3.013918319917813,3.018102735071009  -  2

3.9935640040186025,4.00379069782054  -  3

Я пытался установить разное количество эпох, скрытых нейронов и функций активации. Дело в том, что я хочу сохранить нейронную сеть очень простой - это означает, что только два скрытых слоя с максимальным количеством около 20 скрытых нейронов на слой. Что бы я ни делал, он все равно не учится или учится очень плохо.

Вот код

import keras
import numpy as np
from sklearn.model_selection import train_test_split
#import pandas as pd
#import tensorflow as tf
from sklearn.utils import shuffle
from sklearn import metrics

seed = 10
np.random.seed(seed)

dataset = np.loadtxt("dataset.csv",delimiter=',')
#dataset = shuffle(dataset)

X = dataset[:,:2]
Y = dataset[:,2]

#print(X)
#print(Y)

(X_train,X_test,Y_train,Y_test) = train_test_split(X, Y, test_size=0.10, random_state=seed)
input_shape = (2,)

model = keras.models.Sequential()
model.add(keras.layers.InputLayer(input_shape))
model.add(keras.layers.core.Dense(8, activation='sigmoid'))
model.add(keras.layers.core.Dense(4, activation='sigmoid'))

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
history = model.fit(X_train,Y_train,validation_split=0.10,epochs=30)


val_loss, val_acc = model.evaluate(X_test,Y_test)
print('\nCost = ',val_loss,'\nAccuracy = ',val_acc,'\n')

Я все еще получаю результаты, выглядящие так через эпохи (почти одинаковые) и оценку:

Cost =  1.40975821018219 
Accuracy =  0.20000000298023224 

Что я могу сделать, чтобы улучшить эту нейронную сеть?

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Первое, что вы можете изменить, - это функция активации в вашем последнем слое. Поскольку у вас есть 4 различных выхода, softmax является правильной функцией активации.

model.add(keras.layers.core.Dense(4, activation='softmax'))

Следующее, что вы должны сделать, это заменить

 model.add(keras.layers.core.Dense(8, activation='sigmoid'))

с

  model.add(keras.layers.core.Dense(8, activation='relu'))
0 голосов
/ 01 июня 2019

Там может быть что-то еще, но первое, что приходит на ум, - это нормализация ваших данных. как вы можете видеть на этом участке: this plot
значение сигмоида не сильно отличается для 1, 2,3 и 4. Если, однако, ваши значения были между -1 и 1, вы получите намного лучшие результаты.

...