Trebate pomoć administriranje poslužitelja?
RSS icon E-pošta ikona Home icon
  • Backpropagation i C + +

    No comments Posted on 30 svibanj 2009 servbit1 No comments

    Na preporuku kolege koder s promijenjenom obliku, I'm reposting ovo pitanje ovdje.

    Ja nikada ne mogu činiti se da biste dobili backpropagation desno, i svaki put sam pitati za pomoć, nitko se čini da bi mogli odgovoriti ili njihovi prijedlozi ne riješi problem. Dakle, ja sam mislio možda tražiti pomoć od različitih točke - moja klasa bez backprop algoritam.
    Može bilo tko reći mene postupak za backpropagating, na temelju izvor ispod? Ja samo treba znati kako backpropagation algoritam će raditi za moj razred postava (Ive 'bio težak da biste dobili darned stvar za 2 godine - jasno sam koristeći krivi pristup).

    # include
    # include
    # include

    klasa neuronske
    (
    public:
    float ** ulaz;
    float * weight;
    unsigned numInputs;
    float output;
    float lažan; / / za povratak loše reference

    neurona (nepotpisani input_numInputs);
    neuron ();
    void obnoviti (nepotpisani input_numInputs);
    ~ neuron ();
    void setInput (neuronske & n, nepotpisani inputIndex);
    void setInput (float & floatInput, nepotpisani inputIndex);
    float & getInput (nepotpisani inputIndex);
    void recalc ();
    void setWeight (nepotpisan inputIndex, float vrijednost);
    );

    klasa neuralNetwork
    (
    public:
    unsigned numInputLayer;
    unsigned numHiddenLayer;
    unsigned numInputs;
    float * input;
    neuron * inputLayer;
    neuron * hiddenLayer;
    neuronske outputLayer;

    neuralNetwork (nepotpisan input_numInputs, input_numInputLayer ružan, ružan input_numHiddenLayer);
    ~ neuralNetwork ();
    );

    float XOR (float input1, input2 plutaju, plutaju biasLower = 0.0f, plutaju biasUpper = 1.0f);

    praznina neuronske:: setWeight (nepotpisan inputIndex, float vrijednost)
    (
    if (inputIndex> = numInputs)
    return;
    težina [inputIndex] = vrijednost;
    )
    praznina neuronske:: recalc ()
    (
    if (numInputs <= 0)
    return;
    float weightedInput = 0.0f;
    for (unsigned i = 0; i = numInputs)
    return;
    drugi
    input [inputIndex] = &floatInput;
    )
    float i neuronske:: getInput (nepotpisani inputIndex)
    (
    if (inputIndex> = numInputs)
    return (dummy);
    drugi
    return (input [inputIndex] [0]);
    )
    neuronske:: neuron ()
    (
    numInputs = 0;
    )
    neuronske:: neurona (nepotpisani input_numInputs)
    (
    numInputs = 0;
    remontovati (input_numInputs);
    )
    praznina neuronske:: obnoviti (nepotpisani input_numInputs)
    (
    if (numInputs> 0)
    (
    delete [] ulaz;
    delete [] težine;
    )
    numInputs = input_numInputs;
    input = new float * [numInputs];
    težina = new float [numInputs];
    )
    neuronske:: ~ neuron ()
    (
    if (numInputs> = 0)
    (
    izbrisati ulaz;
    brisanje weight;
    )
    )
    praznina neuronske:: setInput (neuronske & n, unsigned inputIndex)
    (
    if (inputIndex> = numInputs)
    return;
    input [inputIndex] = & n.output;
    )

    neuralNetwork:: neuralNetwork (input_numInputs ružan, ružan input_numInputLayer, unsigned input_numHiddenLayer)
    (
    ružan i, j;
    numInputs = input_numInputs;
    numHiddenLayer = input_numHiddenLayer;
    numInputLayer = input_numInputLayer;
    input = new float [numInputs];
    inputLayer = new neuronske [numInputLayer];

    hiddenLayer = new neuronske [numHiddenLayer];
    outputLayer.rebuild (numHiddenLayer);
    for (i = 0; i <numHiddenLayer; i + +)
    (
    hiddenLayer [i]. obnoviti (numInputLayer);
    outputLayer.setInput (hiddenLayer [i], i);
    )
    for (i = 0; i <numInputLayer; i + +)
    (
    inputLayer [i]. obnoviti (numInputs);
    for (j = 0; j <numHiddenLayer; j + +)
    hiddenLayer [j]. setInput (inputLayer [i], i);
    )
    for (i = 0; i <numInputs; i + +)
    for (j = 0; j 0)
    izbrisati ulaz;
    if (numInputLayer> 0)
    delete [] inputLayer;
    if (numHiddenLayer> 0)
    delete [] hiddenLayer;

    )

    float XOR (input1 float, float input2, biasLower plutaju, plutaju biasUpper)
    (
    float correctedInput1, correctedInput2;
    if (input1 <((biasLower + biasUpper) / 2.0f))
    correctedInput1 = biasLower;
    drugi
    correctedInput1 = biasUpper;
    if (input2 <((biasLower + biasUpper) / 2.0f))
    correctedInput2 = biasLower;
    drugi
    correctedInput2 = biasUpper;
    if (correctedInput1 == correctedInput2)
    (
    return (biasLower);
    )
    drugi
    (
    return (biasUpper);
    )
    )

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

    - Crash Matrix

    Followup: Nakon što je backpropagation kod JA korist (koja, btw, ne radi).

    praznina neuralNetwork:: backpropagate (float target)
    (
    if (numInputs == 0 | | numInputLayer == 0 | | numHiddenLayer == 0)
    return;
    float deltaOutput;
    float * deltaHidden = new float [numHiddenLayer];
    ružan i, j;
    / *
    Imajte na umu da postoje dva izlaza se ovdje:
    1) izlaz iz trenutne sloja određuje delta vrijednost,
    2) izlaz iz neuronske spojeni na ulaz od struje neuronske se koristi u
    podešavanje težine.
    * /
    / / Nemojte izlaz prvi sloj
    deltaOutput = (cilj - outputLayer.output) * outputLayer.output * (1.0f - outputLayer.output);
    for (i = 0; i <numHiddenLayer; i + +)
    outputLayer.weight [i] + = learnRate * deltaOutput * hiddenLayer [i]. output;
    / / Sada ne skriveni sloj
    for (j = 0; j <numHiddenLayer; j + +)
    (
    deltaHidden [j] = outputLayer.weight [j] * deltaOutput *
    hiddenLayer [j]. izlaz * (1.0f - hiddenLayer [j]. izlaz);
    for (i = 0; i <numInputLayer; i + +)
    (
    hiddenLayer [j]. mase [i] + = deltaHidden [j] * learnRate * inputLayer [i]. output;
    )
    )
    )

    A način na koji sam trčanje je kako slijedi:

    ružan i, j, k;
    neuralNetwork nn (2,2,1);
    for (k = 0; k <100,000; 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 << "DOT" <<j < "<<nn.outputLayer.output <<" bi trebao biti "<<XOR ((float) i, (float) j) <<endl;
    )
    )
    if (k == 0 | | k == 99999)
    cout <<endl;
    )

    Ja znam, ja ne postavite precizno limiter na njemu. Ali, nikad ne izlazi bilo bliže od 0,4 out of 1.0 (niske i visoke su 0.0 i 1.0 odnosno te izlazi nikada ići izvan 0,45 i 0,55). Izlaza trebao kretati ka 1.0 i 0,0 (očito), ali oni to ne čine.
    Bilo koji ideja što nije u redu?

    Žao mi je, zaista imala je još jednu promjenu, tako da se skrivenim težina podešavanja nisu uvijek potpuno isti,
    (što bi bilo kao da imate samo jedan skriveni težinu)
    pa sam se promijenio
    hiddenLayer [j]. setInput (inputLayer [i], i);
    za
    (
    hiddenLayer [j]. setInput (inputLayer [i], i);
    hiddenLayer [j]. setWeight (I, 2.0 * rand () / RAND_MAX-1);
    )

    Ostavite odgovor

    Morate biti prijavljeni da biste napisati komentar.