Een functie leer
Je hebt het leren nu twee keer geschreven: voor EN en voor het fruit. Zet het
in een functie leer, dan kun je elk neuron in één regel laten leren. Die
functie moet werken voor elk aantal invoeren, en daarvoor maak je een lijst
gewichten van de goede lengte.
Voorspel
voorbeelden = [([0, 0, 1], 0), ([1, 1, 0], 1)]
print(voorbeelden[0])
print(voorbeelden[0][0])
print(len(voorbeelden[0][0]))
print([0] * len(voorbeelden[0][0]))
Wat print dit programma?
Antwoord
([0, 0, 1], 0)
[0, 0, 1]
3
[0, 0, 0]
voorbeelden[0] is het eerste voorbeeld, en [0] daarachter de invoer
ervan. [0] * 3 maakt een lijst van drie nullen.
Zo werkt het
Het aantal invoeren lees je af aan het eerste voorbeeld:
len(voorbeelden[0][0]). [0] * n is nieuw: het maakt een lijst met n keer
een 0. Zo krijgt het neuron één gewicht per invoer, hoeveel invoeren er ook
zijn.
Een functie kan twee dingen tegelijk teruggeven: return gewichten, bias
geeft een tuple terug, en gewichten, bias = leer(…) pakt hem weer uit.
Bouw zelf: een functie leer
Zet het leren in een functie leer(voorbeelden, rondes) die de gewichten en
de bias teruggeeft. Laat hem werken voor elk aantal invoeren: twee, maar ook
drie of tien.
Leer er daarna een neuron mee dat met drie invoeren "minstens twee van de drie" herkent: 1 als minstens twee invoeren 1 zijn. Test het op alle acht combinaties.
Begin klein, en breid de code stap voor stap uit:
- Draai de code:
leergeeft nog([0, 0], 0)terug. - Zet het leren uit appels en bananen in de functie, met
voorbeeldenenrondesin plaats vanfruiten 10. Nu geeftleer(en, 10)hetzelfde als bij rondes:([2, 1], -2). - Maak het aantal gewichten even groot als het aantal invoeren, zodat de functie ook met drie invoeren werkt.
- Maak de acht voorbeelden van "minstens twee van de drie", met drie loops in elkaar en een
if. - Leer ze met
leer, en test het neuron op alle acht.
Tip
Bij stap 4: wat zegt a + b + c over het aantal enen? Laat je [0, 0] staan
bij drie invoeren, dan krijg je de foutmelding van
gewichten.
Antwoord
Dit vervangt alles in de editor:
def leer(voorbeelden, rondes):
gewichten = [0] * len(voorbeelden[0][0])
bias = 0
for ronde in range(rondes):
for invoer, doel in voorbeelden:
fout = doel - neuron(invoer, gewichten, bias)
for i in range(len(invoer)):
gewichten[i] = gewichten[i] + fout * invoer[i]
bias = bias + fout
return gewichten, bias
voorbeelden = []
for a in [0, 1]:
for b in [0, 1]:
for c in [0, 1]:
if a + b + c >= 2:
voorbeelden.append(([a, b, c], 1))
else:
voorbeelden.append(([a, b, c], 0))
en = [([0, 0], 0), ([0, 1], 0), ([1, 0], 0), ([1, 1], 1)]
print(leer(en, 10))
gewichten, bias = leer(voorbeelden, 10)
print(gewichten, bias)
for invoer, doel in voorbeelden:
print(invoer, neuron(invoer, gewichten, bias), "moest", doel)
([2, 1], -2)
[1, 1, 1] -1
[0, 0, 0] 0 moest 0
[0, 0, 1] 0 moest 0
[0, 1, 0] 0 moest 0
[0, 1, 1] 1 moest 1
[1, 0, 0] 0 moest 0
[1, 0, 1] 1 moest 1
[1, 1, 0] 1 moest 1
[1, 1, 1] 1 moest 1
Het neuron leert gewichten [1, 1, 1] met bias -1: bij twee of drie keer 1
komt de som boven 0. Op elke regel staat twee keer hetzelfde getal: wat het
neuron zegt, en wat het moest zijn.
Door naar een plaatje als getallen.