과제/3학년
[과제 : 3학년] 인공지능_1 (틱택토 학습)
브디크리
2023. 9. 1. 14:39
서론
틱택토 데이터를 통해, 지도학습을 수행하고 최적의 하이퍼 파라미터를 찾아보았다.
1. 데이터 가져오기
깃허브에서 틱택토 데이터를 다운로드 받아 사용하였다.
2. 코드 설명
코드_1
- tensorflow, numpy, matplotlib.pyplot을 import 해줍니다.
- numpy는 데이터가 많으면 생략해서 보여주기 때문에 sys를 import한 후,
np.set_printoptions(threshold=sys.maxsize)를 하게 되면, 생략 없이 배열의 모든 원소를 보여주게 됩니다.
(처음에 true와 false를 3,4의 값으로 주었을 때 y_true를 원핫 인코딩했을 때 두 개의 요소이기 때문에 01, 10으로 나올 것으로 예상했지만 00010, 00001으로 나오는 것을 인지하지 못하여 출력개수를 확인하지 못하였는데 이를 해결하기 위해 사용하였습니다. 이를 확인한 후 이후 0과 1로 변경하였습니다.) - numpy는 문자열을 label을 통해 ‘x’, ‘o’, ‘b’의 key를 각각 0, 1, 2의 value에 배정하였고, 마찬가지로 Class를 통해 ‘true’ (x가 이겼을 경우), ‘false’(o가 이겼을 경우)의 두가지를 0, 1의 value로 변경하였습니다.
- .csv 파일의 첫 번째 행은 TL~BR, Class의 문자열이므로 이를 skiprows를 통해 넘겨주며, delimiter = ‘,’를 통해 컴마로 구분하여 가져옵니다.
- 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 초기화 & 배치 정규화 수행
결론
하이퍼 파라미터를 최적화 시키기 위해서 엄청 많이 학습을 진행해보았따.
인공지능이라는걸 처음 배웠는데, 생각보다 재미있었다.
그래서 수업시간에 배운걸 과제에 다 써보고 싶었기도 하고, 성능을 최대한 좋게 만들기 위해서
여러가지 방법을 사용해보았던 것 같다!.