Градиент для функции ошибок для нейронной сети с градиентным спуском с 2 скрытыми слоями, которые не возвращают правильный вывод - PullRequest
0 голосов
/ 24 сентября 2019

Я пишу функцию градиента функции ошибки, которая будет реализована в 3 отдельных алгоритмах градиентного спуска (эти работы, они были использованы в предыдущем задании и даны в классе).Он должен быть спроектирован для работы с 3-х слойной нейронной сетью (2 скрытых слоя) с неизвестным количеством элементов в каждом слое.

Я использую Python 3.x и матричную алгебру, и я думал, что у меня естьправильная установка, но она не возвращает правильных ответов.Пытаясь исправить код, я попытался изменить несколько вещей, которые были незначительными в коде, и попытался отступить построчно, чтобы увидеть, где происходит проблема, но я не могу понять это.

Это градиент функции ошибки:

def error_gradient(w, n_inputs, n_hiddens_1, n_hiddens_2, n_outputs, X, T):

    Y, Z1, Z2 = network(w, n_inputs, n_hiddens_1, n_hiddens_2, n_outputs, X, all_outputs = True)
    n_samples = X.shape[0]

    delta_Y = -2 / n_samples * (T - Y)

    Z1_hat = np.insert(Z1, 0, 1, axis=1)
    Z2_hat = np.insert(Z2, 0, 1, axis=1)

    dEdW = Z2_hat.T @ delta_Y

    n_W = (n_hiddens_2 + 1) * n_outputs
    W = w[-n_W:].reshape((n_hiddens_2 + 1, n_outputs))

    delta_Z2 = (delta_Y @ W[1:, :].T) * (1 - Z2**2)
    delta_Z1 = (delta_Y @ W[1:, :].T) * (1 - Z1**2)

    X_hat = np.insert(X, 0, 1, axis=1)

    dEdV = Z1_hat.T @ delta_Z2

    dEdU = dEdY * dYdZ2 * dZ2dV * dVdZ1 * dZ1dU
    dEdU = X_hat.T @ delta_Z1

    dEdw = np.hstack((dEdU.flatten(), dEdV.flatten(), dEdW.flatten()))

    return dEdw

Это раздел для циклов, нарушающих код:


results = []
for n_iterations in [10, 100]:
    for nh1 in [1, 2]:
        for nh2 in [1, 2]:

            n_U = (n_inputs + 1) * nh1
            n_V = (nh1 + 1) * nh2
            n_W = (nh2 + 1) * n_outputs
            initial_w = np.random.uniform(-0.1, 0.1, n_U + n_V + n_W)

            result_scg = opt.scg(initial_w, mse, error_gradient, fargs=[n_inputs, nh1, nh2, n_outputs, X, T],
                                 n_iterations=n_iterations)
            results.append([n_iterations, nh1, nh2, 0, 'scg', result_scg['ftrace'][-1]])

            for lr in [1e-3, 1e-5]:

                result_sgd = opt.sgd(initial_w, mse, error_gradient, fargs=[n_inputs, nh1, nh2, n_outputs, X, T],
                     n_iterations=n_iterations, learning_rate=lr, momentum_rate=0)
                result_adam = opt.adam(initial_w, mse, error_gradient, fargs=[n_inputs, nh1, nh2, n_outputs, X, T],
                                       n_iterations=n_iterations, learning_rate=lr)

                results.append([n_iterations, nh1, nh2, lr, 'sgd', result_sgd['ftrace'][-1]])
                results.append([n_iterations, nh1, nh2, lr, 'adam', result_adam['ftrace'][-1]])

results = pandas.DataFrame(results, columns=('Iterations', 'nh1', 'nh2', 'lr', 'algo', 'mse'))
results

Сообщение об ошибке, которое появляется, когда я пытаюсь запуститьЦиклы for (код для циклов был предоставлен моим профессором):


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-4bcca0e62f0b> in <module>
     10 
     11             result_scg = opt.scg(initial_w, mse, error_gradient, fargs=[n_inputs, nh1, nh2, n_outputs, X, T],
---> 12                                  n_iterations=n_iterations)
     13             results.append([n_iterations, nh1, nh2, 0, 'scg', result_scg['ftrace'][-1]])
     14 

~/Documents/MAS2019-2020/Subterm1/CS545/Homework/optimizers.py in scg(w, error_f, error_gradient_f, fargs, n_iterations, eval_f, save_wtrace, verbose)
    154             sigma = sigma0 / math.sqrt(kappa)
    155 
--> 156             w_smallstep = w + sigma * d
    157             error_f(w_smallstep, *fargs)  # forward pass through model for intermediate variable values for gradient
    158             g_smallstep = error_gradient_f(w_smallstep, *fargs)

ValueError: operands could not be broadcast together with shapes (9,) (11,)

Фактическая функция градиента ошибок возвращает результаты при передаче в качестве функции градиента ошибок во все 3 требуемых алгоритма (ADAM, SGD и SCG), но результаты не точны.Функции network () и mse () возвращают правильные ответы, но не функцию error_gradient ().Код цикла for предназначен для сравнения различных комбинаций скрытых элементов и скорости обучения.Я просто не уверен, где я иду не так.

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