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




# Hidden-Output

for o in range(self.n_out):

sum = 0.0

for h in range(len(self.hiddenLayer)):

sum += self.hiddenLayer[h]*self.wHO[o][h]

self.outputLayer[o] = self.sigmoid(sum)


def backPass(self, input, target):

# Обратное распространение

# Формулы основаны на статье

# https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

learn_rate = 0.5

# Output->hidden layer adjust weights

for o in range(self.n_out):

for h in range(self.n_hidden):

deout = -(target[o] - self.outputLayer[o])

der = self.derivative(self.outputLayer[o])

hid = self.hiddenLayer[h]

der = deout*der*hid

prev = self.wHO[o][h]

self.wHO[o][h] -= learn_rate*der


# Hidden->input layer adjust weights

for h in range(self.n_hidden):

for i in range(self.n_in):

derSum = 0.0

for o in range(self.n_out):

deout = -(target[o] - self.outputLayer[o])

derOut = self.derivative(self.outputLayer[o])

der = deout*derOut*self.wHO[o][h]

derSum += der


derH = self.derivative(self.hiddenLayer[h])

derI = self.inputLayer[i]

der = derSum*derH*derI

prev = self.wIH[h][i]

self.wIH[h][i] -= learn_rate*der


def calcError(self, x, target):

# Вычисление ошибки: 0.5*Sum(dV^2)

err = 0.0

for p in range(self.n_out):

err += 0.5*((self.outputLayer[p] - target[p])**2)

return err


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

Таким образом, в нашей сети будет 2 входных параметра (их еще называют “характеристиками”) и 1 выходной. Количество скрытых нейронов пусть будет 2.


Код на языке Python выглядит следующим образом.


mlp = MLP(n_in=2, n_hidden=2, n_out=1)


print("Тренировка сети")


inputs = [ [0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0] ]

targets = [ [0.0], [1.0], [1.0], [0.0] ]

N = 500000

for p in range(N):

rand_index = random.randrange(0, len(inputs))