이번에는 간단하게 뱀 게임을 학습하는 모델을 만들어 보려고 한다.
뱀 게임은 이전에 만든 것을 가져와서 쓸 것이다. (github.com/2jun0/SnakeGame)
예시로 사용할 실행화면은 위와 같다.
빨간색 점이 음식(목표)이고 파란색이 뱀(진한 파랑 : 머리, 연한 파랑 : 몸)이다.
원래 이 게임은 상하좌우키로 뱀을 움직이는 방식이였지만, 잘 생각해보면, 역방향으로는 가는게 불가능 하다.
그래서 갈 수 있는 방향은 아래처럼 3방향인데,
뱀의 진행방향에 따라 이동할 수 있는 방향이 바뀐다.
![]() |
![]() |
![]() |
![]() |
그래서 고민끝에 어떤 블로그에서 이 게임을 구현하는 것을 보고 [왼쪽으로 돌기, 오른쪽으로 돌기, 앞으로 전진] 이렇게 3개의 Action으로 구성했다.
모델의 입력으로 들어갈 레이블은 총 5개이다.
0:빈공간 | 1:음식 | 2:벽 | 3:머리 | 4:몸 |
![]() |
![]() |
(아직 구현 X) | ![]() |
![]() |
모델은 다음과 같다.
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 18, 18, 64) 2368
_________________________________________________________________
dropout (Dropout) (None, 18, 18, 64) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 16, 16, 64) 36928
_________________________________________________________________
dropout_1 (Dropout) (None, 16, 16, 64) 0
_________________________________________________________________
flatten (Flatten) (None, 16384) 0
_________________________________________________________________
dense (Dense) (None, 128) 2097280
_________________________________________________________________
dropout_2 (Dropout) (None, 128) 0
_________________________________________________________________
dense_1 (Dense) (None, 3) 387
=================================================================
Total params: 2,136,963
Trainable params: 2,136,963
Non-trainable params: 0
_________________________________________________________________
이렇게 강화학습 하면 잘 될줄 알았는데....
잘 안되었다.
학습을 하면 자꾸 빙글빙글 돈다......
알고보니 Action으로 정한 [왼쪽으로 돌기, 오른쪽으로 돌기, 앞으로 전진]이 절대적인 방향이 아닌 상대적인 방향이라서 원래 뱀 자체가 어디를 향하고 있었는지 모델에 집어 넣어야 한다는 것이였다.... 그것이 아니면 RNN을 이용해서 시간개념을 학습해야 될것 같은데...
이건 너무 큰 일인 것 같아서 고민중이였지만,
새로운 방법을 찾았다.
이동방향에 따라 레이블을 다르게 하는 방법이였다.