[Java/Alg]Doorlopen van alle inputs van een neuraal net

Pagina: 1
Acties:

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14
Heren,

Ik ben voor de lol een Java-API en programmaatje aan het schrijven dat, op basis van XML-documenten, een neuraal netwerk kan simuleren. Alles werkt tot nu toe, alleen nu wil ik een functie hebben die alle mogelijke configuraties van inputs van het netwerk doorloopt en de daarbij behorende output naar stdout stuurt. Het gaat niet specifiek om de code, maar meer om het algoritme dat ik kan gebruiken om dit te bewerkstelligen.

De functie waar het om gaat:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public static void runThroughAllInputs(NeuralNetwork net)
    {
        InputNode[] inputs = net.getInputNodes();
        
        for (int i = 0; i < inputs.length; i++)
        {
            if (!inputs[i].isFixed())
                inputs[i].setValue(0);
        }
        
        int possibleConfigs = 1 << inputs.length; // 2 ^ inputs.length
        for (int i = 0; i < possibleConfigs; i++)
        {
            // ???
        }
    }


Voor de duidelijkheid: een netwerk kan een willekeurige hoeveelheid InputNodes bevatten, en die kunnen alleen de waarden 1 en 0 hebben.

TheStreme - Share anything with anyone


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Je kunt de bits van 'i' gebruiken om de waarde van elke input te te bepalen voor configuratie 'i':
Java:
1
2
3
4
5
6
7
8
9
for (int i = 0; i < possibleConfigs; ++i) 
{
    for (int j = 0; j < inputs.length; ++j)
    {
        int bit_j = (i >> j) & 1;
        set input 'j' to value 'bit_j';
    }
    evaluate output;
}

Denk er wel aan dat dit systeem alleen werkt zolang je Java integer groot genoeg is om alle configuraties in op te slaan. Dat gaat dus goed met maximaal 31 inputs (maar veel meer wil je toch niet handmatig evalueren).

Als een deel van je inputs vast staan is deze loop misschien onnodig kostbaar (ook omdat je elke keer alle bits opnieuw instelt). Dan kun je beter geen backtracken. Eventueel kan ik je wel laten zien hoe je die backtracking ook iteratief kunt programmeren, voor optimale efficientie. Dat heeft natuurlijk alleen nut als deze lus performance problemen veroorzaakt (en dus belangrijker is dan de evaluatiefunctie).

[ Voor 58% gewijzigd door Soultaker op 19-10-2003 17:46 ]


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14
Soultaker schreef op 19 October 2003 @ 17:12:
Je kunt de bits van 'i' gebruiken om de waarde van elke input te te bepalen voor configuratie 'i':
Java:
1
2
3
4
5
6
7
8
9
for (int i = 0; i < possibleConfigs; ++i) 
{
    for (int j = 0; j < inputs.length; ++j)
    {
        int bit_j = (i >> j) & 1;
        set input 'j' to value 'bit_j';
    }
    evaluate output;
}

Denk er wel aan dat dit systeem alleen werkt zolang je Java integer groot genoeg is om alle configuraties in op te slaan. Dat gaat dus goed met maximaal 31 inputs (maar veel meer wil je toch niet handmatig evalueren).

Als een deel van je inputs vast staan is deze loop misschien onnodig kostbaar (ook omdat je elke keer alle bits opnieuw instelt). Dan kun je beter geen backtracken. Eventueel kan ik je wel laten zien hoe je die backtracking ook iteratief kunt programmeren, voor optimale efficientie. Dat heeft natuurlijk alleen nut als deze lus performance problemen veroorzaakt (en dus belangrijker is dan de evaluatiefunctie).
Dit werkt, bedankt. _/-\o_

TheStreme - Share anything with anyone


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Java kent toch ook een BitString klasse oid, waar je in principe bitstrings van oneindige grootte in kunt opslaan?

.edit: ah, een BitSet

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.