BP算法和C + +
在同伴的建議的形式編碼,我第三百九十這個問題在這裡。
我似乎從未得到反向傳播權,每一次我請求幫助,似乎沒有人能夠回答,或者他們的建議不解決問題。 所以,我想我可能會尋求幫助,從一個不同的問題-我的課沒有backprop算法。
誰能告訴我程序backpropagating的基礎上,源頭以下? 我只是需要知道如何BP算法將努力為我的班級設置(我一直試圖讓該死的東西現在2年-顯然,我使用了錯誤的方法)。#包括:
#包括:
#包括:類神經元
(
市民:
浮動**輸入;
浮動*重量;
無符號numInputs;
浮動輸出;
浮動假; / /返回的錯誤引用神經元(無符號input_numInputs);
神經元();
無效重建(符號input_numInputs);
〜神經元();
無效setInput(元安貿易,符號inputIndex);
無效setInput(浮動&floatInput,符號inputIndex);
浮動&getInput(符號inputIndex);
無效recalc();
無效setWeight(符號inputIndex,浮點值);
);類neuralNetwork
(
市民:
無符號numInputLayer;
無符號numHiddenLayer;
無符號numInputs;
浮動*輸入;
神經元* inputLayer;
神經元* hiddenLayer;
神經元outputLayer;neuralNetwork(符號input_numInputs,符號input_numInputLayer,符號input_numHiddenLayer);
〜neuralNetwork();
);異或浮動(浮動輸入1,浮動input2,浮動biasLower = 0.0f,浮動biasUpper = 1.0f);
無效神經元::setWeight(符號inputIndex,浮點數)
(
如果(inputIndex“= numInputs)
返回;
重量[inputIndex] =值;
)
無效神經元::recalc()
(
如果(numInputs“= 0)
返回;
浮動weightedInput = 0.0f;
對(無符號= 0;我= numInputs)
返回;
其他的
輸入[inputIndex] = &floatInput;
)
浮動與神經元::getInput(無符號inputIndex)
(
如果(inputIndex“= numInputs)
返回(假);
其他的
返回(輸入[inputIndex] [0]);
)
神經元::神經元()
(
numInputs = 0;
)
神經元::神經元(無符號input_numInputs)
(
numInputs = 0;
重建(input_numInputs);
)
無效神經元::重建(無符號input_numInputs)
(
如果(numInputs“0)
(
刪除[]的投入;
刪除[]重量;
)
numInputs = input_numInputs;
輸入=新的浮動* [numInputs];
重量=新的浮動[numInputs];
)
神經元::〜神經元()
(
如果(numInputs“= 0)
(
刪除輸入;
刪除重量;
)
)
無效神經元::setInput(元安貿易,符號inputIndex)
(
如果(inputIndex“= numInputs)
返回;
輸入[inputIndex] =&n.output;
)neuralNetwork::neuralNetwork(符號input_numInputs,符號input_numInputLayer,符號input_numHiddenLayer)
(
未簽名的我,焦耳;
numInputs = input_numInputs;
numHiddenLayer = input_numHiddenLayer;
numInputLayer = input_numInputLayer;
輸入=新的浮動[numInputs];
inputLayer =新的神經元[numInputLayer];hiddenLayer =新的神經元[numHiddenLayer];
outputLayer.rebuild(numHiddenLayer);
為(1 = 0;“numHiddenLayer,我+ +)
(
hiddenLayer [一]。重建(numInputLayer);
outputLayer.setInput(hiddenLayer [一],1);
)
為(1 = 0;“numInputLayer,我+ +)
(
inputLayer [一]。重建(numInputs);
為(十= 0; ĵ“numHiddenLayer; ĵ + +)
hiddenLayer研究[J]。setInput(inputLayer [一],1);
)
為(1 = 0;“numInputs,我+ +)
為(十= 0; ĵ 0)
刪除輸入;
如果(numInputLayer“0)
刪除[] inputLayer;
如果(numHiddenLayer“0)
刪除[] hiddenLayer;)
異或浮動(浮動輸入1,浮動input2,biasLower浮動,浮動biasUpper)
(
浮動correctedInput1,correctedInput2;
如果(輸入1“((biasLower + biasUpper)/ 2.0f))
correctedInput1 = biasLower;
其他的
correctedInput1 = biasUpper;
如果(input2“((biasLower + biasUpper)/ 2.0f))
correctedInput2 = biasLower;
其他的
correctedInput2 = biasUpper;
如果(correctedInput1 == correctedInput2)
(
返回(biasLower);
)
其他的
(
返回(biasUpper);
)
)廉政主體(廉政argc,燒焦* argv [])
(
neuralNetwork神經網絡(2,2,1);
法院“”“”好吧!“”endl;
參考getch();
返回0;
)-碰撞矩陣
後續:以下是我使用反向傳播代碼(其中,btw,不工作)。
無效neuralNetwork::backpropagate(浮動目標)
(
如果(numInputs == 0 | | numInputLayer == 0 | | numHiddenLayer == 0)
返回;
浮動deltaOutput;
浮動* deltaHidden =新的浮動[numHiddenLayer];
未簽名的我,焦耳;
/ *
請注意,有兩個輸出用在這裡:
1)的輸出電流層決定了三角洲的價值,
2)的輸出神經元連接到輸入當前使用的神經元
調整的重量。
* /
/ /你的第一個輸出層
deltaOutput =(目標- outputLayer.output)* outputLayer.output *(1.0f - outputLayer.output);
為(1 = 0;“numHiddenLayer,我+ +)
outputLayer.weight [一] + = learnRate * deltaOutput * hiddenLayer [一]。輸出;
/ /現在做的隱層
為(十= 0; ĵ“numHiddenLayer; ĵ + +)
(
deltaHidden研究[J] = outputLayer.weight研究[J] * deltaOutput *
hiddenLayer研究[J]。輸出*(1.0f - hiddenLayer研究[J]。輸出);
為(1 = 0;“numInputLayer,我+ +)
(
hiddenLayer研究[J]。重量[一] + = deltaHidden研究[J] * learnRate * inputLayer [一]。輸出;
)
)
)就是我和運行如下:
未簽名的我,J型,K;
neuralNetwork神經網絡(2,2,1);
為(金= 0;畝“100000;鉀+)
(
為(1 = 0;“2,我+ +)
為(十= 0; ĵ“2; ĵ + +)
(
nn.input [0] =(浮動)我;
nn.input [1] =(浮動)焦耳;
nn.recalc();
nn.backpropagate(異或((浮動)一,(浮動)j)條);
如果(金== 0 | |畝== 99999)
(
nn.recalc();
法院“”i“”“異”,“”ĵ“”“”nn.outputLayer.output“”“應為”“”異或((浮動)一,(浮動)j)條“”endl;
)
)
如果(金== 0 | |畝== 99999)
法院“”endl;
)我知道,我沒有設置限它的精度。 但是,從來沒有提出任何產出比接近0.4出1.0(低,高為0.0和1.0分別產出從來沒有到外面的0.45和0.55)。 輸出應該走向1.0和0.0(明顯),但他們沒有。
任何想法有什麼不對?對不起,我其實是有一個變化,使隱藏的重量調整並不總是完全一樣,
(這將是就像只有一個隱藏的重量)
所以我也發生了變化
hiddenLayer研究[J]。setInput(inputLayer [一],1);
至
(
hiddenLayer研究[J]。setInput(inputLayer [一],1);
hiddenLayer研究[J]。setWeight(一,2.0 *蘭特()/ RAND_MAX - 1);
)





最近評論