Простое обратное распространение Python не работает должным образом - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь реализовать алгоритм обратного распространения, чтобы показать, как можно использовать двухуровневую нейронную сеть для работы в качестве логического элемента XOR.Я следовал этому уроку здесь .

После запуска я ожидаю, что результат будет соответствовать таблице логической истинности XOR :

[[0]
 [1]
 [1]
 [0]]

Однако яполучить:

output after training:  [[0.5]
 [0.5]
 [0.5]
 [0.5]]

Есть какие-либо предложения о том, что я могу делать не так?Спасибо


Полный код:

import numpy as np


# Sigmoid function
def sigmoid(x, deriv=False):
    if deriv:
        return x*(1-x)
    return 1/(1+np.exp(-x))


# Input dataset
X = np.array([[0, 0],
              [0, 1],
              [1, 0],
              [1, 1]])

# Output dataset
y = np.array([[0, 1, 1, 0]]).T

# seed random numbers to make calculation deterministic
np.random.seed(1)

# initialise weights randomly with mean 0
syn0 = 2*np.random.random((2, 1)) - 1

for iter in range(10000):

    # forward prop
    layer0 = X
    layer1 = sigmoid(np.dot(layer0, syn0))

    layer1_error = y - layer1

    layer1_delta = layer1_error * sigmoid(layer1, True)

    syn0 += np.dot(layer0.T, layer1_delta)
    print(iter)

print("output after training: ", layer1)

1 Ответ

4 голосов
/ 18 апреля 2019

Вы не сделали ничего плохого - вы правильно продемонстрировали, что один слой ANN не может выполнить нелинейное разделение !

Входы XOR являются примером данных, которые не могут быть линейно разделены - проще говоря, если вы нанесете их на сетку x-y, вы не сможете нарисовать прямую линию, чтобы отделить выходы «0» от выходов «1». Однослойная искусственная нейронная сеть может выполнять только линейное разделение, поэтому не сможет обеспечить правильный вывод независимо от того, как вы ее обучаете.

Чтобы решить проблему XOR, вам нужно добавить дополнительный слой. Кажется, у вас уже есть два слоя (входной слой и выходной слой), но на самом деле это однослойная сеть, потому что есть только один слой весов (syn0). Добавьте второй слой (следуя примеру в предоставленной вами ссылке) и посмотрите, улучшатся ли результаты обучения.

...