관리 메뉴

솜씨좋은장씨

Google Colab에서 OpenAI SpaceInvaders-Atari2600 오류 없이 실행하는 방법! 본문

머신러닝 | 딥러닝/강화학습

Google Colab에서 OpenAI SpaceInvaders-Atari2600 오류 없이 실행하는 방법!

솜씨좋은장씨 2021. 6. 7. 23:05
728x90
반응형

유튜브를 보면서 SpaceInvaders-v0 을 Google Colab에서 따라해보던 중

import gym
env = gym.make("SpaceInvaders-v0")

위의 코드를 실행하면

Exception                                 Traceback (most recent call last)
<ipython-input-25-ef7bdae7e19a> in <module>()
----> 1 env = gym.make("SpaceInvaders-v0")

4 frames
/content/atari-py/atari_py/games.py in get_game_path(game_name)
     18     path = os.path.join(_games_dir, game_name) + ".bin"
     19     if not os.path.exists(path):
---> 20         raise Exception('ROM is missing for %s, see https://github.com/openai/atari-py#roms for instructions' % (game_name,))
     21     return path
     22 

Exception: ROM is missing for space_invaders, see https://github.com/openai/atari-py#roms for instructions
Exception: ROM is missing for space_invaders, see https://github.com/openai/atari-py#roms for instructions

위와 같은 오류가 계속 발생했습니다.

 

여러 GitHub Issue와 Stack Overflow를 참고하여 해결한 방법을 공유해보려합니다.

!wget http://www.atarimania.com/roms/Roms.rar
--2021-06-07 12:34:43--  http://www.atarimania.com/roms/Roms.rar
Resolving www.atarimania.com (www.atarimania.com)... 195.154.81.199
Connecting to www.atarimania.com (www.atarimania.com)|195.154.81.199|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11128004 (11M) [application/x-rar-compressed]
Saving to: ‘Roms.rar’

Roms.rar            100%[===================>]  10.61M   482KB/s    in 23s     

2021-06-07 12:35:07 (465 KB/s) - ‘Roms.rar’ saved [11128004/11128004]

먼저 필요한 파일을 wget 명령어로 다운로드 받습니다.

!unrar x /content/Roms.rar
UNRAR 5.50 freeware      Copyright (c) 1993-2017 Alexander Roshal


Extracting from /content/Roms.rar

Extracting  HC ROMS.zip                                               OK 
Extracting  ROMS.zip                                                  OK 
All OK

다운받은 rar파일을 unrar를 활용하여 풀어줍니다.

!unzip /content/ROMS.zip

그럼 나온 파일중에 ROMS.zip을 unzip을 활용하여 압축을 풀어줍니다.

!pip install gym-retro

그 다음 pip 명령어를 통하여 gym-retro를 설치합니다.

!python3 -m retro.import ROMS/

그리고 위의 명령어를 한번 실행해줍니다.

 

그리고 gym의 render 명령어를 제대로 동작하게 하기 위해서 아래의 링크를 참고하여 필요한 설치 작업들을 진행합니다.

 

Google Colab에서 OpenAI gym render 사용하는 방법!

이번주부터 회사의 동료분과 함께 강화학습에 대해서 공부해보기로 하여 마침! 결제해두고 제대로 활용하지 못하던 Google Colab Pro에서 OpenAI의 gym을 활용해서 여러 예제들을 직접 해보기로 했습

somjang.tistory.com

 

위의 링크를 참고하여 필요한 설치 작업 진행이 완료되었다면

import retro
import random
from pyvirtualdisplay import Display 
import matplotlib.pyplot as plt

display = Display(visible=False, size=(400, 300)) 
display.start()

env = retro.make(game="SpaceInvaders-Atari2600")

height, width, channels = env.observation_space.shape
actions = env.action_space.n

episodes = 5
for episode in range(1, episodes):
    state = env.reset()
    done = False
    score = 0

    while not done:
        env.render(mode='rgb_array')
        action = random.choice([0, 1, 2, 3, 4, 5])
        n_state, reward, done, info = env.step([action])
        score += reward
    print(f"Episode : {episode} Score : {score}")
env.close()

위처럼 코드를 작성하고 실행해보면!

Episode : 1 Score : 485.0
Episode : 2 Score : 775.0
Episode : 3 Score : 555.0
Episode : 4 Score : 485.0

제대로 동작하는 것을 볼 수 있습니다.

 

저는 위의 코드중에서

n_state, reward, done, info = env.step([action])

이 부분에서 삽질을 가장 오래했습니다.

n_state, reward, done, info = env.step(action)

맨 처음 action을 위처럼 작성하였다가

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-40-ddce2f4b87e4> in <module>()
      8         env.render(mode='rgb_array')
      9         action = random.choice([0, 1, 2, 3, 4, 5])
---> 10         n_state, reward, done, info = env.step(action)
     11         score += reward
     12     print(f"Episode : {episode} Score : {score}")

1 frames
/usr/local/lib/python3.7/dist-packages/retro/retro_env.py in action_to_array(self, a)
    162                     action |= buttons[ap[i]]
    163             else:
--> 164                 ap = a[self.num_buttons * p:self.num_buttons * (p + 1)]
    165                 for i in range(len(ap)):
    166                     action |= int(ap[i]) << i

TypeError: 'int' object is not subscriptable

이와 같은 TypeError : 'int' object is not subscriptable 오류가 계속 났는데

이는 action을 [action] 으로 변경 하고 나서 해결되었습니다.

 

그럼 ! 읽어주셔서 감사합니다.

 

즐거운 개발 하시기 바랍니다~

Comments