Een laag
Een plaatje is nu een lijst getallen. Eén neuron zegt daar ja of nee over. Een laag is een rij neuronen die allemaal naar dezelfde invoer kijken, elk met zijn eigen gewichten en bias. Samen geven ze een nieuwe lijst: van elk neuron één uitkomst.
Voorspel
def neuron(invoer, gewichten, bias):
som = bias
for i in range(len(invoer)):
som = som + invoer[i] * gewichten[i]
if som > 0:
return 1
return 0
invoer = [1, 0]
print(neuron(invoer, [1, 1], 0), neuron(invoer, [1, 1], -1))
Twee neuronen kijken naar dezelfde invoer. Wat print dit programma?
Antwoord
1 0
Het eerste neuron is het OF-neuron, het tweede het EN-neuron. Bij [1, 0]
zegt OF ja en EN nee.
Zo werkt het
De gewichten van een laag staan in een lijst van lijsten: alle_gewichten[n]
zijn de gewichten van neuron n, en biases[n] is zijn bias. De functie
laag loopt langs de neuronen en zet de uitkomst van elk neuron in een lijst.
neuron staat in de verborgen code onder de editor.
Die lijst is weer een gewone invoer. In de volgende stap gaat hij een tweede
laag in. In Traffic heet zo'n laag, waarin elk neuron naar alle invoer kijkt,
een Dense-laag.
Onderzoek
- Draai de code. Welk neuron doet OF, en welk doet EN?
- Zet er een derde neuron bij, met gewichten
[-1, -1]en bias 1. Wat zegt het bij de vier combinaties? - Haal daarna de bias van het derde neuron weer weg, maar laat zijn gewichten staan. Wat gebeurt er?
Wat zie je?
0 0 -> [0, 0]
0 1 -> [1, 0]
1 0 -> [1, 0]
1 1 -> [1, 1]
Antwoorden
- Het eerste neuron doet OF, het tweede EN.
- Het derde zegt alleen 1 bij
0 0: geen van beide. Bij0 0krijg je[0, 0, 1]. - Je krijgt dezelfde foutmelding als bij
gewichten:
er zijn drie lijsten gewichten maar twee biases, en bij het derde neuron
is er geen
biases[2].
Opdracht: een laag voor plaatjes
Maak een laag van drie neuronen die naar een plaatje van 3 bij 3 kijken. Het eerste zegt 1 als de bovenste rij helemaal zwart is, het tweede bij de middelste rij, het derde bij de onderste rij. Voor een liggende streep en een helemaal zwart plaatje print hij:
[0, 1, 0]
[1, 1, 1]
Begin klein, en breid de code stap voor stap uit:
- Draai de code: er is alleen het neuron voor de bovenste rij, en dat zegt
[0]. - Zet het neuron voor de middelste rij erbij, in
alle_gewichtenenbiases. Nu zie je[0, 1]. - Zet het neuron voor de onderste rij erbij.
- Print ook de laag voor
zwart.
Tip
Waarom is de bias van het eerste neuron -2? Reken de som uit als twee van de drie pixels van de bovenste rij zwart zijn, en als alle drie zwart zijn.
Antwoord
Dit vervangt de laatste drie regels in de editor:
alle_gewichten = [
[1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 1, 1],
]
biases = [-2, -2, -2]
print(laag(liggend, alle_gewichten, biases)) # [0, 1, 0]
print(laag(zwart, alle_gewichten, biases)) # [1, 1, 1]
Elk neuron heeft gewicht 1 op de drie pixels van zijn rij en 0 op de rest. Met bias -2 komt de som alleen boven 0 als alle drie zwart zijn.
Door naar twee lagen.