Perceptron을 이용한 Tic-Tac-Toe게임구현 (2)

2019. 9. 20. 16:39ML, OpenCV/Tic-Tac-Toe 게임

학습시키기

한 번의 학습으로 매개변수 값을 얼마나 경신하는지 정하는 학습률0.1로 설정했습니다.

모든 학습 준비가 끝났기 때문에 ‘tf.Session’함수를 사용해서 연산합니다.

손실함수의 최솟값을 찾기 위해서 반복하며 학습합니다.

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())  
    for step in range(1001):          
      sess.run(train, feed_dict={X: X_train, Y: y_train})
        
        if step % 100 == 0:
            print(step, sess.run(cost, feed_dict={X: X_train, Y: y_train}), sess.run(W))

Tensorflow를 사용했기 때문에 위처럼 간단한 코드로 학습이 가능합니다.

1번째 줄에서 tf.Session() 함수를 사용하여 세션을 열어 연산이 가능하게 해 주며 세션의 끝에서는 저절로 세션이 닫히게 됩니다.

2번째 줄에서는 모든 변수를 초기화 해줍니다.

for문에서는 range1001로 설정해 1000회 반복학습을 하게 했고 그 간격은 step으로 정해줬습니다.

경사하강법의 학습 그래프


학습결과

학습을 끝마쳤기 때문에 학습을 통해 나온 결과들을 확인합니다.

학습이 성공적으로 이루어졌는지를 확인하는 척도인 정확도를 먼저 알아보겠습니다.

predicted = tf.cast(y_out > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

코드는 예측 값과 정확도를 구하는 코드입니다.

첫째줄에서는 tf.cast함수를 이용해 출력 값과 0.5 비교해서 0또는 1 바꿉니다.

이렇게 바뀐 예측 값을 정답과 비교 평균을 값이 정확도가 됩니다.

 

*1000 반복학습의 정확도

Train Accuracy

0.9223881

Test Accuracy

0.8888889

정확도가 90% 가까이 나왔으므로 어느 정도 학습은 성공적이라고 할 수 있겠지만 만족할 만한 수치는 아닙니다.

정확도가 낮게 나온 이유는 데이터의 부족, 신경망의 깊이 부족, 반복횟수 부족 등 여러 가지가 있을 수 있습니다.

정확도를 향상하기 위해 반복 횟수를 늘려보겠습니다.

 

*향상된 반복학습의 정확도

1000 반복

Train Accuracy : 0.9223881

Test Accuracy : 0.8888889

2000 반복

Train Accuracy : 0.98507464

Test Accuracy : 0.9583333

3000 반복

Train Accuracy : 0.9925373

Test Accuracy : 0.9618056

4000 반복

Train Accuracy : 0.9925373

Test Accuracy : 0.9618056

1000회 간격으로 반복 횟수를 늘려가며 테스트했습니다.

그 결과 위 표에서 보이듯 3000회 이상부터는 정확도가 더 이상 향상되지 않았습니다.

따라서 학습에 최적화된 반복 횟수는 3000회임을 알 수 있었습니다.  


게임 구현

학습 갱신되는 가중치와 편향을 사용해서 Tic-Tac-Teo 게임을 간단하게 구현했습니다.

게임에서는 9칸의 빈 칸이 필요하기 때문에 (1, 9) 영행렬을 만들어줬습니다.

게임을 시작하면 사람은 숫자를 입력해서[그림5] 원하는 칸에 ‘O’말을 놓을 있습니다.

(1, 9) 행렬의 원하는 칸에 1 넣는 것과 같습니다.

빈 칸의 번호

1, 9) 영행렬을 X라고 하겠습니다. 예를 들어 사람이 1 입력했다면 행렬은 [1,0,0,0,0,0,0,0,0] 됩니다.

여기서 계산에 사용될 X 같은 배열인 Xzero 만들어줬습니다.

배열의 값이 변해도 X에는 아무 영향도 미치지 않습니다.

사람의 상대는AI입니다상대는 AI입니다. AI 이기는 위치이면서 빈칸에 말을 두기 위해서 배열 0 위치를 찾습니다.

어떤 자리가 AI에게 유리한지 알기 위해 아래 그림과 같이 0 위치에 각각 -1 한번씩 넣고Perceptron을 사용해서 Xzero값을 학습된 가중치와 편향과 함께 계산합니다.

빈 곳에  -1 삽입

만약 Xzero 정답과 가깝다면 1 가까운 값을 출력 값으로 얻을 있습니다.

얻어지는 값들을 모두 배열에 추가하고 배열에서 정답에서 값인 가장 작은 값의 인덱스를 찾아서 X 배열의 같은 위치에 -1 넣어줍니다.

이제 AI 차례가 끝났으므로 사람이 숫자를 입력해서 말을 둡니다. 과정을 반복하며 게임이 진행됩니다.

게임의 결과로 , , 대각의 합이 3이면 승리 -3이면 패배를 출력하도록 했습니다.


테스트

학습결과를 테스트하기위한 게임이므로 정교하지는 않지만 완성된 Tic-Tac-Teo 게임을 테스트해보겠습니다.

그저 X배열에 추가된 값을 (3, 3) 행렬로 보여주는 것이기때문에 O말은 1, X말은 -1, 빈 칸은 0으로 보여집니다.

1을 입력

1을 입력해서 말을 두었더니 컴퓨터가 중앙에 말을 뒀습니다.

중앙에 말을 먼저 두면이길 확률이 높다는것을 컴퓨터가 학습한것같습니다.

 

2를 입력
4를 입력
6을 입력

데이터가 부족한 탓인지 2를 입력했을 때 컴퓨터가 엉뚱한 곳에 말을 것을 확인할 있었습니다.


 

 

Yeowoolee/Perceptron-Tic-Tac-Toe-game

Contribute to Yeowoolee/Perceptron-Tic-Tac-Toe-game development by creating an account on GitHub.

github.com