Ich habe überprüft, wie OpenAI Gym auf Google Colab gezeichnet wird. Notieren Sie sich dies.
Referenzierte Websites
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()
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.
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)
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()
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()))
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'))))
Da es schwierig ist, die obige Methode jedes Mal zu schreiben, habe ich sie in eine Bibliothek umgewandelt.
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.
Der Fitness-Notebook-Wrapper hat einen langen Bindestrich (-
), daher kann der Modulname gnwrapper
importiert werden.
gnwrapper.Animation
gnwrapper.LoopAnimation
gnwrapper.Monitor
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()
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.
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.
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