Alle Herausforderungen
Einfach 0 gelöst 0% Erfolgsquote

Xavier- und He-Gewichtsinitialisierung

Berechne den Bereich oder die Standardabweichung, mit der die Gewichte einer Schicht initialisiert werden.

Das lernst du

  • Initialisierungsbereiche für eine Schicht berechnen
  • Zwischen Xavier und He wählen
  • Verstehen, warum die Initialisierung wichtig ist

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:

methodgibt 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

Beispiel 1
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.

Beispiel 2
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.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.