[PYTHON] [How to!] Lerne und spiele Super Mario mit Tensorflow !!

Einführung

Letztes Mal gab es viele Anfragen zum Erlernen der Super Famicom-Software, daher werde ich dieses Mal ein Programm zum Erlernen von Famicom teilen, das auf Macbook usw. ausgeführt wird.

Ich habe es auf Git hochgeladen, damit es im Experiment funktioniert. Bitte Stern, wenn Sie herunterladen möchten! https://github.com/tsunaki00/super_mario

17038850_1863772750540489_5777848282422220640_o.jpg

Experimentierumgebung

Ich habe es in der folgenden Maschinenumgebung getestet.

Umgebung
PC Macbook PRO 2016 OSX
CPU i7
MEM 16GB
Entwicklungssprache python

Ergänzung

Das Lernen mit Tensorflow wird entsprechend durchgeführt. Bitte verbessern Sie es.

Vorsichtsmaßnahmen für die Umwelt

Wenn ich es ausführe, erhalte ich den folgenden Fehler und muss die Bibliothek reparieren.

$ python3 start.py 
  Traceback (most recent call last):
    File "start.py", line 22, in <module>
      import gym_pull
    File "/usr/local/lib/python3.6/site-packages/gym_pull/__init__.py", line 41, in <module>
      import gym_pull.monitoring.monitor
    File "/usr/local/lib/python3.6/site-packages/gym_pull/monitoring/monitor.py", line 10, in <module>
      class Monitor(gym.monitoring.monitor.Monitor):
  AttributeError: module 'gym.monitoring' has no attribute 'monitor'

↓ Unten korrigiert

$ vi /usr/local/lib/python3.6/site-packages/gym_pull/monitoring/monitor.py
   :
   :
  class Monitor(gym.monitoring.monitor.Monitor):
   ↓
  class Monitor(gym.monitoring.monitor_manager.MonitorManager):

Eine kurze Beschreibung des Programms

Die Lernmethode ist Reinforcement Learning. Sie lernen, die von Ihnen durchgeführten Aktionen zu bewerten, was sich ein wenig vom überwachten und unbeaufsichtigten Lernen unterscheidet.

[Referenz] Deep Q-Network

Im folgenden Artikel wurde DQN beschrieben. Geschichte von DQN + Deep Q-Network in Chainer geschrieben

[Referenz] Lernen Sie menschliche Operationen.

Wir konnten den schnellsten Mario wie folgt machen, indem wir die Bewertung die Ergebnisse unserer eigenen Ausführung erfahren ließen! Bewertungen sind Entfernung, Zeit und Punktzahl.

Künstliche Intelligenz Ich habe versucht, die künstliche Intelligenz SIVA Mario spielen zu lassen![WELT 1-1]] https://www.youtube.com/watch?v=T4dO1GKPx4Y

Quellcode

――Aktion sollte richtig eingegrenzt werden.

