2016-09-29 142 views
-2

我寫了一個多層感知器應該能夠學習異或。但是,無論我做什麼,輸入(1,1),(0,1)和(1,0)都會收斂到0.5的輸出。而對於輸入(0,0)它會收斂到零。有誰知道我的錯誤在哪裏?神經網絡不學習異或(收斂到0.5輸出)

直傳:

void MLP::feedforward() { 
    for(int hidden = 0; hidden < nHidden; hidden++) { 
    hiddenNeurons.at(hidden) = 0; 

    for(int input = 0 ; input < nInput; input ++) { 

    hiddenNeurons.at(hidden) += inputNeurons.at(input)*weightItoH(input,hidden); 
    } 
} 

//Propagate towards the output layer 
for(int i =0; i< nOutput; i ++) { 
    outputNeurons.at(i) = 0; 

    for(int j = 0; j <nHidden; j++) { 
    outputNeurons.at(i) += hiddenNeurons.at(j) * weightHtoO(j,i); 
    } 

    outputNeurons.at(i) = sigmoid(outputNeurons.at(i)); 
} 
} 

反向傳播:

void MLP::backPropagation(int i) { 
    float learningRate = 0.75; 
    float error = desiredOutput[i] - outputNeurons[0]; 

// Calculate delta for output layer 
for(int i=0; i<nOutput; i++) { 
    outputDelta.at(i) = error * dersigmoid(outputNeurons[i]); 
} 

//Calculate delta for hidden layer 
for(int i = 0; i < nHidden; i++) { 
    hiddenDelta.at(i) = 0;//zero the values from the previous iteration 

    //add to the delta for each connection with an output neuron 
    for(int j = 0; j < nOutput; j ++) { 
     hiddenDelta.at(i) += outputDelta.at(j) * weightHtoO(i,j) ; 
    } 
} 

//Adjust weights Input to Hidden 
for(int i = 0; i < nInput; i ++) { 
    for(int j = 0; j < nHidden; j ++) { 
     weightItoH(i,j) += learningRate * hiddenDelta.at(j); 
    } 
} 

//Adjust weights hidden to Output 
for(int i = 0; i < nOutput; i++) { 
    for(int j = 0; j < nHidden; j ++) { 
     weightHtoO(j,i) += learningRate * outputDelta.at(i) * hiddenNeurons.at(j); 
    } 
} 

} 

輸入

nInputPatterns = 4; 

inputPatterns.assign(nInputPatterns, vector<int>(2)); 

inputPatterns[0][0] = 1; 
inputPatterns[0][1] = 1; 
inputPatterns[1][0] = 0; 
inputPatterns[1][1] = 1; 
inputPatterns[2][0] = 1; 
inputPatterns[2][1] = 0; 
inputPatterns[3][0] = 0; 
inputPatterns[3][1] = 0; 

desiredOutput = {0,1,1,0}; 

乙狀結腸函數和宏的

#define sigmoid(value) (1/(1+exp(-value))); 
#define dersigmoid(value) (value*(1-value)); 

//Macro's 
#define weightItoH(input,hidden) weightsIH.at(nInput*hidden+input) 
#define weightHtoO(hidden,output) weightsHO.at(nHidden*output+hidden) 

C++文件:http://pastebin.com/8URZAHSy 頭文件:http://pastebin.com/YiMXpmZX

+2

你可以縮小你的代碼到一個小例子,並把它放在問題的內聯,而不是提供鏈接? – Hayt

+0

@Hayt:不 - 你不能在一個小的C++示例中編寫一個可訓練的神經網絡。 – MSalters

+0

我在上面的代碼中添加了重要的部分。我還將使用pastebin添加完整的文件。非常感謝您的光顧。 – Stefan1993

回答

1

沒有隨機初始化。這是打破對稱性所必需的;否則所有的神經元都會學習完全相同的值。這與有一個神經元的效果是一樣的,一個神經元對XOR不足。

+0

所以權重需要隨機初始化?例如-0.5和0.5之間? – Stefan1993

+1

如果我這樣做,輸出達到:0.5 0.5 0.8 0.0。 XOR的位置應該是0 1 1 0.這是100000個紀元。我糾正了3個隱藏節點,它應該能夠學習XOR而沒有偏見? – Stefan1993

+1

絕對是一個改進,但是有3個節點應該足夠了。 – MSalters