Signatur
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
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);
}
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);
// 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.