안녕하세요 강화학습으로 다시 돌아왔습니다.
오늘은 가장 기본 예제인 Cartpole 예제를 작동시켜볼겁니다.
Cartpole 이 뭐냐면 바로이겁니다.
https://gymnasium.farama.org/environments/classic_control/cart_pole/
카트 위에 막대를 쓰러뜨리지 않게 하는 게임입니다.
우선 이 게임을 하기 전에 지난 시간에 올린 강화학습의 요소를 잠깐만 보고 가자면
1. 환경
2. 행동(액션)
3. 점수
가 있습니다. 정해진 환경에서 특정한 행동을 취했을 때 점수를 가장 높게 하는 것
위에 문서를 들어가보시면 세세한 정보가 디테일하게 나와있겠지만 이 카트폴 게임에 대한 대략적인 조건들만 나열을 해보면
(환경) 4가지 조건에 따라서 카트는 제멋대로 움직입니다. 카트의 위치, 카트의 가속도, 막대의 각도, 막대의 각속도
(행동) 우리는 각 step마다 카트를 왼쪽으로 밀지 오른쪽으로 밀지 정할 수 있습니다.
(점수) 점수는 오랫동안 기둥을 유지하는 것이 목표기 때문에 step을 진행할 때마다 +1점씩 부여됩니다.
처음에 주어진 환경에 임의의 값이 랜덤하게 주어지고 우리는 step마다 행동을 취할 수 있습니다. 이렇게 해서 제일 오래 버티게되면 점수가 높게 나오겠죠?
자 그럼 여기서 종료 조건은 다음과 같습니다.
1. 극 각도가 12도 이상 클때
2. 카트 위치가 +- 2.4 보다 클때 (카트의 위치가 오른쪽이랑 왼쪽 밖으로 나가버렸을 때)
3. 500점이상 얻었을때
자 이런 조건을 가지고 코드를 한번 볼까요?
* 첫번째 예시 코드에선 우선 제대로 gym 라이브러리를 가져오는지 확인하기 위해서 종료조건을 넣지 않았습니다.
사용한 환경은
python 3.8.10
gym 0.26.2
tensorflow 2.3.1
tensorflow-docs 0.0.0.dev0 버전입니다.
이 tensorflow-docs를 어떻게 설치하냐고 궁금해하실 분들은 pip로 직접 git에 들어가서 설치하셔야합니다.
!pip install git+https://github.com/tensorflow/docs
지난 시간에 구축한 주피터 노트북을 활용합시다.
import tensorflow as tf
import gym
max_steps_per_episode = 200
render_env = gym.make("CartPole-v1", render_mode='rgb_array')
gym라이브러리에서 Cartpole-v1버전을 가져옵니다.
from IPython import display as ipythondisplay
from PIL import Image
def render_episode(env: gym.Env, max_steps: int):
state, info = env.reset()
state = tf.constant(state, dtype=tf.float32)
screen = env.render()
images = [Image.fromarray(screen)]
for i in range(1, max_steps + 1):
state = tf.expand_dims(state, 0)
# action_probs, _ = model(state)
# action = np.argmax(np.squeeze(action_probs))
action = 1 # 오른쪽으로 가속
state, reward, done, truncated, info = env.step(action)
state = tf.constant(state, dtype=tf.float32)
# Render screen every 10 steps
if i % 1 == 0:
screen = env.render()
images.append(Image.fromarray(screen))
if done:
pass
# break
return images
에피소드를 작성해주는데 이게 중요합니다. gym버전이 바뀌어서 예전에는 저 env.step()부분에 대한 리턴값이 4개여서 인수가 맞지 않다는 에러가 계속떴는데 버전을 맞춰주고 나서는 해결됐습니다.
해당 코드에 대한 해석은 대략적으로 for문을 돌면서 위에 action을 오른쪽으로 +1만큼 주고 매 스탭마다 image를 저장하는 코드입니다. 원래 코드는 done (종료조건) 이되면 break지만 테스트기때문에 한 번 이미지가 저장되는 것 까지 보고 갑시다.
images = render_episode(render_env, max_steps_per_episode)
image_file = 'cartpole-v1.gif'
# loop=0: loop forever, duration=1: play each frame for 1ms
images[0].save(
image_file, save_all=True, append_images=images[1:], loop=0, duration=1)
저장된 이미지를 gif파일로 저장하는 코드입니다.
import tensorflow_docs.vis.embed as embed
embed.embed_file(image_file)
저장된 gif를 불러와봅시다.
액션에서 +1만 줬기때문에 카트가 오른쪽으로만 움직이는걸 확인할 수 있습니다.
그럼 이문제를 해결하기 위해 제가 사용한 예제를 봐볼까요?
저는 해당 예제를 그대로 실행해봤습니다.
해당 예제를 그대로 실행해보면. 다음과같은 결과를 얻을 수 있습니다.
다음시간엔 간단한 아타리 게임 예제를 가져와보겠습니다. 감사합니다.
'머신러닝' 카테고리의 다른 글
[강화학습 LR] 0. python 가상환경 구성하기 (0) | 2023.01.26 |
---|