Как рассчитать правильные значения для нейронной сети при использовании градиентного спуска? - PullRequest
0 голосов
/ 04 мая 2020

Ниже приведена часть моей попытки кодирования, чтобы попытаться реализовать простую нейронную сеть с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...