Start · Sprachen · PHP · Referenz · fann_subset_train_data

fann_subset_train_data

Funktion

Gibt eine neue Ressource mit einer Kopie einer Teilmenge der FANN-Trainingsdaten zurück, beginnend ab Position <code>pos</code> mit <code>length</code> Datenpunkten.

seit PHP 5.6.0 Kategorie: misc

Signatur

fann_subset_train_data(resource $data, int $pos, int $length): resource|false

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

Typ
resource|false
Beschreibung
Gibt eine neue FANN-Trainingsdaten-Ressource zurück, die die angegebene Teilmenge enthält, oder 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);
Trainingsbeispiele: 800 Validierungsbeispiele: 200

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);
Fold 1: Startposition=0, Datenpunkte=200 Fold 2: Startposition=200, Datenpunkte=200 Fold 3: Startposition=400, Datenpunkte=200 Fold 4: Startposition=600, Datenpunkte=200 Fold 5: Startposition=800, Datenpunkte=200

// 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).