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
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].
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.