Tensorflow:: Resnet_v2 와 Inception을 활용하여 딥러닝 하기.
기존 slim모델을 활용하여 나와있는 여러 딥러닝중 단연 가장 많은 것이 Inception일 것 같다. 나도 가장 먼저 Inception_v4를 먼저 사용했던 것 같다.
그러던 도중 프로보노를 같이 진행하는 멘토님게서 Inception 모델 자체가 가벼운 편에 속하지 않기 때문에 다른 모델로 경량화 하여 속도를 높여보는 것이 어떻겠냐고 제안하셨다.
그동안 졸작 진행 때문에 학기 학업도 함께 하기에 너무 벅차서 시도도 못했는데, 방학이 돼서야 시도할 수 있게 되었다. 처음에 ResNet_v2버전으로만 해봤는데, 코드를 수정해야 할 것이 많아서 인지 아니면 내가 잘못 수정한건지 오류가 너무 많이 났다. 학습단계에서 오류 해결하면 평가 코드에서 오류가 나고... 이게 무한 반복이었다. 그래프도 잘 안 맞고
그래서 ResNetV2와Inception을 합한 ResNetV2_Incpetion으로 ImageNet모델을 변경하여 딥러닝을 진행해보자.
1. slim 모델 사용
우선 Inception때 사용 했던 slim모델이 필요하다. model-master는 깃허브에서 쉽게 구할 수 있다.
https://github.com/tensorflow/models
2. 코드 수정
기존에 사용하던 flower 코드를 수정하여 나만의 이미지 셋을 학습시킬 것이다. + ResNetV2+ Inception 까지, 다소 복잡할 수 있어서 정리를 해본다.
2-1. 코드 복사하기
flower예제를 진행했을 때 사용한 코드들을 모두 복사한 후, 자신이 사용하는 프로젝트 이름으로 변경해준다. (햇갈리지 않도록)
예를들어 디렉토리 이름이 Animal이면 Animal과 관련되도록 코드를 복사해서 이름을 변경해주면 후에 추가학습이 필요하거나, 이미지 추론을 할 때 매번 경로와 변수들을 변경 할 필요가 없다.
** datasets폴더 안에 있는 파일은 datasets)로 표시
기존 파일 | 변경 |
download_and_convert_data.py | download_and_convert_data_SL3.py |
Image_Classification_Flowers.py |
Image_Classification_SL3.py |
train_image_classifier.py | train_image_classifier_SL3.py |
datasets) dataset_factory.py | datasets) dataset_factory_SL3.py |
datasets) download_and_convert_flowers.py | datasets) download_and_convert_SignLanguage3.py |
datasets) flowers.py |
datasets) SignLanguage3.py |
2-2. 코드 내부 수정
download_and_convert_data_SL3.py
train_image_classifier_SL3.py
datasets) dataset_factory_SL3.py
datasets) download_and_convert_SignLanguage3.py
여기서 조금 계산을 해야하는데... 일단 주석에 나와있는 줄수의 코드를 수정해야한다는 뜻이다.
validation = 학습 이미지 총 개수 * 0.2 (보통 20%를 validation으로 지정한다고 한다)
num_shards = 전체 이미지 용량(MB) / 40 (이전에 진행하던 예제에서 학습을 통해 도출되는 파일이 한 파일당 40MB 정도를 차지하므로, 그정도로 얼추 맞춰주기 위해서 40으로 나오려면 얼마만큼의 num_shards가 필요한지 계산하기 위해 40으로 나눔...ㅎ)
datasets) SignLanguage3.py
FILE_PATEERN은 도스 창에 tfrecord가 얼만큼 변경됐는지 알려주기 위한거라 딱히 상관은 없음.
train = 전체 이미지 개수 - validation (train과 validation은 8:2의 비율을 대체적으로 가지는게 이상적이라고 한다.)
NUM_CLASS = 분류하려고 하는 이미지 폴더 개수
(5개의 꽃을 분류 시키고자 한다면 5라고 적으면 된다. 다는 팀원들과의 빠른 작업을 위해 1000으로 고정시켜놓음. 1000개의 분류가 아니어도 추론할 때 classes와 맞으면 잘 돌아가기 때문에)
Image_Classification_SL3.py
datasets폴더를 나와 다시 slim폴더로 돌아가서 이 코드를 고쳐줘야 하는데, 여기선 바꿀 것이 많다.
checkpoints_dir = 추론할 때 사용할 마지막 모델이 있는 폴더 경로, 이것은 텐서플로에서 학습시킬 때 ckpt모델이 있는 폴더로 경로명을 해준다.
image_name = 추론을 할 이미지가 있는 테스트 폴더 경로 (참고로 파이썬은 \\ 두 번 쳐줘야함)
photo_dir = 학습 이미지 경로
ResNet_v2를 이용하기 때문에 밑줄친 코드를 모두 수정해줘야 한다. 그중에서 33번째 코드는 기존 코드와 달리, 마지막 체크포인트를 인식하도록 한 것인데 이게 은근 편하다 ㅎㅅㅎ;;
마지막으로 이부분은 선택인데, 나는 추론할 이미지를 한 번 더 확인하는 창이 너무 성가셔서 그냥 주석처리... 그리고 추론하면 3위까지 뜨는데, 인덱스를 매길 수 있도록 print함수에 추가했다.
글고 1.00% 이렇게 나와서 교수님이 이게 뭐냐고 고치라고 하셔서 소숫점만 나오게 고쳤다. 머쓱- 수치해석을 4학년 때 배운 자로서 소숫점에 %를 미쳐 신경쓰지 못하고 지나간 내가 넘 웃겼닼ㅋ
resnet으로 수정한지 꽤 오래전이라 뭘 더 수정해야하는기 기억이 안난다.... 여튼 오늘은 여기까지 적고 나중에 다시 돌려보면서 빠진 부분 채워넣야겠다.
'Python > Tensorflow' 카테고리의 다른 글
Tensorflow::파이썬 라이브러리 설치하기 (numpy, matplotlib, pandas) + PyQt5 설치하기 (0) | 2019.07.12 |
---|---|
Tensorflow::OpenPose Installation (0) | 2019.07.03 |
Tensorflow::TensorBoard사용하기 (0) | 2019.06.04 |
Tensorflow::DeepLearning 추가학습 2탄 (0) | 2019.05.24 |
Tensorflow::DeepLearning 수어 번역기 추가학습 시키기 (1) | 2019.05.24 |