需要幫助的服務器管理?
RSS圖標 郵箱圖標 主頁圖標
  • BP算法和C + +

    No comments 發布於09年5月30日 servbit1 沒有評論

    在同伴的建議的形式編碼,我第三百九十這個問題在這裡。

    我似乎從未得到反向傳播權,每一次我請求幫助,似乎沒有人能夠回答,或者他們的建議不解決問題。 所以,我想我可能會尋求幫助,從一個不同的問題-我的課沒有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);

    留下回复

    您必須登錄張貼評論。