import tensorflow as tf
import gym
import gym_pull
import ppaquette_gym_super_mario
from gym.wrappers import Monitor
import random
import numpy as np
class Game :

  def __init__(self):
    self.episode_count = 10000;
    ## select stage
    self.env = gym.make('ppaquette/SuperMarioBros-1-1-Tiles-v0')

  def weight_variable(self, shape):
    initial = tf.truncated_normal(shape, stddev = 0.01)
    return tf.Variable(initial)

  
  def bias_variable(self, shape):
    initial = tf.constant(0.01, shape = shape)
    return tf.Variable(initial)

  def conv2d(self, x, W, stride):
    return tf.nn.conv2d(x, W, strides = [1, stride, stride, 1], padding = "SAME")

  def max_pool_2x2(self, x):
    return tf.nn.max_pool(x, ksize = [1, 2, 2, 1], strides = [1, 2, 2, 1], padding = "SAME")

  
  def create_network(self, action_size):
    #Machen Sie es zwei Schichten
    W_conv1 = self.weight_variable([8, 8, 1, 16])
    b_conv1 = self.bias_variable([16])
    W_conv2 = self.weight_variable([4, 4, 16, 32])
    b_conv2 = self.bias_variable([32])
    W_conv3 = self.weight_variable([4, 4, 32, 64])
    b_conv3 = self.bias_variable([64])
    W_fc1 = self.weight_variable([512, action_size])
    b_fc1 = self.bias_variable([action_size])
    s = tf.placeholder("float", [None, 13, 16, 1])
    # hidden layers
    h_conv1 = tf.nn.relu(self.conv2d(s, W_conv1, 2) + b_conv1)
    h_conv2 = tf.nn.relu(self.conv2d(h_conv1, W_conv2, 2) + b_conv2)
    h_conv3 = tf.nn.relu(self.conv2d(h_conv2, W_conv3, 1) + b_conv3)
    h_conv3_flat = tf.reshape(h_conv3, [-1, 512])
    readout = tf.matmul(h_conv3_flat, W_fc1) + b_fc1
    return s, readout 


  def play_game(self) :
    action_list = []
    for i in range(64) :
      command = format(i, 'b')
      command = '{0:06d}'.format(int(command))
      actions = []
      for cmd in list(command) :
        actions.append(int(cmd))
      action_list.append(actions)
    sess = tf.InteractiveSession()
    s, readout = self.create_network(len(action_list))
    a = tf.placeholder("float", [None, len(action_list)])
    y = tf.placeholder("float", [None, 1])
    readout_action = tf.reduce_sum(tf.multiply(readout, a), reduction_indices = 1)
    cost = tf.reduce_mean(tf.square(y - readout_action))
    train_step = tf.train.AdamOptimizer(1e-6).minimize(cost)
    saver = tf.train.Saver()
    sess.run(tf.initialize_all_variables())
    checkpoint = tf.train.get_checkpoint_state("./saved_networks/checkpoints")
    if checkpoint and checkpoint.model_checkpoint_path:
      saver.restore(sess, checkpoint.model_checkpoint_path)
      print ("Successfully loaded:", checkpoint.model_checkpoint_path)
    else:
      print ("Could not find old network weights")
    for episode in range(self.episode_count):
      self.env.reset()
      total_score = 0
      distance = 0
      is_finished = False
      actions, rewards, images = [], [] ,[]
      while is_finished == False :
        #Holen Sie sich den Punkt oben links auf dem Bildschirm(Wenn du es mit einem Bild machst, selbst.env.Sie können es auf dem Bildschirm erhalten)
        screen = np.reshape(self.env.tiles, (13, 16, 1))
        if episode < 10 :
          action_index = random.randint(0, len(action_list) - 1)
        else :
          readout_t = readout.eval(feed_dict = {s : [screen]})[0]
          action_index = np.argmax(readout_t)
        # (1)Verarbeitung zu Mario auf dem Bildschirm(self.env.step)
        obs, reward, is_finished, info = self.env.step(action_list[action_index])
        ##In einem Array, um es zu einem Mini-Batch zu machen
        action_array = np.zeros(len(action_list))
        action_array[action_index] = 1
        actions.append(action_array)
        # (2)Gib eine Belohnung
        rewards.append([float(info['distance'])])
        images.append(screen)

        train_step.run(feed_dict = {
          a : actions, y : rewards, s : images
        })
        print('Episode : ', episode, 'Actions : ', action_list[action_index], 'Rewards', reward)
        actions, rewards, images = [], [] ,[]
        
        self.env.render()
      saver.save(sess, 'saved_networks/model-dqn', global_step = episode)

if __name__ == '__main__' :
  game = Game()
  game.play_game()
  

Lauf


$ python3 start.py

Schließlich

Die Docker + Browser-Version wird separat geschrieben.

In letzter Zeit wurden viele technische Bücher wie AI veröffentlicht, aber ich denke, dass die Hürden ziemlich hoch sind ... Ich denke, es ist eine gute Idee, mit so etwas Vertrautem zu üben!

In einer separaten Lernsitzung werden Einzelheiten zu den Programmen für Game AI und Python erläutert. Bitte schließen Sie sich uns an, wenn Sie möchten,

