Signatur
Beschreibung
fann_subset_train_data() extrahiert einen zusammenhängenden Ausschnitt aus einem bestehenden FANN-Trainingsdatensatz und gibt ihn als neuen, unabhängigen Trainingsdaten-Ressource zurück. Der ursprüngliche Datensatz bleibt dabei unverändert.
Die Funktion ist besonders nützlich, wenn man einen großen Trainingsdatensatz in separate Teile aufteilen möchte – zum Beispiel für Kreuzvalidierung (Cross-Validation) oder um Trainings- und Validierungssätze zu separieren. Statt den gesamten Datensatz mehrfach im Speicher zu halten, können gezielt kleine Teilmengen erzeugt und nach dem Training wieder freigegeben werden.
Die zurückgegebene Ressource muss nach der Verwendung mit fann_destroy_train() freigegeben werden, um Speicherlecks zu vermeiden. Die Nummerierung der Positionen beginnt bei 0.
Die Funktion gehört zur FANN-Erweiterung (Fast Artificial Neural Network Library) und steht nur zur Verfügung, wenn PHP mit der FANN-Extension kompiliert wurde.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | resource | Eine gültige FANN-Trainingsdaten-Ressource, wie sie von fann_read_train_from_file() oder fann_create_train() erstellt wurde. |
|
| $pos Pflicht | int | Die nullbasierte Startposition innerhalb des Trainingsdatensatzes, ab der die Teilmenge beginnen soll. | |
| $length Pflicht | int | Die Anzahl der Trainingsbeispiele (Datenpunkte), die in die Teilmenge übernommen werden sollen. |
Rückgabewert
false im Fehlerfall (z. B. bei ungültiger Ressource oder wenn pos + length den Datensatz übersteigt).Beispiele
Trainingsdaten in Trainings- und Validierungsset aufteilen
<?php
// Trainingsdaten laden
$train_data = fann_read_train_from_file('daten.train');
if ($train_data === false) {
die('Trainingsdaten konnten nicht geladen werden.');
}
$gesamt = fann_length_train_data($train_data);
$trainings_anteil = (int) ($gesamt * 0.8); // 80 % zum Trainieren
$validierungs_anteil = $gesamt - $trainings_anteil; // 20 % zur Validierung
// Teilmengen erstellen
$trainings_set = fann_subset_train_data($train_data, 0, $trainings_anteil);
$validierungs_set = fann_subset_train_data($train_data, $trainings_anteil, $validierungs_anteil);
echo 'Trainingsbeispiele: ' . fann_length_train_data($trainings_set) . PHP_EOL;
echo 'Validierungsbeispiele: ' . fann_length_train_data($validierungs_set) . PHP_EOL;
// Netz erstellen und trainieren
$ann = fann_create_standard(3, 2, 4, 1);
fann_train_on_data($ann, $trainings_set, 1000, 100, 0.001);
// Speicher freigeben
fann_destroy_train($trainings_set);
fann_destroy_train($validierungs_set);
fann_destroy_train($train_data);
fann_destroy($ann);
Kreuzvalidierung mit gleichmäßig aufgeteilten Folds
<?php
$train_data = fann_read_train_from_file('daten.train');
$gesamt = fann_length_train_data($train_data);
$folds = 5;
$fold_size = (int) ($gesamt / $folds);
for ($i = 0; $i < $folds; $i++) {
$start = $i * $fold_size;
$subset = fann_subset_train_data($train_data, $start, $fold_size);
echo 'Fold ' . ($i + 1) . ': Startposition=' . $start
. ', Datenpunkte=' . fann_length_train_data($subset) . PHP_EOL;
// ... Training und Validierung ...
fann_destroy_train($subset);
}
fann_destroy_train($train_data);
// Wichtig · Fallstricke
Speicherverwaltung: Jede mit fann_subset_train_data() erzeugte Ressource belegt eigenständig Speicher und muss explizit mit fann_destroy_train() freigegeben werden, da PHP dies nicht automatisch übernimmt. Das Vergessen dieser Freigabe führt zu Speicherlecks, insbesondere in Schleifen mit vielen Folds.
Bereichsüberschreitung: Wenn pos + length größer als die Gesamtanzahl der Trainingsbeispiele ist, gibt die Funktion false zurück. Der Rückgabewert sollte daher stets geprüft werden.
Die Funktion steht nur zur Verfügung, wenn die FANN-PHP-Extension installiert ist (pecl install fann).