> For the complete documentation index, see [llms.txt](https://julienbeaulieu.gitbook.io/wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://julienbeaulieu.gitbook.io/wiki/sciences/machine-learning/neural-networks/multilayer-perceptron.md).

# Multilayer Perceptron

**Derivation**

Before, we were dealing with only one output node which made the code straightforward. However now that we have multiple input units and multiple hidden units, the weights between them will require two indices: w\_{ij}​ where i denotes input units and j are the hidden units.

For example, the following image shows our network, with its input units labeled x\_1, x\_2 and x\_3​, and its hidden nodes labeled h\_1​ and h\_2h:

![](/files/-LlYgdstVrmZHWT6em-u)

![](/files/-LlYggBQJV9qKgBSmZRo)

![](/files/-LlYgj9W2UnDE6Aiu6Du)

![](/files/-LlYgmTOmcegR0a0PO7p)

### Code

```python
import numpy as np

def sigmoid(x):
    """
    Calculate sigmoid
    """
    return 1/(1+np.exp(-x))

# Network size
N_input = 4
N_hidden = 3
N_output = 2

np.random.seed(42)
# Make some fake data
X = np.random.randn(4)

weights_input_to_hidden = np.random.normal(0, scale=0.1, size=(N_input, N_hidden))
weights_hidden_to_output = np.random.normal(0, scale=0.1, size=(N_hidden, N_output))


# TODO: Make a forward pass through the network

hidden_layer_in = np.dot(X , weights_input_to_hidden)
hidden_layer_out = sigmoid(hidden_layer_in)

print('Hidden-layer Output:')
print(hidden_layer_out)

output_layer_in = np.dot(hidden_layer_out, weights_hidden_to_output)
output_layer_out = sigmoid(output_layer_in)

print('Output-layer Output:')
print(output_layer_out)
```
