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)