Inverted Pendulum이 무엇인지에 대해서는 관련 문서를 읽어보고, 파악합니다. 이번에는 action이 연속적인 것이 특징입니다.
직접 조작해보면서 막대기를 위로 계속 세워보고, 반환되는 보상값을 확인합니다.
##############################################
# 키보드 입력을 받아 action을 결정하는 코드
from pynput import keyboard # pip install pynput
action = 0
def left():
global action
action = -2
def right():
global action
action = 2
def dont_accelerate():
global action
action = 0
listener = keyboard.GlobalHotKeys({
'j': left, # j는 시계 방향으로 가속
'l': right, # l은 반시계 방향으로 가속
'k': dont_accelerate # k는 가속하지 않음
})
listener.start()
##############################################
import gymnasium as gym
import time
env = gym.make('Pendulum-v1', render_mode="human")
env.reset()
steps = 0
while True:
# env.step 진행
_, reward, done, _, _ = env.step((action,))
print("현재", steps, "스텝 에서의 보상 반환값:", reward)
steps += 1
time.sleep(0.1)
pendulum를 학습할 수 있는 코드를 만듭니다.
학습을 마치면 인퍼런스에 사용할 모델을 세이브 합니다.
# 모델을 저장하는 코드
model = DQN()
####################
# 학습을 진행 후... #
####################
model.save_weights('your_model_name', save_format='tf')
세이브 한 모델을 불러와서 잘 작동하는지 확인해봅니다.
# 모델을 불러오는 코드
model = DQN() # 이때, DQN 클래스는 save_weights를 사용한 객체의 클래스 구조가 동일해야 함
model.load_weights("your_model_name")
난이도 선택
Pendulum은 환경을 생성할 때 중력가속도를 지정할 수 있습니다(해당 문서의 arguments 확인). 일반적으로 진자의 반동으로 꼭대기에 세워야 하고 및 꼭대기에 세웠을 때 중심을 잡는 과정이 있어야 하지만, g가 낮은 값으로 설정되면 진자의 반동 없이 힘으로 중력을 거스르고 바로 올라갈 수 있어서 문제 복잡성이 낮아집니다. 해당 문제가 학습이 잘 안된다고 판단되면 g를 낮추고 진행할 수 있습니다.
난이도 | 중력가속도 |
---|---|
평온 | 1 |
보통 | 5 |
어려움 | 10(기본) |
토글
코드가 너무 길어서 토글 항목으로 만들고 싶으면 마크다운에 다음과 같이 작성하면 됩니다.
<details>
<summary>토글 접기/펼치기</summary>
<div markdown="1">
안녕
</div>
</details>