Почему я не могу обучить ANN для XNOR? - PullRequest
0 голосов
/ 26 октября 2019

Я сделал простое NN для определения значений XNOR с помощью двух двоичных значений на входном слое. У меня есть массив Numpy всех возможных комбинаций с метками.

Код:

from keras.models import Sequential
from keras.layers import Dense
import numpy

data = numpy.array([[0.,0.,1.],[0.,1.,0.],[1.,0.,0.],[1.,1.,1.]])
train = data[:,:-1] # Taking The same and All data for training
test = data[:,:-1]  

train_l = data[:,-1]
test_l = data[:,-1]

train_label = []
test_label = []

for i in train_l:
    train_label.append([i])
for i in test_l:
    test_label.append([i])   # Just made Labels Single element...

train_label = numpy.array(train_label)
test_label = numpy.array(test_label)  # Numpy Conversion


model = Sequential()

model.add(Dense(2,input_dim = 2,activation = 'relu'))
model.add(Dense(2,activation = 'relu'))
model.add(Dense(1,activation = 'relu'))

model.compile(loss = "binary_crossentropy" , metrics = ['accuracy'], optimizer = 'adam')

model.fit(train,train_label, epochs = 10, verbose=2)

model.predict_classes(test)

Даже если брать один и тот же набор данных для обучения и тестирования ... Он не предсказываетправильно ... Где я был не прав?

Я сознательно взял весь набор данных, так как он не предсказывал с 2 значениями ...

1 Ответ

0 голосов
/ 26 октября 2019

Ваша архитектура слишком проста для этой функции. Если вы используете приведенную ниже архитектуру и обучаетесь 100 эпох, вы получите точность = 1.

model = Sequential()
model.add(Dense(20,input_dim = 2,activation = 'relu'))
model.add(Dense(20,activation = 'relu'))
model.add(Dense(1,activation = 'sigmoid'))

UPD: почему простая модель не работает так хорошо?

Одна из причин заключается в том, что при активации ReLU, если один нейрон становится отрицательным в каждой точке данных, его градиент становится равным нулю, а его веса больше не изменяются. В начале у вас мало нейронов, и если некоторые из них «умирают» таким образом, оставшихся нейронов может быть недостаточно для аппроксимации функции.

Другая проблема заключается в том, что меньшее количество нейронов повышает вероятность того, что модельзастрять в локальном минимуме.

Тем не менее, вы правы, что теоретически достаточно нескольких нейронов. Модель ниже работает даже с одним слоем. Я заменил ReLU на LeakyReLU, чтобы устранить первую проблему. Это работает большую часть времени, но иногда застревает в локальном минимуме.

model = Sequential()

model.add(Dense(2,input_dim = 2,activation = LeakyReLU(alpha=0.3)))
model.add(Dense(1,activation = 'sigmoid'))

optimizer = Adam(lr=0.01)
model.compile(loss = "binary_crossentropy" , metrics = ['accuracy'], optimizer=optimizer)

model.fit(train,train_label, epochs = 500, verbose=2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...