카테고리 없음

뱀게임 인공지능을 만들어보자.(1)

2jun0 2020. 9. 24. 00:08

이번에는 간단하게 뱀 게임을 학습하는 모델을 만들어 보려고 한다.

 

뱀 게임은 이전에 만든 것을 가져와서 쓸 것이다. (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을 이용해서 시간개념을 학습해야 될것 같은데...

 

이건 너무 큰 일인 것 같아서 고민중이였지만,

새로운 방법을 찾았다.

이동방향에 따라 레이블을 다르게 하는 방법이였다.