2010-08-11 6 views
-73

Для реализации однослойной нейронной сети у меня есть два файла данных.Однослойная нейронная сеть

In: 
    0.832 64.643 
    0.818 78.843 

Out: 
    0 0 1 
    0 0 1 

Вышеупомянутый формат 2 файлов данных.

Выход цели - «1 для определенного класса, к которому принадлежит соответствующий вход, и« 0 для остальных 2 выходов.

Проблема заключается в следующем:

Ваш один слой нейронной сети будет найти (3 по 2 матрицы) и б (3 к 1 вектора) в Y = A * X + B, где Y [C1, C2, C3] 'и X является [x1, x2]'.

Для того, чтобы решить эту проблему выше, с нейронной сети, мы можем переписать уравнение следующим образом: Y = А '* Х', где А»= [A B] (3 × 3-матрица) и X 'является [x1, x2, 1]'

Теперь вы можете использовать нейронную сеть с три входных узлов (один для x1, x2, и 1 соответственно) и трех выходов (C1, С2, С3) ,

Полученные 9 (так как мы имеем 9 соединения между 3 входами и выходами 3 ) вес будет эквивалентен элементов матрицы А».

Basicaly, я пытаюсь сделать что-то вроде этого, но это не работает:

function neuralNetwork 
    load X_Q2.data 
    load T_Q2.data 
    x = X_Q2(:,1); 
    y = X_Q2(:,2); 

    learningrate = 0.2; 
    max_iteration = 50; 

    % initialize parameters 
    count = length(x); 
    weights = rand(1,3); % creates a 1-by-3 array with random weights 
    globalerror = 0; 
    iter = 0; 
    while globalerror ~= 0 && iter <= max_iteration 
     iter = iter + 1; 
     globalerror = 0; 
     for p = 1:count 
      output = calculateOutput(weights,x(p),y(p)); 
      localerror = T_Q2(p) - output 
      weights(1)= weights(1) + learningrate *localerror*x(p); 
      weights(2)= weights(1) + learningrate *localerror*y(p); 
      weights(3)= weights(1) + learningrate *localerror; 
      globalerror = globalerror + (localerror*localerror); 
     end 
    end 

Я пишу эту функцию в какой-либо другой файл и назвав его в моем предыдущем коде.

function result = calculateOutput (weights, x, y) 
    s = x * weights(1) + y * weights(2) + weights(3); 
    if s >= 0 
     result = 1; 
    else 
     result = -1; 
    end 

ответ

221

Я могу обнаружить несколько проблем с кодом. Основная проблема заключается в том, что целью является multi-class (не binary), поэтому вам нужно либо использовать 3 выходных узла по одному для каждого класса (так называемый 1-of-N encoding), либо использовать один выходной узел с другим activation function (что-то более чем двоичное выход -1/1 или 0/1)

В приведенном ниже растворе, то perceptron имеет следующую структуру:

perceptron_strucutre

%# load your data 
input = [ 
    0.832 64.643 
    0.818 78.843 
    1.776 45.049 
    0.597 88.302 
    1.412 63.458 
]; 
target = [ 
    0 0 1 
    0 0 1 
    0 1 0 
    0 0 1 
    0 0 1 
]; 

%# parameters of the learning algorithm 
LEARNING_RATE = 0.1; 
MAX_ITERATIONS = 100; 
MIN_ERROR = 1e-4; 

[numInst numDims] = size(input); 
numClasses = size(target,2); 

%# three output nodes connected to two-dimensional input nodes + biases 
weights = randn(numClasses, numDims+1); 

isDone = false;    %# termination flag 
iter = 0;      %# iterations counter 
while ~isDone 
    iter = iter + 1; 

    %# for each instance 
    err = zeros(numInst,numClasses); 
    for i=1:numInst 
     %# compute output: Y = W*X + b, then apply threshold activation 
     output = (weights * [input(i,:)';1] >= 0);      %#' 

     %# error: err = T - Y 
     err(i,:) = target(i,:)' - output;         %#' 

     %# update weights (delta rule): delta(W) = alpha*(T-Y)*X 
     weights = weights + LEARNING_RATE * err(i,:)' * [input(i,:) 1]; %#' 
    end 

    %# Root mean squared error 
    rmse = sqrt(sum(err.^2,1)/numInst); 
    fprintf(['Iteration %d: ' repmat('%f ',1,numClasses) '\n'], iter, rmse); 

    %# termination criteria 
    if (iter >= MAX_ITERATIONS || all(rmse < MIN_ERROR)) 
     isDone = true; 
    end 
end 

%# plot points and one-against-all decision boundaries 
[~,group] = max(target,[],2);      %# actual class of instances 
gscatter(input(:,1), input(:,2), group), hold on 
xLimits = get(gca,'xlim'); yLimits = get(gca,'ylim'); 
for i=1:numClasses 
    ezplot(sprintf('%f*x + %f*y + %f', weights(i,:)), xLimits, yLimits) 
end 
title('Perceptron decision boundaries') 
hold off 

результаты обучения более пяти образца вы предоставили:

Iteration 1: 0.447214 0.632456 0.632456 
Iteration 2: 0.000000 0.447214 0.447214 
... 
Iteration 49: 0.000000 0.447214 0.447214 
Iteration 50: 0.000000 0.632456 0.000000 
Iteration 51: 0.000000 0.447214 0.000000 
Iteration 52: 0.000000 0.000000 0.000000 

plot

Следует отметить, что данные, используемые в приведенном выше примере, содержит только 5 образцов. Вы получили бы более значимые результаты, если бы у вас было больше учебных экземпляров в каждом классе.

 Смежные вопросы

  • Нет связанных вопросов^_^