Я уже понимаю концепцию нейронной сети с одним скрытым слоем и сейчас пытаюсь добавить еще один второй скрытый слой.Я тренирую сеть не по набору данных, а по одной матрице X на выходе y.Но когда я добавляю второй скрытый слой, ошибка не уменьшается.Что-то может быть не так с правилом дельты.Не могли бы вы помочь мне?
import numpy as np
def nonlin(x, deriv=False): # sigmoid activation
if deriv:
return x * (1 - x)
return 1 / (1 + np.exp(-x))
def relu(x, deriv=False): # relu activation
if deriv:
return 1/2 * (1 + np.sign(x))
return x/2 + 1/2 * x * np.sign(x)
hiddensize_l1 = 8 # amount of hiddennodes
hiddensize_l2 = 8
b = 1 # bias
lr = 10 # learning rate, gradient descent learn-step-size
dropout_percent, do_dropout = (0.3, True)
syn0 = 2 * np.random.random((3, hiddensize_l1)) - 1
syn1 = 2 * np.random.random((hiddensize_l1, hiddensize_l2)) - 1
syn2 = 2 * np.random.random((hiddensize_l2, 1)) - 1
X = np.array([[1, 0, 0],
[0, 0, 1],
[0, 0, 1],
[0, 1, 0]])
y = np.array([[1, 0, 1, 0]]).T
for i in range(10000):
l0 = X
l1 = relu(np.dot(l0, syn0) + b)
l2 = relu(np.dot(l1, syn1) + b)
l3 = nonlin(np.dot(l2, syn2) + b)
l3_error = np.subtract(l3, y)
l3_delta = l3_error * nonlin(l3, True)
l2_error = np.dot(l3_delta, syn2.T)
l2_delta = l2_error * relu(l2, True)
l1_error = np.dot(l2_delta, syn1.T)
l1_delta = l1_error * relu(l1, True)
print(sum(l3_error) / len(l3_error))
syn0 -= lr * (np.dot(l0.T, l1_delta))
syn1 -= lr * (np.dot(l1.T, l2_delta))
syn2 -= lr * (np.dot(l2.T, l3_delta))
print("Output After Training:")
print(l3)