Tech Twitter hat begonnen. Wir werden es von Zeit zu Zeit aktualisieren. Bitte folgen Sie uns, wenn Sie möchten. https://twitter.com/gauss_club

Recommended Posts

[How to!] Lerne und spiele Super Mario mit Tensorflow !!
Freigeben von Ordnern für Docker und Windows mit Tensorflow
So schleifen und spielen Sie ein GIF-Video mit openCV ab
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt
TensorFlow-Lernmethode für Profis der freien Künste und Python-Anfänger
Fraktal zum Erstellen und Spielen mit Python
So verarbeiten Sie Kamerabilder mit Teams und Zoom Volumen der Emotionsanalyse mit Tensorflow
Wie man Kaldi mit JUST Corpus trainiert
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
So extrahieren Sie Nullwerte und Nicht-Nullwerte mit Pandas
Python # So überprüfen Sie Typ und Typ für Super-Anfänger
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Wie man strukturiertes SVM von ChainCRF mit PyStruct lernt
[TF] Speichern und Laden von Tensorflow-Trainingsparametern
Wie aktualisiere ich mit SQLAlchemy?
Wie man mit Theano besetzt
Wie mit SQLAlchemy ändern?
So trennen Sie Zeichenfolgen mit ','
Wie man RDP auf Fedora31 macht
Wie lösche ich mit SQLAlchemy?
[TensorFlow 2 / Keras] Ausführen des Lernens mit CTC Loss in Keras
[Lass uns mit Python spielen] Bildverarbeitung zu Monochrom und Punkten
Maschinelles Lernen mit Nogisaka 46 und Keyakizaka 46 Teil 1 Einführung
So erstellen Sie einen Datenrahmen und spielen mit Elementen mit Pandas
So melden Sie sich mit Python bei AtCoder an und senden automatisch
So legen Sie eine Verknüpfung fest, um in IBus zwischen voller und halber Breite zu wechseln
So brechen Sie RT mit tweepy ab
Python: So verwenden Sie Async mit
[Hugo] Zusammenfassung zum Hinzufügen von Seiten zu der mit Learn erstellten Site
So installieren und verwenden Sie Tesseract-OCR
Spielen Sie mit Poancare-Serien und SymPy
[TensorFlow 2] Lernen Sie RNN mit CTC-Verlust
So importieren Sie CSV- und TSV-Dateien mit Python in SQLite
So verwenden Sie virtualenv mit PowerShell
So installieren Sie Python-Pip mit Ubuntu20.04LTS
Umgang mit Fehlern bei der Installation von Whitenoise und der Bereitstellung auf Heroku
Umgang mit unausgeglichenen Daten
So führen Sie Jupyter und Spark auf einem Mac mit minimalen Einstellungen aus
So installieren Sie Pandas auf EC2 (Umgang mit MemoryError und PermissionError)
Wie fange ich mit Scrapy an?
Erste Schritte mit Python
So installieren Sie TensorFlow unter CentOS 7
Umgang mit dem DistributionNotFound-Fehler
So installieren und konfigurieren Sie Amsel
Verwendung von .bash_profile und .bashrc
Wie fange ich mit Django an?
So installieren und verwenden Sie Graphviz
Umgang mit Fehlern bei der Installation von Python und Pip mit Choco
Aufblasen von Daten (Datenerweiterung) mit PyTorch
Erklärt, wie TensorFlow 2.X mit der Implementierung von VGG16 / ResNet50 verwendet wird
So konvertieren Sie das Tensorflow-Modell in Lite
Versuchen wir das TensorFlow-Musikgenerierungsprojekt "Magenta" von der Entwicklungsumgebung bis zur Songgenerierung.
Lernen Sie Wasserstein GAN mit Keras-Modell und TensorFlow-Optimierung
[How to!] Lerne und spiele Super Mario mit Tensorflow !!
So berechnen Sie das Datum mit Python
So installieren Sie den MySQL-Connector mit pip3
So verbinden Sie INNER mit SQL Alchemy
[ROS2] So spielen Sie eine Bag-Datei mit Start im Python-Format ab