Start · Sprachen · PHP · Referenz · fann_init_weights

fann_init_weights

Funktion

Initialisiert die Gewichte eines neuronalen Netzes mit dem Widrow-und-Nguyen-Algorithmus basierend auf den Trainingsdaten.

Kategorie: misc

Signatur

fann_init_weights(resource $ann, resource $train_data): bool

Beschreibung

fann_init_weights setzt die Gewichte (Weights) eines FANN-Netzwerks (Fast Artificial Neural Network) mithilfe des Widrow-und-Nguyen-Algorithmus. Dieser Algorithmus berechnet initiale Gewichtswerte, die besser auf die tatsächlichen Trainingsdaten abgestimmt sind als rein zufällig gewählte Startwerte.

Im Gegensatz zu einer einfachen zufälligen Initialisierung berücksichtigt dieser Algorithmus die Verteilung der Eingabedaten und die Netzwerkstruktur, um die Konvergenz beim Training zu beschleunigen. Das Verfahren wurde von Bernard Widrow und Michael Nguyen entwickelt und ist besonders für mehrschichtige Feedforward-Netzwerke geeignet.

Die Funktion ist nützlich, wenn eine möglichst gute Ausgangssituation vor dem eigentlichen Training mit fann_train_on_data oder fann_train_on_file gewünscht wird. Sie sollte aufgerufen werden, nachdem das Netzwerk erstellt und die Trainingsdaten geladen wurden, aber bevor das Training gestartet wird.

Hinweis: Diese Funktion ist Teil der FANN-Erweiterung für PHP und steht nur zur Verfügung, wenn diese Erweiterung installiert ist.

Parameter

Name Typ Default Beschreibung
$ann Pflicht resource Eine FANN-Netzwerk-Ressource, die zuvor mit Funktionen wie fann_create_standard oder fann_create_shortcut erstellt wurde.
$train_data Pflicht resource Eine FANN-Trainingsdaten-Ressource, die zuvor mit fann_read_train_from_file oder fann_create_train geladen bzw. erstellt wurde. Der Algorithmus nutzt diese Daten zur Berechnung der optimalen Startgewichte.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Initialisierung erfolgreich war, andernfalls false.

Beispiele

Netzwerk erstellen, Trainingsdaten laden und Gewichte initialisieren

<?php
// Netzwerk mit 3 Schichten erstellen: 2 Eingaben, 3 versteckte Neuronen, 1 Ausgabe
$ann = fann_create_standard(3, 2, 3, 1);

if ($ann) {
    // Aktivierungsfunktion für versteckte Schicht setzen
    fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

    // Trainingsdaten aus Datei laden (z. B. XOR-Problem)
    $train_data = fann_read_train_from_file('xor.data');

    if ($train_data) {
        // Gewichte mit Widrow-Nguyen-Algorithmus initialisieren
        if (fann_init_weights($ann, $train_data)) {
            echo "Gewichte erfolgreich initialisiert." . PHP_EOL;

            // Training starten
            fann_train_on_data($ann, $train_data, 500, 10, 0.001);

            // Netzwerk speichern
            fann_save($ann, 'xor_trained.net');
        } else {
            echo "Fehler bei der Gewichtsinitialisierung." . PHP_EOL;
        }

        fann_destroy_train($train_data);
    }

    fann_destroy($ann);
}
Gewichte erfolgreich initialisiert.

Vergleich: Training mit und ohne Widrow-Nguyen-Initialisierung

<?php
// Hilfsfunktion: Erstellt und trainiert ein Netz, gibt benötigte Epochen zurück
function trainNetwork(bool $useWidrowNguyen, resource $train_data): int {
    $ann = fann_create_standard(3, 2, 4, 1);
    fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_train_stop_function($ann, FANN_STOPFUNC_MSE);
    fann_set_training_algorithm($ann, FANN_TRAIN_RPROP);

    if ($useWidrowNguyen) {
        fann_init_weights($ann, $train_data);
    }

    // Bis zu 1000 Epochen, MSE-Ziel: 0.01
    fann_train_on_data($ann, $train_data, 1000, 0, 0.01);
    $epochs = fann_get_total_epochs($ann);

    fann_destroy($ann);
    return $epochs;
}

$train_data = fann_read_train_from_file('xor.data');

$epochsWithInit    = trainNetwork(true,  $train_data);
$epochsWithoutInit = trainNetwork(false, $train_data);

echo "Mit Widrow-Nguyen: {$epochsWithInit} Epochen" . PHP_EOL;
echo "Ohne Initialisierung: {$epochsWithoutInit} Epochen" . PHP_EOL;

fann_destroy_train($train_data);
Mit Widrow-Nguyen: 87 Epochen ohne Initialisierung: 243 Epochen

// Wichtig · Fallstricke

Erweiterungsabhängigkeit: Die FANN-Erweiterung ist nicht standardmäßig in PHP enthalten. Sie muss über PECL (pecl install fann) installiert werden. Überprüfe die Verfügbarkeit mit extension_loaded('fann').

Reihenfolge beachten: fann_init_weights sollte nach dem Setzen aller Netzwerkparameter (z. B. Aktivierungsfunktionen, Lernrate) und vor dem Start des Trainings aufgerufen werden, da das Training die Gewichte sonst von einem ungünstigeren Startzustand aus optimieren muss.

Kein Ersatz für das Training: Die Initialisierung verbessert den Startpunkt, ersetzt aber nicht das eigentliche Training. Sie kann jedoch die Trainingsdauer deutlich verkürzen und die Wahrscheinlichkeit erhöhen, ein gutes Minimum zu finden.