Функция вычисления качества обучения (значения функции стоимости) и градиентов, для градиентного спуска

 

Программы файла nnCostFunction.m:

function [J grad] = nnCostFunction(nn_params,...

                              input_layer_size,...

                              hidden_layer_size,...

                              num_labels,...

                              X, y, lambda)

 

% Вычисление значения функции стоимости и векторов градиента

% весовых коэффициентов.

% Формат вызова:

% [J grad] = NNCOSTFUNCTON(nn_params, hidden_layer_size, num_labels,...

% X, y, lambda). Параметры нейронной сети "развернуты" в вектор-столбец

%   nn_params и их нужно перевести обратно в форму матриц весовых коэффициентов..

%

% Возвращаемые градиенты должны возвращаться в "развернутом" виде

% и иметь такую же размерность как исходный входной вектор весовых

% коэффициентов.

%

 

% Получаем из вектора параметров nn_params back матрицы

% весовых коэффициентов двухслойной нейронной сети Theta1 и Theta2.

 

Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)),...

            hidden_layer_size, (input_layer_size + 1));

 

Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end),...

            num_labels, (hidden_layer_size + 1));

 

% Количество обучающих пар

m = size(X, 1);

 

% Вам нужно реализовать вычисление этих переменных.

J = 0;

Theta1_grad = zeros(size(Theta1));

Theta2_grad = zeros(size(Theta2));

           

% Часть 1: Реализовать прямой проход по нейронной сети и вернуть значение функции стоимости в переменной J.

%              После реализации части 1, Вы можете проверить правильность

%              вычислений при помощи файла ex4.m. (Пояснения, касающиеся проверки находятся в файле ex4.m).

Y = zeros(m,num_labels); %переводим данные о правильных ответах в нужный нам вид.

for i = 1:1:m

Y(i,y(i)) = 1;

end;  

a1=[ones(m, 1), X]; %вход на первый слой

z2=Theta1*a1'; %вход на скрытый слой

a2=[ones(m, 1), sigmoid(z2')] %выход со скрытого слоя с активацией

z3=Theta2*a2'; %вход на выходной слой

a3=sigmoid(z3);%функция активации на выходном слое

 

Рисунок 2 Модель нейронной сети

 

  J=(1/m)*(sum(sum(-Y.*log(a3')-(1-Y).*log(1-a3'))));

 

Функция стоимости без регуляризации. Эта часть кода соответствует формуле:

 

 

%Функцуия стоимости с регуляризацией

 Theta1r=Theta1;

Theta2r=Theta2;

%Убираем столбец связанный со смещением

Theta1r(:,1)=[];

Theta2r(:,1)=[];

 

J=J+(lambda/(2*m))*(sum(sum(Theta1r.^2))+sum(sum(Theta2r.^2)));

 

 

Что соответствует формуле:

 

 

% Часть 2: Реализовать алгоритм обратного распространения для вычисления

%              градиентов весовых коэффициентов Theta1_grad и Theta2_grad.

%              Вы должны возвратить частные производные функции стоимости

%по Theta1 Theta2 в Theta1_grad и Theta2_grad, соответственно. Закончив с %реализацией части 2, Вы можете проверить свою реализацию аналогично части 1.

 

a3=a3';

z2=[ones(m,1),z2'];

 for t=1:1:m

delta3 = a3(t,:) - Y(t,:); %различие между ответом и примером

delta2 = (delta3 * Theta2).* sigmoidGradient(z2(t,:)); %различие для второго слоя

delta2 = delta2(2:end);

%вычисление с нерегуляризированого градиента

Theta2_grad = Theta2_grad + delta3'*(a2(t,:));

Theta1_grad = Theta1_grad + delta2'*(a1(t,:));

end;

 

Рисунок 3 Модель нейронной сети

 

% Часть 3: Реализовать регуляризацию и функции вычисления стоимости и расчета градиента.

 

Theta1r = Theta1;

Theta2r = Theta2;

%Убираем столбец связанный со смещением

Theta1r(:,1) = zeros(hidden_layer_size,1);

Theta2r(:,1) = zeros(num_labels,1);

%Регуляризация градиентов

Theta1_grad=(Theta1_grad + (lambda*Theta1r))/m;

Theta2_grad=(Theta2_grad + (lambda*Theta2r))/m;

 

Эта часть кода соответствует формулам:

 

    Далее:

 

grad = [Theta1_grad(:); Theta2_grad(:)];%запись регуляризованных градиентов в результаты функции

end


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: