Problem
Zu große oder zu kleine Startgewichte machen tiefe Netze schwer trainierbar. Zwei Standardverfahren wählen die Skala anhand der Schichtgröße, wobei fan_in die Anzahl der Eingaben und fan_out die Anzahl der Ausgaben ist:
| method | gibt zurück |
|---|---|
"xavier_uniform" | Grenze √(6 / (fan_in + fan_out)), Gewichte aus [-Grenze, Grenze] |
"xavier_normal" | Standardabweichung √(2 / (fan_in + fan_out)) |
"he_uniform" | Grenze √(6 / fan_in) |
"he_normal" | Standardabweichung √(2 / fan_in) |
Xavier (Glorot) passt zu Sigmoid- und tanh-Schichten, He zu ReLU-Schichten.
Implementiere init_bound(method, fan_in, fan_out).
Eingabe
method: Einer der Werte "xavier_uniform", "xavier_normal", "he_uniform" oder "he_normal".
fan_in, fan_out: Die Anzahl der Eingaben und Ausgaben der Schicht.
Ausgabe
Gib die Grenze oder Standardabweichung als Dezimalzahl zurück.
Einschränkungen
1 ≤ fan_in, fan_out ≤ 100.000
Beispiele
Eingabe:
fan_in = 3
method = "xavier_uniform"
fan_out = 3
Erwartete Ausgabe:
expected = 1.0
Eingabe:
long long fan_in = 3;
std::string method = "xavier_uniform";
long long fan_out = 3;
Erwartete Ausgabe:
double expected = 1.0;
Eingabe:
long fan_in = 3;
string method = "xavier_uniform";
long fan_out = 3;
Erwartete Ausgabe:
double expected = 1.0;
Erläuterung
√(6 / (3 + 3)) = √1 = 1, also werden die Gewichte aus [-1, 1] gezogen.
Eingabe:
fan_in = 50
method = "he_normal"
fan_out = 10
Erwartete Ausgabe:
expected = 0.2
Eingabe:
long long fan_in = 50;
std::string method = "he_normal";
long long fan_out = 10;
Erwartete Ausgabe:
double expected = 0.2;
Eingabe:
long fan_in = 50;
string method = "he_normal";
long fan_out = 10;
Erwartete Ausgabe:
double expected = 0.2;
Erläuterung
He verwendet nur fan_in: √(2 / 50) = √0.04 = 0.2.
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.