Рассказы о математике | страница 35



mlp.forwardPass(inputs[rand_index])

mlp.backPass(inputs[rand_index], targets[rand_index])

err = mlp.calcError(inputs[rand_index], targets[rand_index])

if p % 10000 == 0:

print("Step", p, "error", err)

print("")

print("Done")


mlp.printValues()

print("")


print("Результаты")


mlp.forwardPass([ 0.0, 0.0 ])

mlp.printOutput()

mlp.forwardPass([ 0.0, 1.0 ])

mlp.printOutput()

mlp.forwardPass([ 1.0, 0.0 ])

mlp.printOutput()

mlp.forwardPass([ 1.0, 1.0 ])

mlp.printOutput()


Как можно видеть, мы создаем сеть с заданными параметрами, затем выполняем большое количество раз функции прямого и обратного распространения. При каждом вызове функции backPass коэффициенты чуть корректируются в сторону уменьшения ошибки.


В результате получаем следующие наборы параметров W:


W>ih = [[10.276084, 9.57721341, 0.11424834], [0.86694222, 0.86379, 0.728575]]

W>ho = [53.976871, -61.523507, 0.13521682]


Напомним, что весовые коэффициенты фактически соответствуют нейронным связям, возникающим в “настоящих” биологических сетях. Тестирование показывает, что обученная сеть действительно воспроизводит функцию XOR практически достоверно, лишь с небольшой погрешностью:


Input [0.0, 0.0], output [0.0000266]

Input [0.0, 1.0], output [0.95193190]

Input [1.0, 0.0], output [0.95074983]

Input [1.0, 1.0], output [0.07137252]


Как показывает тестирование, если увеличить число скрытых нейронов до 3х, обучение происходит гораздо быстрее, и не требует столь большого числа итераций. Уже 50000 итераций достаточно для приемлемой точности, лог программы выглядит примерно так:


Network: input/hidden/output: 2/3/1


Train phase:

Step 0 error 0.418338057819

Step 10000 error 0.00320960246906

Step 20000 error 0.00115714673178

Step 30000 error 0.00176164027913

Step 40000 error 4.34585435915e-05


wIH [[6.243515, -4.35533, 0.1199493], [5.040033, 5.132244, 0.35661004], [-4.4208235, 6.207919, 0.2522050]]

wHO [-11.2227881, 14.0531446, -11.2731065, 0.9389702]


Test phase:

Input [0.0, 0.0], output [0.0436959]

Input [0.0, 1.0], output [0.9712140]

Input [1.0, 0.0], output [0.9721711]

Input [1.0, 1.0], output [0.0075550]


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