Программы файла 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