Skrolli 2022.3: Tekoäly muuttaa maalle – Neuroverkko oppii pelaamaan kuusnelosella (Uuno Turhapuro C64)

Oikaisuja ja huomioita (paperilehti)

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)