создание поезда перцептрон в MATLAB для гендерной классификации - PullRequest
0 голосов
/ 27 марта 2011

Я кодирую персептрон, чтобы научиться классифицировать пол в изображениях лиц. Я очень новичок в MATLAB, поэтому мне нужна большая помощь. У меня есть несколько вопросов:

  1. Я пытаюсь кодировать функцию:

    function [y] = testset(x,w)  
    %y = sign(sigma(x*w-threshold))
    

    где y - прогнозируемые результаты, x - набор для обучения / тестирования, представленный в виде очень большой матрицы, а w - вес в уравнении. Часть после % - это то, что я пытаюсь написать, но я не знаю, как написать это в коде MATLAB. Есть идеи?

  2. Я пытаюсь кодировать вторую функцию:

    function [err] = testerror(x,w,y)  
    %err = sigma(max(0,-w*x*y))
    

    w, x и y имеют те же значения, что указаны выше, и err - это моя функция ошибки, которую я пытаюсь минимизировать с помощью шагов персептрона.

  3. Я пытаюсь создать шаг в моем персептроне, чтобы снизить процент ошибок с помощью градиентного спуска в моем исходном уравнении. Кто-нибудь знает, как я могу увеличить w с помощью градиентного спуска, чтобы минимизировать функцию ошибки с помощью оператора if then?

Я могу написать код, который у меня есть до сих пор, если это поможет вам ответить на эти вопросы.

Спасибо!

редактировать --------------------------

ОК, так что я все еще работаю над кодом для этого, и хотел бы поставить его, когда у меня будет что-то более полное. Мой самый большой вопрос сейчас:

У меня есть следующая функция:

function [y] = testset(x,w)  
y = sign(sum(x*w-threshold))

Теперь я знаю, что я должен ввести порог, но не могу понять, что я должен ввести в качестве порога! есть идеи?

редактировать ----------------------------
это то, что я до сих пор. В него все еще необходимо внести изменения, но я был бы признателен за вклад, особенно в отношении структуры, и за советы по внесению необходимых изменений!

function [y] = Perceptron_Aviva(X,w)
y = sign(sum(X*w-1));
end

function [err] = testerror(X,w,y)
    err = sum(max(0,-w*X*y));
end

%function [w] = perceptron(X,Y,w_init)
%w = w_init;
%end

%------------------------------

% input samples
X = X_train;

% output class [-1,+1];
Y = y_train;

% init weigth vector
w_init = zeros(size(X,1));
w = w_init;


%---------------------------------------------
loopcounter = 0

while abs(err) > 0.1 && loopcounter < 100

    for j=1:size(X,1)

        approx_y(j) = Perceptron_Aviva(X(j),w(j))

        err = testerror(X(j),w(j),approx_y(j))

        if err > 0 %wrong (structure is correct, test is wrong)
            w(j) = w(j) - 0.1 %wrong
        elseif err < 0 %wrong
            w(j) = w(j) + 0.1 %wrong
        end

       % -----------
       % if sign(w'*X(:,j)) ~= Y(j) %wrong decision?
       %      w = w + X(:,j) * Y(j);   %then add (or subtract) this point to w
    end

Ответы [ 3 ]

1 голос
/ 27 марта 2011

Вы можете прочитать этот вопрос Я уже некоторое время назад.

Я использую код Matlab и функцию Perceptron

function [w] = perceptron(X,Y,w_init)

w = w_init;
for iteration = 1 : 100  %<- in practice, use some stopping criterion!
  for ii = 1 : size(X,2)         %cycle through training set
    if sign(w'*X(:,ii)) ~= Y(ii) %wrong decision?
      w = w + X(:,ii) * Y(ii);   %then add (or subtract) this point to w
    end
  end
  sum(sign(w'*X)~=Y)/size(X,2)   %show misclassification rate
end

, и она вызывается из кода( @ Itamar Katz ) like (случайные данные):

% input samples
X1=[rand(1,100);rand(1,100);ones(1,100)];   % class '+1'
X2=[rand(1,100);1+rand(1,100);ones(1,100)]; % class '-1'
X=[X1,X2];

% output class [-1,+1];
Y=[-ones(1,100),ones(1,100)];

% init weigth vector
w=[.5 .5 .5]';

% call perceptron
wtag=perceptron(X,Y,w);
% predict
ytag=wtag'*X;


% plot prediction over origianl data
figure;hold on
plot(X1(1,:),X1(2,:),'b.')
plot(X2(1,:),X2(2,:),'r.')

plot(X(1,ytag<0),X(2,ytag<0),'bo')
plot(X(1,ytag>0),X(2,ytag>0),'ro')
legend('class -1','class +1','pred -1','pred +1')

Полагаю, это может дать вам представление о функциях, которые вы описали.С ошибкой сравните ожидаемый результат с реальным результатом (класс)

1 голос
/ 27 марта 2011

Ну, то, что вы называете порогом, - это смещение в номенклатуре машинного обучения. Это следует оставить как ввод для пользователя, потому что он используется во время обучения.

Кроме того, мне интересно, почему вы не используете встроенные функции matlab. то есть ньюп или ньюфф. например,

ff=newp(X,Y)

Затем вы можете установить свойства объекта ff, чтобы выполнять свою работу по выбору градиентного спуска и т. Д.

1 голос
/ 26 марта 2011

Предположим, ваш набор данных - X, пулы данных, а Y - метки классов.

f=newp(X,Y)

создает персептрон.

Если вы хотите создать MLP, тогда:

f=newff(X,Y,NN)

, где NN - это сетевая архитектура, то есть массив, который обозначает число нейронов на каждом скрытом слое.Например,

NN=[5 3 2]

будет соответствовать сети с 5 нейронами на первых слоях, 3 на втором и 2 на третьем скрытом слое.

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