2017-03-09 3 views
1

나는 진짜 가치있는 출력을위한 신경 네트워크를 훈련하는 중이 야, 난 그냥 사각형 보간처럼 보이는 네트 보간 된 집합을 제공합니다. 그러나 역 전파는 항상주지 않습니다. 내게 입력에 잘 맞는, 나는 더 높은 값의 입력 및 정상화 된 출력뿐만 아니라 기능을 추가하려고했지만 도움이되지 않습니다. 네트워크가 3 레이어 1 입력 1 숨겨진 1 출력 및 하나 출력 노드 이 문제를 어떻게 해결할 수 있습니까? 나는 또한이 비용 함수를 사용 했습니까?실제 값을 신경 네트워크 backpropagation을 사용하여

for k = 1:m 

    C= C+(y(k)-a2(k))^2; 
end 

내 코드 :

clc; 
clear all; 
close all; 
input_layer_size = 4; 
hidden_layer_size = 60; 
num_labels = 1; 
load('Xs'); 
load('Y-s'); 
theta1=randInitializeWeights(4, 60); 
theta2=randInitializeWeights(60, 1); 
plot (xq,vq) 
hold on 
xq=polyFeatures(xq,4); 
param=[theta1(:) ;theta2(:)]; 

[J ,Grad]= nnCostFunction(param,input_layer_size ,hidden_layer_size,num_labels,xq,vq,0); 

     options = optimset('MaxIter', 50); 
    costFunction = @(p) nnCostFunction(p, ... 
           input_layer_size, ... 
           hidden_layer_size, ... 
           num_labels, xq, vq, 10); 


    [nn_params, cost] = fmincg(costFunction, param, options); 

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)); 

     l=xq(:,1); 
     out =predictTest(Theta1,Theta2,xq); 

      accuracy=mean(double(out == vq)) * 100 
     plot (l,out,'yellow'); 

     hold off 



    function [J grad] = nnCostFunction(nn_params, ... 
     input_layer_size, ... 
     hidden_layer_size, ... 
     num_labels, ... 
     X, y, lambda) 

    y(841:901)=0; 
    y=y/2.2; 

    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)); 


    X= [ones(m,1) X]; 

    z1=X*Theta1'; 
    a1 = sigmoid(z1); 
    a1= [ones(size(a1,1),1) a1]; 
    z2=a1*Theta2'; 
    a2= sigmoid(z2); 


    for k = 1:m 

     J= J+(y(k)-a2(k))^2; 

    end 
    J= J/m; 
    Theta1(:,1)=zeros(1,size(Theta1,1)); 
    Theta2(:,1)=zeros(1,size(Theta2,1)); 
    s1=sum (sum (Theta1.^2)); 
    s2=sum (sum (Theta2.^2)); 

    s3= lambda *(s2 +s1); 
    s3=s3/(2*m); 
    J=J+s3; 

    D2=zeros(size(Theta2)); 
    D1=zeros(size(Theta1)); 
    for i= 1:m 

     delta3=a2(i)-y(i); 
     v=[0 sigmoidGradient(z1(i,:))]; 
     delta2=(Theta2'*delta3').*v'; 



     D2=D2+delta3'*a1(i,:) ; 
     D1=D1+delta2(2:end)*X(i,:); 


    end 


    Theta1_grad = D1./m + (lambda/m)*[zeros(size(Theta1,1), 1) Theta1(:, 2:end)]; 
    Theta2_grad = D2./m + (lambda/m)*[zeros(size(Theta2,1), 1) Theta2(:, 2:end)]; 

    grad = [Theta1_grad(:) ; Theta2_grad(:)]; 


    end 



    function W = randInitializeWeights(L_in, L_out) 


    epsilon_init = 0.5; 
    W = rand(L_out, 1 + L_in)*2*epsilon_init - epsilon_init; 

    end 

입력이 1 : 9 0.01 단위를 보간 대상 0 사이 수있다 : 사각형 펄스와 같은 2.2

linear interpolation of data vs predicted in red

updated after increasing epochs

+0

스택 오버플로에 오신 것을 환영합니다. 네트워크의 토폴로지 및 일부 입력 및 출력 데이터에 대한 자세한 정보를 제공 할 수 있습니까? 가중치 초기화와 함께 전체 알고리즘을 포함하십시오. –

+0

감사합니다. 내용을 업데이트했습니다. –

+0

제공 한 각 입력에 대해 예상되는 출력 데이터의 작은 테이블을 추가 할 수 있습니까? –

답변

0

빨간색 줄은 결코 0이 아닙니다. (가장 낮은 약 0.4) 훈련 무게 결코 제로 네트워크 출력 (내가 무게가 충분한 음수가 될 필요가 의미와 편견이 일부 세포에 부정적인 완전히 누락 여부입니다 중 하나)

  1. 제공 없다는 것을 의미하는 신호를 [-1에서 1]로 스케일하고 충격을보기 위해 네트워크를 훈련하기 위해 가중치와 바이어스를 모두 사용하십시오. 무게와 편견이 모두 필요합니다.
  2. 여기에 사용 된 단순 신경망은 구형파와 같은 시계열 예측에 적합하지 않습니다. 시계열에 here과 같은 예측 모델을 사용하십시오.
+0

내가 matlab에 간단한 피팅 응용 프로그램을 사용할 때 좋은 피팅 출력을 생성합니다. –

+0

단순 피팅은 신경이 아니므로 여기에서 공유 한 트릭을 사용할 수 있습니다.두 점은 '실수 값 신호'를 맞출 때 중요합니다. – SACn