[PYTHON] [Lernen stärken] Wie zeichnet man OpenAI Gym auf Google Corab (Version 2020.6)?

0. Einleitung

Ich habe überprüft, wie OpenAI Gym auf Google Colab gezeichnet wird. Notieren Sie sich dies.

Referenzierte Websites

1. Herausforderungen

Ich erhalte den Fehler "NoSuchDisplayException", wenn ich versuche, die Umgebung mit der Methode "render ()" von "gym.Env" anzuzeigen.

import gym
env = gym.make('CartPole-v1')
env.reset()
env.render()
NoSuchDisplayException                    Traceback (most recent call last)
<ipython-input-3-74ea9519f385> in <module>()
      2 env = gym.make('CartPole-v1')
      3 env.reset()
----> 4 env.render()

2. Gegenmaßnahmen

Bei meinen Nachforschungen stellte ich fest, dass es drei Möglichkeiten gibt, die Zeichenfunktion von Gym auf Colab zu verwenden. Jede Methode hat Vor- und Nachteile, und ich konnte mich nicht auf eine beschränken, daher werde ich alle drei Typen beschreiben.

2.1 Gemeinsame Vorbereitung

Alle drei Methoden verwenden die virtuelle X11-Anzeige Xvfb. Installieren.

!apt update
!apt install xvfb

Wenn Sie Jupyter Notebook unabhängig mit (Docker-Image usw. starten, ist auch OpenGL-bezogen erforderlich. Verwenden Sie daher "apt install python-opengl". )

Verwenden Sie außerdem PyVirtualDisplay, um Xvfb von Google Colab (Jupyter Notebook) zu verwenden.

!pip install pyvirtualdisplay

from pyvirtualdisplay import Display

d = Display()
d.start()

