Два скрытых слоя нейронной сети не работают - PullRequest
0 голосов
/ 24 октября 2018

Я уже понимаю концепцию нейронной сети с одним скрытым слоем и сейчас пытаюсь добавить еще один второй скрытый слой.Я тренирую сеть не по набору данных, а по одной матрице 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...