De grootste wint
Traffic kent 43 soorten verkeersborden, en een foto is er precies één van.
Een neuron dat ja of nee zegt, is dan niet genoeg. Het netwerk krijgt daarom
één uitgang per soort. Elke uitgang geeft zijn som, zonder ja of nee, en de
uitgang met de grootste som wint. Jij doet het met vier tekens: |, -, x
en o.
Voorspel
staand = [0, 1, 0, 0, 1, 0, 0, 1, 0]
gewichten = [-1, 1, -1, -1, 1, -1, -1, 1, -1]
som = 0
for i in range(len(staand)):
som = som + staand[i] * gewichten[i]
print(som)
staand is een staande streep, |. De gewichten zijn 1 op de pixels van een
staande streep en -1 op de rest. Wat print dit programma?
Antwoord
3
De drie zwarte pixels liggen allemaal op een gewicht van 1. Een liggende streep zou -1 geven: alleen de middelste pixel telt mee, de andere twee trekken eraf.
Zo werkt het
Elke uitgang heeft gewichten die op zijn eigen teken lijken: 1 waar het teken
zwart is, -1 waar het wit is. Hoe meer het plaatje op het teken lijkt, hoe
groter de som. De functie som_van rekent die som uit, zonder er 1 of 0 van
te maken.
Dan zoek je de positie van de grootste som. Dat is nieuw: je onthoudt niet de
grootste waarde, zoals bij max, maar zijn positie beste. Begin bij
positie 0, en kom je een grotere tegen, onthoud dan die positie. In Traffic
heeft de laatste laag zo 43 uitgangen, en Keras maakt van hun sommen kansen
die samen 1 zijn. De grootste som geeft de grootste kans.
Onderzoek
- Draai de code. Welk teken wint?
- Zet
uitgangenop[-4, -4, 0, 8]. Welk teken wint nu? - Probeer
[2, -2, 0, 2]: twee uitgangen zijn even groot. Welke wint, en waarom die? - Probeer
[-5, -2, -3, -9]. Werkt het ook als alle sommen negatief zijn?
Wat zie je?
0 |
Antwoorden
- De staande streep, op positie 0.
- De ring,
o, op positie 3. - De staande streep: alleen een grotere som vervangt
beste, een even grote niet. Bij een gelijke stand wint de eerste. - Ja,
-wint met -2.bestebegint bij een positie, niet bij de waarde 0.
Opdracht: welk teken is dit?
In de editor staan de gewichten van de vier uitgangen, en de sommen voor een
kruis. Laat het programma zeggen welk teken het is. Zet het daarna in een
functie herken, die je in de volgende stappen weer gebruikt:
[-3, -3, 5, 3]
x
Begin klein, en breid de code stap voor stap uit:
- Draai de code: hij print de vier sommen.
- Zoek de positie van de grootste en onthoud hem in
beste, zoals in het onderzoek. Printsoorten[beste]. - Zet het in een functie
herken(invoer, alle_gewichten, biases)diebesteteruggeeft. Geef alle uitgangen bias 0. - Herken ook een ring met een gat:
[1, 1, 0, 1, 0, 1, 1, 1, 1].
Tip
In de functie heb je geen kruis meer, maar invoer, en geen 0 als bias,
maar biases[n].
Antwoord
Dit vervangt alles onder kruis = … in de editor:
def herken(invoer, alle_gewichten, biases):
uitgangen = []
for n in range(len(alle_gewichten)):
uitgangen.append(som_van(invoer, alle_gewichten[n], biases[n]))
beste = 0
for i in range(len(uitgangen)):
if uitgangen[i] > uitgangen[beste]:
beste = i
return beste
biases = [0, 0, 0, 0]
ring_met_gat = [1, 1, 0, 1, 0, 1, 1, 1, 1]
print(soorten[herken(kruis, alle_gewichten, biases)]) # x
print(soorten[herken(ring_met_gat, alle_gewichten, biases)]) # o
De ring met een gat lijkt niet precies op een ring, maar zijn som is wel de
grootste: 7, tegen -1 voor het kruis. Een staande streep met een extra pixel
linksonder geeft [2, -2, 0, 2]: een gelijke stand met de ring, en de streep
wint alleen omdat hij eerst staat. Met gewichten die het netwerk zelf leert,
gaat dat beter.
Door naar de tekens inlezen.