$iloscNeuronowNaWarstwie) { Siec::$warstwy[$idWarstwy] = new Warstwa($idWarstwy, $iloscNeuronowNaWarstwie); } } public static function obliczWyjsciaWszystkichNeuronow($wejscia) { self::$wejscia = $wejscia; foreach(Siec::$warstwy as $warstwa) { $warstwa->obliczWyjsciaNeuronow(); } } public static function uczNeurony($oczekiwaneWyjscia) { self::$oczekiwaneWyjscia = $oczekiwaneWyjscia; // obliczanie bledu dla warstwy wyjsciowej $warstwa = Siec::$warstwy[count(Siec::$warstwy)-1]; foreach($warstwa->neurony as $idNeuronu => $neuron) { $neuron->ostatniBlad = ($oczekiwaneWyjscia[$idNeuronu] - $neuron->ostatnieWyjscie) * $neuron->f_prim(); } // obliczanie bledu dla warstw ukrytych $warstwaWyzsza = Siec::$warstwy[count(Siec::$warstwy)-1]; for($i = count(Siec::$warstwy) - 2; $i >= 0; $i--) { $warstwa = Siec::$warstwy[$i]; foreach($warstwa->neurony as $idNeuronu => $neuron) { $neuron->ostatniBlad = 0; foreach($warstwaWyzsza->neurony as $neuronWyzej) { $neuron->ostatniBlad += $neuronWyzej->wagiWejsc[$idNeuronu] * $neuronWyzej->ostatniBlad; } $neuron->ostatniBlad *= $neuron->f_prim(); } $warstwaWyzsza = $warstwa; } // korekta bledow $warstwa = Siec::$warstwy[0]; foreach(Siec::$warstwy as $warstwa) { foreach($warstwa->neurony as $idNeuronu => $neuron) { foreach($neuron->wagiWejsc as $idWagi => $waga) { $neuron->wagiWejsc[$idWagi] = $neuron->wagiWejsc[$idWagi] + $neuron->wejscia[$idWagi] * $neuron->ostatniBlad * self::$N; } $neuron->b = $neuron->b + $neuron->b * $neuron->ostatniBlad * self::$N; } } } public static function pobierzWyliczonaKlase() { $array = Siec::$warstwy[count(Siec::$warstwy) - 1]->pobierzWyjsciaNeuronow(); $maxValue = 0; $maxKey = 0; foreach($array as $klucz => $wartosc) { if($wartosc >= $maxValue) { $maxKey = $klucz; $maxValue = $wartosc; } } return $maxKey; } public static function pobierzIloscNeuronowNaNizszejWarstwie($idWarstwy) { if($idWarstwy == 0) return count(Siec::$wejscia); elseif(isset(self::$warstwy[$idWarstwy - 1])) return self::$warstwy[$idWarstwy - 1]->pobierzIloscNeuronow(); else throw new Exception(__CLASS__ . '::' . __METHOD__ . " - Proba odczytu nie istniejacej warstwy"); } public static function pobierzWyjsciaNeuronowNizszejWarstwy($idWarstwy) { if($idWarstwy == 0) return Siec::$wejscia; elseif(isset(self::$warstwy[$idWarstwy - 1])) return self::$warstwy[$idWarstwy - 1]->pobierzWyjsciaNeuronow(); else throw new Exception(__CLASS__ . '::' . __METHOD__ . " - Proba odczytu nie istniejacej warstwy"); } }