Программирование базовой нейронной сети с нуля в MATLAB
В прошлом я задавал несколько вопросов о нейронных сетях на этом сайте и получил отличные ответы, но я все еще изо всех сил пытаюсь реализовать один для себя. Это довольно длинный вопрос, но я надеюсь, что он послужит руководством для других людей, создающих свои собственные базовые нейронные сети в MATLAB, так что оно того стоит.
То, что я сделал до сих пор, может быть совершенно неверным. Я слежу за онлайн-курсом по машинному обучению в Стэнфорде, организованным профессором Эндрю Й. Нгом, и стараюсь в полной мере реализовать то, чему он научил.
Подскажите, пожалуйста, верны ли части моего кода для функции прямой связи и функции стоимости, и где я ошибаюсь в части минимизации (оптимизации)?
У меня есть нейронная сеть прямой связи с двумя слоями.
Код MATLAB для прямой связи:
function [ Y ] = feedforward2( X,W1,W2)
%This takes a row vector of inputs into the neural net with weight matrices W1 and W2 and returns a row vector of the outputs from the neural net
%Remember X, Y, and A can be vectors, and W1 and W2 Matrices
X=transpose(X); %X needs to be a column vector
A = sigmf(W1*X,[1 0]); %Values of the first hidden layer
Y = sigmf(W2*A,[1 0]); %Output Values of the network
Y = transpose(Y); %Y needs to be a column vector
Так, например, двухслойная нейронная сеть с двумя входами и двумя выходами будет выглядеть примерно так:
a1
x1 o--o--o y1 (all weights equal 1)
\/ \/
/\ /\
x2 o--o--o y2
a2
если мы вставим:
X=[2,3];
W1=ones(2,2);
W2=ones(2,2);
Y = feedforward2(X,W1,W2)
мы получаем вывод:
Y = [0.5,0.5]
Это представляет значения y1 и y2, показанные на рисунке нейронной сети
Код MATLAB для функции квадрата стоимости ошибки:
function [ C ] = cost( W1,W2,Xtrain,Ytrain )
%This gives a value seeing how close W1 and W2 are to giving a network that represents the Xtrain and Ytrain data
%It uses the squared error cost function
%The closer the cost is to zero, the better these particular weights are at giving a network that represents the training data
%If the cost is zero, the weights give a network that when the Xtrain data is put in, The Ytrain data comes out
M = size(Xtrain,1); %Number of training examples
oldsum = 0;
for i = 1:M,
H = feedforward2(Xtrain,W1,W2);
temp = ( H(i) - Ytrain(i) )^2;
Sum = temp + oldsum;
oldsum = Sum;
end
C = (1/2*M) * Sum;
end
пример
Так, например, если данные обучения:
Xtrain =[0,0; Ytrain=[0/57;
1,2; 3/57;
4,1; 5/57;
5,2; 7/57; a1
3,4; 7/57; %This will be for a two input one output network x1 o--o y1
5,3; 8/57; \/ \_o
1,5; 6/57; /\ /
6,2; 8/57; x2 o--o
2,1; 3/57; a2
5,5;] 10/57;]
Начнем с начальных случайных весов
W1=[2,3; W2=[3,2]
4,1]
Если мы вставим:
Y= feedforward2([6,2],W1,W2)
Мы получаем
Y = 0.9933
Это далеко от того, что должно быть в данных обучения (8/57 = 0,1404). Таким образом, начальные случайные веса W1 и W2, где неправильное предположение.
Чтобы точно измерить, насколько плоха / хороша угадывание весов случайных весов, мы используем функцию стоимости:
C= cost(W1,W2,Xtrain,Ytrain)
Это дает значение:
C = 6.6031e+003
Минимизация функции стоимости
Если мы минимизируем функцию стоимости путем поиска всех возможных переменных W1 и W2 и затем выбираем самую низкую, это даст сеть, которая наилучшим образом приближает обучающие данные
Но когда я использую код:
[W1,W2]=fminsearch(cost(W1,W2,Xtrain,Ytrain),[W1,W2])
Это дает сообщение об ошибке. Там написано: «Ошибка при использовании horzcat. Размеры аргументов CAT не согласованы». Почему я получаю эту ошибку и что я могу сделать, чтобы ее исправить?
Подскажите, пожалуйста, верны ли части моего кода для функции прямой связи и функции стоимости, и где я ошибаюсь в части минимизации (оптимизации)?
Спасибо!!!