machine learning, image

Breaking Wechall Crackcha using tensorflow(keras) 2. training and testing the data.

qkqhxla1 2019. 1. 1. 23:43

http://qkqhxla1.tistory.com/988 에 이은 글. 


이젠 데이터를 트레이닝하고 테스트할 차례이다. 그전에 이전 글의 클래스를 가져왔다. 

이전글의 클래스에서 달라진건 download_and process_image에서 return preprocessed_image로 그냥 리턴시켜서 뒤의 작업들을 더 진행하지 않는다는 것이다.(있으나 마나 시간만 늘어나서 그냥 없앰.)


일단 첫번째 import하는 부분과 기본적으로 데이터를 가져와서 preprocessing하는 클래스다. make_labeled_image에서는 요기에서 설명했던 keras.utils.to_categorical함수까지 적용이 된 형태의 label된 데이터를 만들어준다. 

label_data_count는 영어 문자 갯수인 26개이고, 이걸 기초로 label의 갯수를 만든다. 그리고 아래쪽 for문에서 해당 레이블에 맞는 영어숫자의 인덱스에 1을 할당한다.

get_train_test_data에서는 내가 조합한 combined.png를 가져와서 나눈다. 26개의 영어 단어를 20행, 100열로만들었으므로 20*26행, 100열로 나눈다. 그리고 트레이닝 데이터와 테스트 데이터를 나누기 편하도록 데이터의 순서를 랜덤화한다.

validation_range변수로 ~47000개 까지는 트레이닝용, 47000~52000까지는 검증용으로 사용해서 훈련이 얼마나 잘 되는지 검증하도록 하였다. validation_range 를 정할때 얼마나 검증용으로 사용해야 할지 결정하는대 애먹었는데, 그냥 이것저것 여러번 돌리다보니 검증용으로는 10%가 적당한것같았다. 어느정도가 적합한지는 아직 잘 모르겠다.


텐서플로우의 모델 관련 정보를 가지고 있는 클래스이다. 앞에 나온 코드를 그냥 간단히 감쌌다. 나머지는 다 똑같고 predct_text에서는 해당 모델을 가지고 예측한후 가장 가능성이 높은 값을 알파벳으로 만들어 리턴한다.


훈련하는 부분이다. batch_size와 epochs는 각각 256, 90으로 설정한다. batch_size 와 epochs를 많이 변경해봤는데 batch_size는 바꿔도 크게 차이가 없는거같고, epochs가 높아질수록 정확도가 올라갔다. epochs가 높아질수록 학습이 많이 되니 그럼 epochs를 최대한 많이 하는게 좋지 않을까? 생각해서 찾아봤었는데 어떤 스택 오버플로우 글에서 검증값의 정확도가 더 올라가지 않을 정도까지만 epochs를 올리라고 하였다. epochs를 50,70,90,120까지 올리면서 계속 트레이닝을 해봤는데 90으로 했을때 검증 데이터의 정확도가 97%정도가 나오고 더이상 올라가지 않아서 90에서 그만두었다. (아래 사진에는 80부터 일정한데 내가돌릴때는 90정도부터 일정했었다..)

아래는 훈련이 끝난후 정확도를 캡쳐한것이다.

97.7%면 한문제당 글자가 5개니까, 5글자를 동시에 맞추는데 0.977**5 == 89%정도의 정확도가 나온다는 소리이다.


그리고 이제 드디어 테스트하는 코드이다. siteHandler를 dataMaker에서 가져왔고 사이트를 초기화한다. 그리고 batch_size, epochs가 각각 256, 90으로 트레이닝했던 모델을 가져와서 로드하고, 시간을 측정하면서 계속 캡챠를 다운로드받은 후 predict_text로 예측한다. 성공과 실패를 계산해서 성공률을 찍어준다. 30분이 지나면 종료하도록 하고 돌린 결과..

성공할수 있었다. 28분만에 성공했고, 성공률은 예측했던것과 비슷한 88%정도 나왔다. 사이트에서도 정확도가 높은 편이었다.

아니 98%나온분은 어떤걸 사용해서 저렇게 나왔는지 도저히 모르겠다...