Es gab eine Beschreibung, dass "{Anzeigenummer}. {Bildschirmnummer}" in der Umgebungsvariablen "DISPLAY" festgelegt wurde, aber [mir wurde vom Autor von PyVirtualDisplay gesagt, dass dies nicht erforderlich ist](https: // github.com/ponty/PyVirtualDisplay/issues/54).

Ihm zufolge ist die Bildschirmnummer ein Wert, der in Situationen verwendet wird, in denen mehrere Anzeigen vorhanden sind. Da PyVirtualDisplay nur einen Bildschirm generiert, ist dieser Wert auf "0" festgelegt. Wenn die Bildschirmnummer nicht geschrieben wird, wird sie automatisch als "0" interpretiert. Deswegen. (Siehe Stapelüberlauf)

Mit anderen Worten, da die Umgebungsvariable in "pyvirtualdisplay.Display.start ()" festgelegt ist, muss sie nicht von außen geändert werden. (Zumindest bestätigt in 1.3.2, der neuesten Version vom 18. Juni 2020)

2.2 Methode 1

Die erste besteht darin, die Bildschirmdaten einfach mit matplotlib zu zeichnen und das Löschen zu wiederholen.

Der Nachteil ist, dass es nicht sehr schnell ist und nur einmal angezeigt wird. Es ist jedoch eine Methode, die auch dann verarbeitet werden kann, wenn die Zeichnungsdaten lang werden, da sie weiterhin überschrieben werden, ohne die Zeichnungsdaten beizubehalten.

import gym
from IPython import display
from pyvirtualdisplay import Display
import matplotlib.pyplot as plt

d = Display()
d.start()

env = gym.make('CartPole-v1')

o = env.reset()

img = plt.imshow(env.render('rgb_array'))
for _ in range(100):
    o, r, d, i = env.step(env.action_space.sample()) #Setzen Sie tatsächlich die Aktion von DNN

    display.clear_output(wait=True)
    img.set_data(env.render('rgb_array'))
    plt.axis('off')
    display.display(plt.gcf())

    if d:
        env.reset()

2.3 Methode 2

Die zweite Möglichkeit besteht darin, "matplotlib.animation.FuncAnimation" zu verwenden, um die Animation anzuzeigen.

Der Zeichenbildschirm kann wiederholt angezeigt werden, und die Anzeigegeschwindigkeit für jedes Bild kann frei eingestellt werden. Da jedoch Zeichnungsdaten beibehalten werden müssen, ist viel Speicher erforderlich, und die anzuzeigende Bildschirmgröße und die Anzahl der Anzeigen müssen angepasst werden. Kann einen Speicherfehler verursachen. (Wenn Sie während einer langen Studie einen Fehler erhalten ...)

import gym
from IPython import display
from pyvirtualdisplay import Display
import matplotlib.pyplot as plt
from matplotlib import animation


d = Display()
d.start()

env = gym.make('CartPole-v1')

o = env.reset()

img = []
for _ in range(100):
    o, r, d, i = env.step(env.action_space.sample()) #Setzen Sie tatsächlich die Aktion von DNN

    display.clear_output(wait=True)
    img.append(env.render('rgb_array'))

    if d:
        env.reset()

dpi = 72
interval = 50 # ms

plt.figure(figsize=(img[0].shape[1]/dpi,img[0].shape[0]/dpi),dpi=dpi)
patch = plt.imshow(img[0])
plt.axis=('off')
animate = lambda i: patch.set_data(img[i])
ani = animation.FuncAnimation(plt.gcf(),animate,frames=len(img),interval=interval)
display.display(display.HTML(ani.to_jshtml()))

2.4 Methode 3

Die letzte Methode besteht darin, die Zeichnungsdaten mit "gym.wrappers.Monitor" als Film zu speichern. Die Methode render () ist nicht erforderlich und wird automatisch gespeichert, wenn die Methode step (action) aufgerufen wird.

import base64
import io
import gym
from gym.wrappers import Monitor
from IPython import display
from pyvirtualdisplay import Display

d = Display()
d.start()

env = Monitor(gym.make('CartPole-v1'),'./')

o = env.reset()

for _ in range(100):
    o, r, d, i = env.step(env.action_space.sample()) #Setzen Sie tatsächlich die Aktion von DNN

    if d:
        env.reset()

for f in env.videos:
    video = io.open(f[0], 'r+b').read()
    encoded = base64.b64encode(video)

    display.display(display.HTML(data="""
        <video alt="test" controls>
        <source src="data:video/mp4;base64,{0}" type="video/mp4" />
        </video>
        """.format(encoded.decode('ascii'))))

3. Bibliothek: Gym-Notebook-Wrapper

Da es schwierig ist, die obige Methode jedes Mal zu schreiben, habe ich sie in eine Bibliothek umgewandelt.

3.1 Installation

Da es auf PyPI veröffentlicht ist, kann es mit "pip install gym-notebook-wrapper" installiert werden.

!apt update && apt install xvfb
!pip install gym-notebook-wrapper

Natürlich kann es auch anders als Google Colab verwendet werden, aber Linux ist eine Voraussetzung für die Verwendung von Xvfb.

3.2 Verwendung

Der Fitness-Notebook-Wrapper hat einen langen Bindestrich (-), daher kann der Modulname gnwrapper importiert werden.

3.2.1 gnwrapper.Animation (= 2.2 Methode 1)

import gnwrapper
import gym

env = gnwrapper.Animation(gym.make('CartPole-v1')) #Xvfb wird gestartet

o = env.reset()

for _ in range(100):
    o, r, d, i = env.step(env.action_space.sample()) #Setzen Sie tatsächlich die Aktion von DNN
    env.render() #Hier wird die vorherige Zeichnung gelöscht und ein neuer Schritt gezeichnet.
    if d:
        env.reset()

3.2.2 gnwrapper.LoopAnimation (= 2.3 Methode 2)

import gnwrapper
import gym

env = gnwrapper.LoopAnimation(gym.make('CartPole-v1')) #Xvfb wird gestartet

o = env.reset()

for _ in range(100):
    o, r, d, i = env.step(env.action_space.sample()) #Setzen Sie tatsächlich die Aktion von DNN
    env.render() #Speichern Sie nun die Zeichnungsdaten
    if d:
        env.reset()

env.display() #Hier werden die gespeicherten Zeichnungsdaten als Animation angezeigt.

3.2.3 gnwrapper.Monitor (= 2.4 Methode 3)

import gnwrapper
import gym

env = gnwrapper.Monitor(gym.make('CartPole-v1'),directory="./") #Xvfb wird gestartet

o = env.reset()

for _ in range(100):
    o, r, d, i = env.step(env.action_space.sample()) #Setzen Sie tatsächlich die Aktion von DNN
    if d:
        env.reset()

env.display() #Hier werden die als Video gespeicherten Zeichnungsdaten angezeigt.

4. Schließlich

Ich habe verschiedene Informationen im Internet organisiert und drei Möglichkeiten zusammengefasst, um OpenAI Gym auf Google Colab zu zeichnen. Es sollte der Code sein, den ich tatsächlich mehrmals ausgeführt und bestätigt habe, aber es tut mir leid, wenn ich eine Kopie von Pemis gemacht habe.

Gym-Notebook-Wrapper ist immer noch rau und kann Fehler aufweisen. Wenn Sie Fragen haben, können Sie [Problem] einrichten (https://gitlab.com/ymd_h/gym-notebook-wrapper/-/issues). Ich bin froh, wenn du es bekommst.

Recommended Posts

[Lernen stärken] Wie zeichnet man OpenAI Gym auf Google Corab (Version 2020.6)?
So verwenden Sie Google Assistant unter Windows 10
[Version 2020] So installieren Sie Python3 auf EC2 von AWS
Stärkung des Lernens 3 OpenAI-Installation
Verwendung von Django mit Google App Engine / Python
Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (③ Stärkung des Lernens in Ihrer eigenen OpenAI Gym-Umgebung).
So zeichnen Sie einfach die Struktur eines neuronalen Netzwerks in Google Colaboratory mit "convnet-drawer"
Verstärkungslernen in kürzester Zeit mit Keras mit OpenAI Gym
[Google Colab] So unterbrechen Sie das Lernen und setzen es dann fort
Stärkung des Lernens 28 colaboratory + OpenAI + chainerRL
So installieren Sie Tabpy 1.0 (Version 2020-01)
So registrieren Sie sich bei pypi
So ändern Sie die Python-Version
Tiefe Stärkung des Lernens 1 Einführung in die Stärkung des Lernens
So verwenden Sie Google Colaboratory
So aktualisieren Sie die Python-Version von Cloud Shell in GCP
So installieren Sie mysql-connector-python auf einem Mac
Verwendung von Dataiku unter Windows
Hinweise zur Verwendung von Pywinauto
So installieren Sie das Graph-Tool unter macOS
So installieren Sie VMware-Tools unter Linux
So stellen Sie den Django-Kompressor unter Windows bereit
So erhalten Sie die Python-Version
Hinweise zur Verwendung von featuretools
Wie man Matplotlib auf Heroku ausführt
So installieren Sie PyPy unter CentOS
Wie benutzt man Homebrew in Debian?
[Memo] Verwendung von Google MµG
Missverständnisse beim Verbinden von cnn
So installieren Sie TensorFlow unter CentOS 7
So überprüfen Sie die Linux-Betriebssystemversion
So installieren Sie Maven unter CentOS
Hinweise zum Schreiben von require.txt
So installieren Sie Musik 21 unter Windows
Sammeln von Daten zum maschinellen Lernen
Wie man für den Deep Learning Association G-Test (für Anfänger) lernt [Version 2020]
So installieren Sie das Deep Learning Framework Caffe auf einem Mac im CPU-Modus
Wie zeichnet man eine vertikale Linie auf einer Heatmap, die mit Python Seaborn gezeichnet wurde?