과제/3학년

[과제 : 3학년] 인공지능_1 (틱택토 학습)

브디크리 2023. 9. 1. 14:39

서론


틱택토 데이터를 통해, 지도학습을 수행하고 최적의 하이퍼 파라미터를 찾아보았다.


1. 데이터 가져오기


깃허브에서 틱택토 데이터를 다운로드 받아 사용하였다. 


2. 코드 설명


코드_1



  1. tensorflow, numpy, matplotlib.pyplot을 import 해줍니다.

  2. numpy는 데이터가 많으면 생략해서 보여주기 때문에 sys를 import한 후,
    np.set_printoptions(threshold=sys.maxsize)를 하게 되면, 생략 없이 배열의 모든 원소를 보여주게 됩니다.
    (처음에 true와 false를 3,4의 값으로 주었을 때 y_true를 원핫 인코딩했을 때 두 개의 요소이기 때문에 01, 10으로 나올 것으로 예상했지만 00010, 00001으로 나오는 것을 인지하지 못하여 출력개수를 확인하지 못하였는데 이를 해결하기 위해 사용하였습니다. 이를 확인한 후 이후 0과 1로 변경하였습니다.)

  3. numpy는 문자열을 label을 통해 ‘x’, ‘o’, ‘b’의 key를 각각 0, 1, 2의 value에 배정하였고, 마찬가지로 Class를 통해 ‘true’ (x가 이겼을 경우), ‘false’(o가 이겼을 경우)의 두가지를 0, 1의 value로 변경하였습니다.

  4. .csv 파일의 첫 번째 행은 TL~BR, Class의 문자열이므로 이를 skiprows를 통해 넘겨주며, delimiter = ‘,’를 통해 컴마로 구분하여 가져옵니다.

  5. shuffle = true를 통해 데이터를 섞어주었습니다.

코드_2


  • 데이터를 훈련데이터와 테스트 데이터로 나누어 실험하기 위하여
    train_test_data_set 함수를 통해 8:2의 비율로 데이터를 나누었습니다.

코드_3


  • 위에서 선언한 함수를 이용하여 tic-tac-toe의 학습데이터를 로드하고
    로드한 데이터를 train_data와 test_data로 분리하였습니다.

코드_4


  • 손실함수를 mse, categorical_crossentropy의 두가지를 사용할 것이기때문에
    y_train과 y_test를 원-핫 인코딩으로 변경해줍니다.

코드_5


  • 입력이 TL~BR까지의 9개, 뉴런이 10개인 입력층을 만들고,
    뉴런이 5개인 은닉층, 출력이 true, false의 2개인 출력층을 만들어줍니다.
  • 은닉층은 후에 여러 변화를 줄 예정입니다.

코드_6


  • 손실함수로 MeanSquaredError, CategoricalCrossentropy를 사용하여 보기 위하여 다음과 같이 선언하였고,
    y의 값이 1(1-0), 0(1-1)이므로 이는 이진 교차 엔트로피이므로 BinaryCrossentropy 또한, 적용해보았습니다.

코드_7


  • 여러 Optimizer를 선언하고, 손실함수와 optimizer를 다양하게 조합해보았습니다.

코드_8


  • 텐서보드를 이용한 결과 확인

코드_9


  • train_loss, val_loss를 그래프를 통해 확인하고, test_data를 통해 모델 평가하여 나온 loss를 점으로 찍어줍니다.
  • train_acc, val_acc를 그래프를 통해 확인하고, test_data를 통해 모델 평가하여 나온 acc를 점으로 찍어줍니다.

결과


결과_1 (Optimizer 변경)


RMSprop Adam SGD

  • RMSprop가 loss가 가장적고, acc가 가장 높았다.

결과_2 (Loss 함수 변경)


MSE CategoricalCrossentropy BinaryCrossentropy

 

  • MSE가 가장 loss가 적고, acc가 높았다.

결과_3 (Epoch & Leaning Rate변경)


epoch = 100, lr = 0.01 epoch = 1000, lr = 0.001

  • epoch = 1000, lr = 0.001일 때 loss가 가장 낮고, acc가 가장 높았다.
  • 또한, validation_data와 train_data의 차이가 적었다.

결과_4 (은닉층 개수 & 뉴런 개수 변경)


은닉층 : 1개, 뉴런 5개 은닉층 : 3개, 뉴런 100개

  • 은닉층 크기와 뉴런이 클수록 loss가 적고, acc가 높았다.
    (과적합일 가능성이 있다.)

결과_5 (가중치 초기화 & 배치 정규화 수행)


  • 은닉층 4개 뉴런 100개 일 때
  • 그래디언트 소실을 해결하고, 정확도를 높이기 위해 수행
  • 왼쪽 그림은 그래디언트 배니싱때문에 학습이 진행이 안되는 상태이다.
수행 X 수행 O


최종 결과


Optimizer loss epoch learning rate 은닉층 개수 은닉층 뉴런 수
RMSprop MSE 1000 0.001 3개 100개
  • Xavier 초기화 & 배치 정규화 수행


결론


하이퍼 파라미터를 최적화 시키기 위해서 엄청 많이 학습을 진행해보았따.

인공지능이라는걸 처음 배웠는데, 생각보다 재미있었다.

그래서 수업시간에 배운걸 과제에 다 써보고 싶었기도 하고, 성능을 최대한 좋게 만들기 위해서
여러가지 방법을 사용해보았던 것 같다!.