Skrolli 2022.3: Tekoäly muuttaa maalle – Neuroverkko oppii pelaamaan kuusnelosella (Uuno Turhapuro C64)
Oikaisuja ja huomioita (paperilehti)
- Sivulta 28, kolmannesta palstasta, puuttui pala tekstiä. Teksti on kokonaisuudessaan Skrolli 2022.3 pdf-lehdessä sekä tässä: Oli siis myönnettävä, että jälleen yksi, tällä kertaa tekoälykäs, pelaaja joutui myöntämään Uuno Turhapuro muuttaa maalle -pelin paremmakseen. Vilkaistaan lopuksi vielä vähän neuroverkon pääkoppaan. Kuvassa 5 on esitetty verkolle annettu kuva ja yhden verkon sisäisen päätöksentekovaiheen sisältö. Tässä tasossa on neljä eri kerrosta, joista kukin havainnoi eri asioita kuvasta. Tämä taso on verkossa puolestaan liitetty useisiin muihin tasoihin. Tyypillisesti neuroverkon päättely on sen verran monimutkaista, että havainnollisten kuvien tuottaminen verkosta on hankalaa, mutta tässä tapauksessa verkon ”ajattelua” voi jossain määrin hahmottaa.
Listaukset
Listaus 1:
from tensorflow import keras as K
def luokittelija(kuvanKoko):
# Sisään tuleva kuva, resoluutio 320x200x3
input1 = K.layers.Input(kuvanKoko)
# Konvoluutiokerroksia
x = K.layers.Conv2D(2, strides = 2, kernel_size = 3, \
activation='relu')(input1) # Resoluutio nyt 159x99
x = K.layers.Conv2D(2, strides = 2, kernel_size = 3, \
activation='relu')(x) # Resoluutio nyt 79x49
x = K.layers.Conv2D(2, strides = 2, kernel_size = 3, \
activation='relu')(x) # Resoluutio nyt 39x24
x = K.layers.Conv2D(2, strides = 2, kernel_size = 3, \
activation='relu')(x) # Resoluutio nyt 19x11
# Ennustuskolmeen luokkaan
x = K.layers.Flatten()(x)
x = K.layers.Dense(3, activation="softmax")(x)
# Paluu
model = K.Model(input1, x)
return model
malli = luokittelija((320,200,3))
Listaus 2:
# Tarvittavat kirjastot
import numpy as np
import pyautogui
from pynput.keyboard import Key
# Käynnistä emulaattori painamalla Win+8
with pyautogui.hold('winleft'):
pyautogui.press('8')
# Lataa peli alkutilaan tallennuspisteestä
with pyautogui.hold('shift'):
pyautogui.press('f10')
# Silmukka
while ok:
# Ota kuvakaappaus pelistä
kuva = otaKuvaKaappaus()
# Tee päätös kuvan perusteella
paatos = neuroverkko.predict(kuva)
paatos = np.argmax(paatos) # Suurin arvo
# Paina nappulaa päätöksen mukaisesti
# Jos paatos = 1, ei paineta mitään
if paatos == 0:
keyboard.press(Key.up)
elif action == 2:
keyboard.press(Key.down)
# Tarkista onko peli loppunut
if peliLoppunut(kuva):
# Laske etenemispalkista miten hyvin pelattiin
pisteet = arvioiPalkki(kuva)
# Poistu silmukasta
break
Listaus 3:
# Rajatun kuvan verkko
verkko = luokittelija((64,96,3))
# Painota luokkia (ylös,suoraan,alas) niiden esiintymisen mukaan
luokkien_painokertoimet = {\
0: 1 - np.sum( toimintoPakka[:,0]) / np.sum(toimintoPakka),
1: 1 - np.sum( toimintoPakka[:,1]) / np.sum(toimintoPakka),
2: 1 - np.sum( toimintoPakka[:,2]) / np.sum(toimintoPakka)}
# Valmistele verkko optimointia varten
verkko.compile( loss='categorical_crossentropy', \
optimizer=K.optimizers.Adam(1e-2), \
metrics=['accuracy'] )
# Optimoi verkon parametrit
h = verkko.fit( x = kuvaPakka, y = toimintoPakka,
batch_size = 512, epochs = 1000, \
validation_data = (kuvaPakkaVal, toimintoPakkaVal),\
class_weight = luokkien_painokertoimet,\
verbose = 2)