All challenges
Medium 0 solved 0% acceptance

Dense Layer Forward Pass

Compute the outputs of a fully connected layer of neurons with a choice of activation.

What you'll learn

  • Compute a full layer of neurons at once
  • Apply a chosen activation to each output
  • Organize weights as one row per neuron

Problem

A dense layer is a group of neurons that all receive the same inputs. Neuron j has its own weights weights[j] and bias biases[j]:

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

Then the layer's activation is applied to each z_j:

  • "linear": output z_j unchanged
  • "relu": max(0, z_j)
  • "sigmoid": 1 / (1 + e^(-z_j))

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

Input

inputs: The n input values.

weights: One row per neuron; each row has n weights.

biases: One bias per neuron.

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

Output

Return the list of outputs, one per neuron, in order.

Constraints

1 ≤ n ≤ 100, 1 ≤ number of neurons ≤ 100

-10 ≤ each value ≤ 10

Examples

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

Expected output:
expected = [0.0, 1.5]
Input:
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";

Expected output:
std::vector<double> expected = {0.0, 1.5};
Input:
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";

Expected output:
double[] expected = new double[] {0.0, 1.5};

Explanation

Neuron 1: 1×0.5 + 2×(-1) + 0 = -1.5, and ReLU gives 0. Neuron 2: 1×1.5 + 2×0.5 - 1 = 1.5, which ReLU keeps. Result: [0, 1.5].

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

Expected output:
expected = [7.0, -3.0, 0.0]
Input:
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";

Expected output:
std::vector<double> expected = {7.0, -3.0, 0.0};
Input:
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";

Expected output:
double[] expected = new double[] {7.0, -3.0, 0.0};

Explanation

With a linear activation the outputs are just 3×2 + 1 = 7, 3×(-1) + 0 = -3 and 3×0.5 - 1.5 = 0.

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

Treat each neuron separately: each one has its own weight row and bias.

Hint 2

Compute every neuron's dot product with the input vector, add its bias, then apply the chosen activation.

Hint 3

Make sure the activation choice is applied after the linear step, and preserve neuron order in the output.

Expected complexity

O(mn) time, O(m) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.