2016-05-25 2 views
0

Я пишу этот код для процесса обучения ANN (многослойное обратное распространение), но результат обучения очень плох, он не близок к 1 в любое время Я знаю, что мы не можем гарантировать какую-либо гарантию, чтобы сделать обучение успешным, но я хочу знать, если я что-то сделаю с ошибкой в ​​этом коде или если я смогу сделать эти шаги с большей производительностью.Изучение ANN в Matlab (многослойное обратное распространение)

Шаги:

1- загрузить мой набор данных

2- выбрать 170 строк из 225 для обучения, а остальные 50 строк для тестирования (в случайном порядке)

3- создают веса для входов и скрытых слои случайным образом между 0 и 1

4- создать Bias для скрытых и выходных слоев случайным образом между -1 и 1

5- найти выход для каждой строки

6- ошибки находка для каждого выхода, то для каждого скрытого слоя

7- изменение веса и смещения массивов на каждой итерации

8- вычислить суммирование квадратичной ошибки (MSE) в каждая итерация.

Результат для каждого выхода всегда между .2 и .5 также не для желаемого выхода. Какая это возможная ошибка в моей логике или моем коде здесь!

Примечание: 1- (я использую набор данных 225 строк с 108 столбцами и 25 результатов как классы) 170 строк для обучения 55 строк для тестирования

2- 50000

окончания итерации

3- обучения ставку 0,3

4- импульс = 0,7

5- скрытый слой пе. нет = 90

Код:

%Initialize the weight matrices with random weights 

V = rand(inlayer,hlayer); % Weight matrix from Input to Hidden between [0,1] 

W = rand(hlayer,olayer); % Weight matrix from Hidden to Output between [0,1] 

%Initialize the theta matrices for hidden and output layers 
Thetahidden = randi(1,hlayer); 
Thetaoutput = randi(1,olayer); 

for i=1:iteration 


for j=1:170 % depends on training data set 
    %This for output between input-hidden 
    for h=1:hlayer % depends on neuron number at hidden layer 
     sum = 0; 
     for k=1:108 % depends on column number 
      sum = sum + (V(k,h)* trainingdata(j,k)); 
     end 
     H(h) = sum + Thetahidden(h); 
     Oh(h) = 1/(1+exp(-H(h))); 
    end 
    %This for output between hidden-output 
    for o=1:olayer % depends on number of output layer 
     sumO = 0; 
     for hh=1:hlayer 
      sumO = sumO+W(hh,o)*Oh(hh); 
     end 
     O(o)=sumO + Thetaoutput(o); 
     OO(o) = 1/(1+exp(-O(o))); 

     finaloutputforeachrow(j,o)= OO(o); 

    end 

    % Store real value of real output 
    for r=1:170 
     for o=1:olayer 
      i=outputtrainingdata(r); 
     if i == o 
      RO(r,o)=1; 
     else 
      RO(r,o)=0; 
     end 
     end 
    end 


    sumerror =0; 


    % Compute Error (output layer) 
    for errorout=1:olayer 

     lamdaout(errorout) = OO(errorout)*(1-OO(errorout))*(RO(j,errorout)-OO(errorout)); 
     errorrate = RO(j,errorout)-OO(errorout); 
     sumerror = sumerror+(errorrate^2); 
     FinalError(j,errorout) = errorrate; 
    % Compute Error (hidden layer) 
    ersum=0; 
    for errorh=1:hlayer 
     ersum= lamdaout(errorout)*W(errorh,errorout); 
     lamdahidden(errorh)= Oh(errorh)*(1-Oh(errorh))*ersum; 
    end 
    FinalSumError(j) = (1/2)*sumerror; 
    end 

    %update weights between input and hidden layer 
    for h=1:hlayer 
     for k=1:108 
      deltaw(k,h) = learningrate*lamdahidden(h)*trainingdata(j,k); 
      V(k,h) = (m*V(k,h)) + deltaw(k,h); 
     end 
    end 

    %update weights/Theta between hidden and output layer 
    for h=1:hlayer 
     for outl=1:olayer 
      %weight 
      deltaw2(h,outl) = learningrate * lamdaout(outl)*Oh(h); 
      W(h,outl)= (m*W(h,outl))+deltaw2(h,outl); 

     end 
    end 

    for h=1:hlayer 
      %Theta-Hidden 
      deltaHiddenTh(h) = learningrate * lamdahidden(h); 
      Thetahidden(h) = (m*Thetahidden(h)) + deltaHiddenTh(h); 
    end 

    for outl=1:olayer 

      %Theta-Output 
      deltaOutputTh(outl) = learningrate * lamdaout(outl); 
      Thetaoutput(outl) = (m*Thetaoutput(outl)) + deltaOutputTh(outl); 
    end 





end 


end 

ответ

1

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

  • Диапазон инициализации весов должна быть связана с входы, которые сеть собирается обработать have a look here. Есть ли причина, почему в диапазоне [0,1], когда входы находятся в диапазоне [-1,1]?

  • Значение импульса может оказать огромное влияние на конвергенцию. Попробуйте разные значения.

  • Хорошая практика иметь ощущение приятного процесса обучения заключается в том, чтобы нарисовать learning curve, то есть ошибку (MSE в вашем случае) против эпохи обучения. Есть здоровые шаблоны, которые могут дать вам подсказку о том, что происходит.

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

Там еще количество скрытых нейронов, и все вроде винтов, которые необходимо настроить, прежде чем он работает, но на первый взгляд, кажется, что у вас есть очень сложная задача (108 столбцов и 25 результатов как классы) со слишком малым набором данных для обучения (225). Если это так, возможно, вам нужно больше данных ... Или попробуйте другой тип модели вместо нейронных сетей.

Надеюсь, это поможет, получайте удовольствие!

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