Alle Herausforderungen
Mittel 0 gelöst 0% Erfolgsquote

Vorwärtsdurchlauf einer Dense-Schicht

Berechne die Ausgaben einer vollständig verbundenen Schicht mit wählbarer Aktivierung.

Das lernst du

  • Eine ganze Schicht von Neuronen auf einmal berechnen
  • Eine gewählte Aktivierung auf jede Ausgabe anwenden
  • Gewichte als eine Zeile pro Neuron organisieren

Problem

Eine Dense-Schicht ist eine Gruppe von Neuronen, die alle dieselben Eingaben erhalten. Neuron j hat eigene Gewichte weights[j] und einen eigenen Bias biases[j]:

z_j = inputs · weights[j] + biases[j]

Dann wird die Aktivierung der Schicht auf jedes z_j angewendet:

  • "linear": z_j unverändert ausgeben
  • "relu": max(0, z_j)
  • "sigmoid": 1 / (1 + e^(-z_j))

Implementiere dense_forward(inputs, weights, biases, activation).

Eingabe

inputs: Die n Eingabewerte.

weights: Eine Zeile pro Neuron; jede Zeile hat n Gewichte.

biases: Ein Bias pro Neuron.

activation: "linear", "relu" oder "sigmoid".

Ausgabe

Gib die Liste der Ausgaben zurück, eine pro Neuron, in Reihenfolge.

Einschränkungen

1 ≤ n ≤ 100, 1 ≤ Anzahl der Neuronen ≤ 100

-10 ≤ jeder Wert ≤ 10

Beispiele

Beispiel 1
Eingabe:
biases = [0.0, -1.0]
inputs = [1.0, 2.0]
weights = [
    [0.5, -1.0],
    [1.5, 0.5]
]
activation = "relu"

Erwartete Ausgabe:
expected = [0.0, 1.5]
Eingabe:
std::vector<double> biases = {0.0, -1.0};
std::vector<double> inputs = {1.0, 2.0};
std::vector<std::vector<double>> weights = {
    {0.5, -1.0},
    {1.5, 0.5}
};
std::string activation = "relu";

Erwartete Ausgabe:
std::vector<double> expected = {0.0, 1.5};
Eingabe:
double[] biases = new double[] {0.0, -1.0};
double[] inputs = new double[] {1.0, 2.0};
double[][] weights = new double[][] {
    new double[] {0.5, -1.0},
    new double[] {1.5, 0.5}
};
string activation = "relu";

Erwartete Ausgabe:
double[] expected = new double[] {0.0, 1.5};

Erläuterung

Neuron 1: 1×0.5 + 2×(-1) + 0 = -1.5, und ReLU ergibt 0. Neuron 2: 1×1.5 + 2×0.5 - 1 = 1.5, das ReLU behält. Ergebnis: [0, 1.5].

Beispiel 2
Eingabe:
biases = [1.0, 0.0, -1.5]
inputs = [3.0]
weights = [
    [2.0],
    [-1.0],
    [0.5]
]
activation = "linear"

Erwartete Ausgabe:
expected = [7.0, -3.0, 0.0]
Eingabe:
std::vector<double> biases = {1.0, 0.0, -1.5};
std::vector<double> inputs = {3.0};
std::vector<std::vector<double>> weights = {
    {2.0},
    {-1.0},
    {0.5}
};
std::string activation = "linear";

Erwartete Ausgabe:
std::vector<double> expected = {7.0, -3.0, 0.0};
Eingabe:
double[] biases = new double[] {1.0, 0.0, -1.5};
double[] inputs = new double[] {3.0};
double[][] weights = new double[][] {
    new double[] {2.0},
    new double[] {-1.0},
    new double[] {0.5}
};
string activation = "linear";

Erwartete Ausgabe:
double[] expected = new double[] {7.0, -3.0, 0.0};

Erläuterung

Mit einer linearen Aktivierung sind die Ausgaben einfach 3×2 + 1 = 7, 3×(-1) + 0 = -3 und 3×0.5 - 1.5 = 0.

So gehst du vor

Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.

Hinweis 1

Behandle jedes Neuron einzeln: Jedes hat seine eigene Gewichtungszeile und einen Bias.

Hinweis 2

Berechne für jedes Neuron das Dot-Produkt mit dem Eingabevektor, addiere den Bias und wende dann die gewählte Aktivierung an.

Hinweis 3

Stelle sicher, dass die Aktivierung erst nach dem linearen Schritt angewendet wird, und behalte die Reihenfolge der Neuronen im Output bei.

Erwartete Komplexität

Zeit O(mn), zusätzlicher Speicher O(m)

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.