2017-01-11 6 views
2

Я новичок в keras, и я пытаюсь построить свою собственную нейронную сеть.Как построить простую нейронную сеть на keras (не распознавание изображения)

Задача:

Мне нужно написать систему, которая может принимать решения для характера, которые могут соответствовать один или несколько врагов. Система может быть известно:

  • характер Процент здоровья
  • Наличие пистолета;
  • Количество врагов.

Ответ должен быть в виде одного из следующих действий:

  1. Attack
  2. Run
  3. Hide (для внезапного нападения)
  4. Чтобы сделать ничего

Чтобы тренироваться, я сделал таблицу «уроков»:

https://i.stack.imgur.com/lD0WX.png

Так вот мой код:

# Create first network with Keras 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.optimizers import SGD 
import numpy 
# fix random seed for reproducibility 
seed = 7 
numpy.random.seed(seed) 
# split into input (X) and output (Y) variables 
X = numpy.array([[0.5,1,1], [0.9,1,2], [0.8,0,1], [0.3,1,1], [0.6,1,2], [0.4,0,1], [0.9,1,7], [0.5,1,4], [0.1,0,1], [0.6,1,0], [1,0,0]]) 
Y = numpy.array([[1],[1],[1],[2],[2],[2],[3],[3],[3],[4],[4]]) 
# create model 
model = Sequential() 
model.add(Dense(3, input_dim=3, init='uniform', activation='relu')) 
model.add(Dense(1, init='uniform', activation='sigmoid')) 
# Compile model 
sgd = SGD(lr=0.001) 
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy']) 

# Fit the model 
model.fit(X, Y, nb_epoch=150) 
# calculate predictions 
predictions = model.predict(X) 
# round predictions 
rounded = [round(x) for x in predictions] 
print(rounded) 

Вот предсказания, которые я получаю. [1.0, 1.0, 1.0, 1.0, 1.0, 1.0]

Точность каждой эпохи составляет 0,2727, а потеря уменьшается. Неправильно.

Я пытался увеличить скорость обучения на 10, изменив активацию и оптимизаторы. Даже данные, вводимые вручную. Может ли кто-нибудь сказать мне, как решить мою простую проблему. спасибо.

ответ

2

В коде есть несколько проблем.

  1. Количество записей данных очень мало по сравнению с моделью NN.
  2. Y представлен как число классов, а не как вектор класса. Модель регрессии может быть изучена, но ее плохой выбор дизайна.
  3. вывод softmax Функция всегда находится между 0-1 .. поскольку это используется, ваша модель знает только, чтобы вывести значения между 0-1.

Здесь ниже немного лучше модифицированный код:

from keras.models import Sequential 
from keras.layers import Dense 
from keras.optimizers import SGD 
import numpy 
# fix random seed for reproducibility 
seed = 7 
numpy.random.seed(seed) 
# split into input (X) and output (Y) variables 
X = numpy.array([[0.5,1,1], [0.9,1,2], [0.8,0,1], [0.3,1,1], [0.6,1,2], [0.4,0,1], [0.9,1,7], [0.5,1,4], [0.1,0,1], [0.6,1,0], [1,0,0]]) 
y = numpy.array([[1],[1],[1],[2],[2],[2],[3],[3],[3],[0],[0]]) 

from keras.utils import np_utils 
Y = np_utils.to_categorical(y, 4) 
# print Y 

# create model 
model = Sequential() 
model.add(Dense(3, input_dim=3, activation='relu')) 
model.add(Dense(4, activation='softmax')) 
# Compile model 
# sgd = SGD(lr=0.1) 
# model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) 
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) 

# Fit the model 
model.fit(X, Y, nb_epoch=700) 

# calculate predictions 
predictions = model.predict(X) 

predictions_class = predictions.argmax(axis=-1) 
print(predictions_class) 

Примечание Я использовал softmax активации, как классы являются взаимоисключающими

Смежные вопросы