2019. 9. 20. 16:39ㆍML, 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문에서는 range를 1001로 설정해 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값을 학습된 가중치와 편향과 함께 계산합니다.
만약 Xzero가 정답과 가깝다면 1에 가까운 값을 출력 값으로 얻을 수 있습니다.
얻어지는 값들을 모두 배열에 추가하고 배열에서 정답에서 먼 값인 가장 작은 값의 인덱스를 찾아서 X 배열의 같은 위치에 -1을 넣어줍니다.
이제 AI의 차례가 끝났으므로 사람이 숫자를 입력해서 말을 둡니다. 위 과정을 반복하며 게임이 진행됩니다.
게임의 결과로 각 행, 열, 대각의 합이 3이면 승리 -3이면 패배를 출력하도록 했습니다.
테스트
학습결과를 테스트하기위한 게임이므로 정교하지는 않지만 완성된 Tic-Tac-Teo 게임을 테스트해보겠습니다.
그저 X배열에 추가된 값을 (3, 3) 행렬로 보여주는 것이기때문에 O말은 1, X말은 -1, 빈 칸은 0으로 보여집니다.
1을 입력해서 말을 두었더니 컴퓨터가 중앙에 말을 뒀습니다.
중앙에 말을 먼저 두면이길 확률이 높다는것을 컴퓨터가 학습한것같습니다.
데이터가 부족한 탓인지 2를 입력했을 때 컴퓨터가 엉뚱한 곳에 말을 둔 것을 확인할 수 있었습니다.