Potřebujete pomoc s správa serverů?
RSS ikona Email icon Domů ikona
  • Backpropagation a C + +

    No comments Publikováno dne 30.května 2009 servbit1 žádné komentáře

    Na doporučení kolegy tvoří kodér, jsem reposting tuto otázku zde.

    Nikdy Zdá se, že si backpropagation právo, a pokaždé jsem požádat o pomoc, nikdo se zdá být schopni odpovědět, nebo jejich návrhy neřeší problém. Tak jsem myslel, že jsem mohl požádat o pomoc z jiného úhlu - mé třídy bez backprop algoritmus.
    Může mi někdo říct, postup pro backpropagating, založený na zdroj dole? Jenom musíte vědět, jak backpropagation algoritmus bude pracovat v mé třídě nastavení (I've been trying až k brát zatraceně věc po dobu 2 let - jasně jsem používáte špatný přístup).

    # include
    # include
    # include

    třída neuron
    (
    public:
    float ** vstup;
    float * hmotnost;
    unsigned numInputs;
    float výstup;
    float figuríny, / / pro vrácení špatné reference

    neuron (unsigned input_numInputs);
    neuron ();
    void obnovit (unsigned input_numInputs);
    ~ neuron ();
    void setInput (neuron & n, unsigned inputIndex);
    void setInput (float & floatInput, nesignováno inputIndex);
    float & getInput (unsigned inputIndex);
    void recalc ();
    void setWeight (unsigned inputIndex, float value);
    );

    třída neuralNetwork
    (
    public:
    unsigned numInputLayer;
    unsigned numHiddenLayer;
    unsigned numInputs;
    float * vstup;
    neuron * inputLayer;
    neuron * hiddenLayer;
    neuron outputLayer;

    neuralNetwork (unsigned input_numInputs, nesignováno input_numInputLayer, nesignováno input_numHiddenLayer);
    ~ neuralNetwork ();
    );

    float XOR (float Input1, float Input2, float biasLower = 0.0f, float biasUpper = 1.0f);

    void neuron:: setWeight (unsigned inputIndex, float hodnota)
    (
    if (inputIndex> = numInputs)
    return;
    hmotnost [inputIndex] = hodnota;
    )
    void neuron:: recalc ()
    (
    if (numInputs <= 0)
    return;
    float weightedInput = 0.0f;
    for (unsigned i = 0; i = numInputs)
    return;
    jiné
    příkon [inputIndex] = &floatInput;
    )
    float & neuron:: getInput (unsigned inputIndex)
    (
    if (inputIndex> = numInputs)
    return (figuríny);
    jiné
    return (vstup [inputIndex] [0]);
    )
    neuron:: neuron ()
    (
    numInputs = 0;
    )
    neuron:: neuron (unsigned input_numInputs)
    (
    numInputs = 0;
    obnovit (input_numInputs);
    )
    void neuron:: obnovit (unsigned input_numInputs)
    (
    if (numInputs> 0)
    (
    delete [] input;
    delete [] hmotnosti;
    )
    numInputs = input_numInputs;
    vstup = new float * [numInputs];
    Hmotnost = new float [numInputs];
    )
    neuron:: ~ neuron ()
    (
    if (numInputs> = 0)
    (
    smazat vstup;
    smazat hmotnost;
    )
    )
    void neuron:: setInput (neuron & n, unsigned inputIndex)
    (
    if (inputIndex> = numInputs)
    return;
    příkon [inputIndex] = & n.output;
    )

    neuralNetwork:: neuralNetwork (unsigned input_numInputs, nesignováno input_numInputLayer, nesignováno input_numHiddenLayer)
    (
    unsigned i, j;
    numInputs = input_numInputs;
    numHiddenLayer = input_numHiddenLayer;
    numInputLayer = input_numInputLayer;
    vstup = new float [numInputs];
    inputLayer = new neuron [numInputLayer];

    hiddenLayer = new neuron [numHiddenLayer];
    outputLayer.rebuild (numHiddenLayer);
    for (i = 0; i <numHiddenLayer; i + +)
    (
    hiddenLayer [i]. obnovit (numInputLayer);
    outputLayer.setInput (hiddenLayer [i], i);
    )
    for (i = 0; i <numInputLayer; i + +)
    (
    inputLayer [i]. obnovit (numInputs);
    for (j = 0; j <numHiddenLayer j + +)
    hiddenLayer [j]. setInput (inputLayer [i], i);
    )
    for (i = 0; i <numInputs; i + +)
    for (j = 0; j 0)
    smazat vstup;
    if (numInputLayer> 0)
    delete [] inputLayer;
    if (numHiddenLayer> 0)
    delete [] hiddenLayer;

    )

    float XOR (float Input1, float Input2, biasLower float, float biasUpper)
    (
    float correctedInput1, correctedInput2;
    if (Input1 <((biasLower + biasUpper) / 2.0f))
    correctedInput1 = biasLower;
    jiné
    correctedInput1 = biasUpper;
    if (Input2 <((biasLower + biasUpper) / 2.0f))
    correctedInput2 = biasLower;
    jiné
    correctedInput2 = biasUpper;
    if (correctedInput1 == correctedInput2)
    (
    return (biasLower);
    )
    jiné
    (
    return (biasUpper);
    )
    )

    int main (int argc, char * argv [])
    (
    neuralNetwork nn (2,2,1);
    cout << "Hotovo!" <<endl;
    getch ();
    return 0;
    )

    - Crash Matrix

    Jít: Po backpropagation je kód, který jsem použít (která, mimochodem, nefunguje).

    void neuralNetwork:: backpropagate (float target)
    (
    if (numInputs == 0 | | numInputLayer == 0 | | numHiddenLayer == 0)
    return;
    float deltaOutput;
    float * deltaHidden = new float [numHiddenLayer];
    unsigned i, j;
    / *
    Všimněte si, že existují dva výstupy zde:
    1) Výstup aktivní vrstvy určuje hodnota delta,
    2) výstup neuron připojen ke vstupu současných neuron je používán v
    novou úpravu hmotnosti.
    * /
    / / Do výstupu první vrstva
    deltaOutput = (cíl - outputLayer.output) * outputLayer.output * (1.0f - outputLayer.output);
    for (i = 0; i <numHiddenLayer; i + +)
    outputLayer.weight [i] + = learnRate * deltaOutput * hiddenLayer [i]. výstupu;
    / / Teď skrytá vrstva
    for (j = 0; j <numHiddenLayer j + +)
    (
    deltaHidden [j] = outputLayer.weight [j] * deltaOutput *
    hiddenLayer [j]. output * (1.0f - hiddenLayer [j]. output);
    for (i = 0; i <numInputLayer; i + +)
    (
    hiddenLayer [j]. hmotnost [i] + = deltaHidden [j] * learnRate * inputLayer [i]. výstupu;
    )
    )
    )

    A jak jsem běžet, že je takto:

    unsigned i, j, k;
    neuralNetwork nn (2,2,1);
    for (k = 0; k <100000, k + +)
    (
    for (i = 0; i <2; i + +)
    for (j = 0; j <2; j + +)
    (
    nn.input [0] = (float) i;
    nn.input [1] = (float) j;
    nn.recalc ();
    nn.backpropagate (XOR ((float) i, (float) j));
    if (k == 0 | | k == 99999)
    (
    nn.recalc ();
    cout <<i << "XOR" <<j < "<<nn.outputLayer.output <<" by měla být "<<XOR ((float) i, (float) j) <<endl;
    )
    )
    if (k == 0 | | k == 99999)
    cout <<endl;
    )

    Já vím, nemám nastavit přesný omezovač na to. Ale výstupy nikdy blíž než 0,4 z 1,0 (nízké a vysoké jsou 0.0 a 1.0 a výstupy, respektive nikdy jít mimo 0.45 a 0.55). Výstupy by se měla přesunout směrem k 1.0 a 0.0 (samozřejmě), ale oni ne.
    Nějaké nápady, co se děje?

    Omlouváme se, vlastně jsem měl další změnu tak, že skryté hmotnost úpravy nejsou vždy stejné,
    (což by bylo jako mít pouze jedno skryté hmotnosti)
    tak jsem také změnil
    hiddenLayer [j]. setInput (inputLayer [i], i);
    do
    (
    hiddenLayer [j]. setInput (inputLayer [i], i);
    hiddenLayer [j]. setWeight (i, 2.0 * rand () / RAND_MAX-1);
    )

    Zanechte odpověď

    Musíte být přihlášeni, abyste mohl psát komentář.