Ниже приведена часть моей попытки кодирования, чтобы попытаться реализовать простую нейронную сеть с 1 скрытым слоем. При установке второй дельты для обратного распространения, обозначаемой del2, уравнения для обратного распространения говорят, что dL / dw2 должно быть sigma '(z2) * (градиент функции потерь) * a1. сигма 'является производной сигмовидной функции. Нейронная сеть не может правильно классифицировать точки, но если я просто установлю del2 как градиент функции потерь, то есть разницу между истинным и прогнозируемым значением, тогда нейронная сеть будет работать правильно. Понятия не имею, почему это происходит, любая помощь приветствуется.
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
def sigmoid(x):
return 1.0/(1.0+np.exp(-x))
def d_sigmoid(x):
return sigmoid(x)*(1.0-sigmoid(x))
np.random.seed(3)
training_input, training_output = datasets.make_moons(200,noise = 0.1)
color = training_output
np.random.seed(0)
w1 = np.random.randn(2,3)/np.sqrt(2)
w2 = np.random.randn(3,2)/np.sqrt(3)
epoch = 20000
b1 = np.zeros((1,3))
b2 = np.zeros((1,2))
X = training_input
lr = 0.1
reg = 0.01
for i in range(epoch):
z1 = X.dot(w1) + b1
a1 = sigmoid(z1)
z2 = a1.dot(w2) + b2
a2 =sigmoid(z2)
del2 = a2
del2[range(len(training_input)),training_output] -= 1
del2 = np.multiply(del2,sigmoid(z2)*(1-sigmoid(z2)))
dw2 = (a1.T).dot(del2)
db2 = np.sum(del2,axis = 0,keepdims = True)
del1 = del2.dot(w2.T)*(1-a1)*a1
dw1 = (X.T).dot(del1)
db1 = np.sum(del1,axis = 0)
dw1 += reg*w1
dw2 += reg*w2
w1 = w1-lr*dw1
b1 = b1-lr*db1
w2 = w2-lr*dw2
b2 = b2-lr*db2