우리는 얼굴 표정 분류를 위해 심층 학습 모델을 구축하고 학습시킬 거예요
먼저 맨 처음부터 모델을 구축해서 모델을 학습시키고, 나중에 배포도
해볼 생각인데
그리고, 단일 모델만 포함하지 않고 2개 이상의 모델을 합치고 싶었어요
조금 독특하긴 하지만, 여러분께 구축부터 시작해서 학습, 배포까지의 전체적인 머신러닝
과정을 단일 모델이 아닌 여러 모델들로 보여드리고 싶었어요
여기에서 우리가 해볼 것은 저번 model1에서 인공 신경망을 구축해 볼 때
사용했던 Res-block을 활용해 볼 것이에요
기억해 보시면, 이전에 res_block 함수를 정의했었죠
https://parkit.tistory.com/108
여기에서 res_block function을 정의했었고 기억해 보시면, 여기에 메인 경로가 있었고
짧은 경로가 있어서 여기에서 둘을 합했었죠
또 기억해보시면, 이게 convolution 블록이었고, 이 이후에는 2개의 identity 블록이 있었죠
또 MaxPooling 레이어가 하나는 있고 하나는 없었죠
그래서 주 경로에서 무엇이 오든지 입력 그대로 주고 더할 수 있었어요
그리고 또 다른 identity 블록이 있었고, identity 블록 2였죠
기억해 보시면 이 이후에 있었죠 그리고 만약 이 내용이 조금 헷갈리신다면 다시 돌아와서 이 이미지를
참고해 주세요
우리는 정확히 똑같은 함수를 사용할 것인데
하지만 여기에서는 우리만의 네트워크 프로세스를 이용해 볼 거예요
convolution을 몇 개 더 추가해 보고 Res-block들, AveragePooling, Flatten()이게 다예요
이는 AveragePooling2D 레이어의 입력 크기가 (2, 2)인데, 풀링 크기(pool_size)를 (4, 4)로 설정하여 발생한 문제입니다. 풀링 크기가 입력 크기보다 크기 때문에, 계산 과정에서 음수 차원이 발생하게 됩니다.
해결 방법은 풀링 크기를 입력 크기보다 작거나 같게 설정하는 것입니다. 이 경우, 입력 크기가 (2, 2)이므로 풀링 크기를 (2, 2)로 설정해야 합니다.
그럼 가서 시작해 봅시다
먼저 입력 shape를 정의해 주고요 그 이유는 Model2에서 쓰일 입력 shape은
Model1에서의 입력 shape과ㅍ 같아야 하기 때문이에요
그래서, 기억해 보시면 이미지 크기를 48 x 48픽셀에서 96 x 96픽셀로 바꿔주었어요
여기에서는 입력 tensor shape를 정의해 줬고 ZeroPadding도 추가해 줬었어요
그리고 여기에서 Conv2D를 쓰고, 그 뒤에는 BatchNormalization,
그리고 ReLU 활성화 함수와MaxPooling2D도 했었어요
그리고 여기에서는 Res-block들을 추가했었죠
여기 Res-block을 보면 필터 사이즈가 [64, 64, 256]이었고'stage = 2로' 했었죠
또 다음 Res-block에서는 사이즈가 [128, 128, 512]이고
그리고, 여기에 또 추가 stage를 더 추가할 수 있지만
여기에서는 그냥 스킵 할게요 그래서 주석 처리해놓은 것이고, 이제 총 2 stage의 Res-block들이 있죠
그리고 Res-block으로부터 출력을 가져와서 AveragePooling2D에 줄 거예요
그러고 모든 특성 맵을 펼칠 것이고
그리고 나서 Dense 출력, Dense 인공신경망을 마지막에 둘 거예요
보시다시피, 정말 중요한 건 출력 개수가 5라는 거예요
이게 꽤 중요해요
왜냐하면 제가 지금 예측하려는 게 5가지 감정들이기 때문에
저는 이 5개 출력 중에 어떤 것이 가장 높은 예측 확률을 가질지 보려고 하는 것이죠
그리고 그게 여기 출력에 활성화 함수가 'softmax' 활성화 함수인 이유예요
그래서 여기에서 해볼 것은 기본적으로 softmax 활성화 함수가 -1부터 1 사이의
saturated 출력을 만들어내기 때문에 이것을 확률(probability)로서 사용해 볼 수 있는 것이에요
예를 들어, 범위가 0부터 1인 아무 활성화 함수를 사용해도
확률(probability)을 만들어 낼 거예요
그러고 나서 Argmax를 사용해서 이 5가지 출력들 중에 어떤 것이 가장 높은 확률을 가지고 있는지 물어보고
가장 높은 것이 목표 클래스로 삼는 거예요
이게 모델에서 나오는 실제 예측이 되는 것이죠
'기쁨'일 수도 있고'혐오'일 수도 있고 '슬픔'일 수도 있고 이렇게요
여기 이 레이어 이름을'Dense_final'이라고 해주었고
그리고 여기 'kernal_initializer'를 사용하고 있죠
이건 초기값을 무작위로 뽑는 대신에 glorot_uniform이라는 것을 이용해서
네트워크 가중치를 초기 설정해 줄 때 분산 값을 지정해 주는 거예요
그리고 여기에서는 모델을 구축하고 있고 그리고 여기에서 'model_2_emotion'이라고 부르고 있죠
그리고 저번 모델을 뭐라고 불렀었는지 기억해 보시면
https://parkit.tistory.com/110
링크에서는 'model_1_facialKeyPoints'라고 불렀었죠
그리고 여기에서는 'model_2_emotion'이라고 부를 거예요 기본적으로 감정을 예측하기 때문이죠
그러면 계속해서 실제로 실행시켜보고 요약을 확인해서 모델이 잘 작동하는지 안 하는지 봅시다
자, 여길 보면 이제 또 다른 모델이 생겼고 이 모델은 각기 다른 레이어들을 가지고 있죠
이제 'zero_padding'이 있고, convolution 레이어도 있고 BatchNrormalization도 있고
Activation에 MaxPoolint2D.. 각각의 Res-block들 Res-block 2도 있고요
그리고 더 내려보면, 여기 다 다른 Activation들도 있죠 Res-block3에 대한 정보들도 여기 모두있고요
그리고 더 내려보면 Dense 레이어가 있어요
AveragePooling 이랑 Dense 레이어도 있죠
우리가 마지막으로 추가했던 레이어예요
그리고 여길 보면, 이 모델에 110만 개의 학습 가능한 파라미터들이 있어요
그럼 계속해서 이 모델을 컴파일 해봅시다
여길 보면 optimizer를 'Adam'으로 지정해 주었고, 'loss = "categorical_crossentropy"'로 해주었고
그리고 여기 'loss = "categorical_crossentropy" '부분은 2개 이상의 클래스들이 있기 때문에
즉, 2개 이상의 카테고리가 있기 때문에 이렇게 설정해 준 거예요
기본적으로 5개의 카테고리가 있죠
그리고 binary crossentropy라는 것을 사용하셔도 되는데
예측이 이진수 즉, 0 또는 1로 예측할 때에는 여기 loss function에 binary crossentropy를
사용하셔도 돼요
그리고 여기 metrics는 "accuracy"가 될 거예요
그리고 여기에서 2가지를 지정해 주고 싶어요
EarlyStopping을 지정해 줄 것인데
여기에서 하는 것은, 기억해 보시면 데이터를 학습, 테스트, 검증으로 나누었었죠
그래서 여기에서 해주는 것은 모델을 학습시킬 때
검증 데이터세트를 사용해 주는 거예요 validation loss를 지켜보고 모델이 학습될 때
학습 데이터세트의 loss가 줄어들면 validation loss도 줄어들도록 해주는 거예요
이렇게 되면 제 모델이 일반화할 수 있게 되고, 그럼 완벽하죠
하지만 학습 데이터세트의 loss가 줄어드는데 검증 데이터세트의 loss가 늘어나면
그건 모델이 학습 데이터에 과도하게 적응하고 있고 일반화하는 데에 실패하고 있다는 뜻이에요
만약 이런 일이 1~2개의 에폭에서 일어났다면 그래도 괜찮아요
별일 아니죠 그런데 여기 patience = 20이라고 하면, 이 말은 20번째인데도
만약 validation loss가 개선이 안되면 멈춰준다는 뜻이에요
이게 Earlystopping이라고 부르는 이유이죠
20번째에서 더 나아지지 않는다면 학습을 중단할 수 있는 것이죠
그리고 여기에서 해보려는 것은 모델 체크포인트예요
가장 검증 손실이 적은 최적의 모델을 저장할 수 있도록 해주는 것이죠
그래서 기본적으로 모델이 학습될 때, 그중에 가장 최적의 모델을 고르고 이 모델을 사용할 거예요
네트워크 가중치도 'FacialExpression_weights.hdf5'에 저장해 줄 것이죠
이게 파일 명이 될 것이고 여기에서는 'save_best_only'를 True로 지정해 줄 거예요
이렇게 되면 모든 것들을 저장하지 않고 그중 최적의 모델만 저장하도록 하는 것이죠
일반적으로 이렇게 해요
그리고 이제 fit 메소드를 'model_2_emotion'에 적용해 주고 학습 데이터를 이용해 줄 거예요
https://parkit.tistory.com/113
'train_datagen'을 해주고 그리고 참고로, 이건 제가 전에 만들어놨었던 데이터 제너레이터예요
여기를 기억해 보시면, 'train_datagen = ImageDataGenerator'를 해주었었죠
그리고 데이터 증강을 해주고 기본적으로 이미지 배치들을 만들어 줬었어요
그리고 이걸 학습을 위해 사용해 줄 거예요
여기에서 X_train, y_train을 적어주고 배치 사이즈는 64로 해줄 거예요
그래야 배치로 64개의 이미지들을 줄 수 있겠죠
그리고 여기에서는 검증을 위해 validation_data를 지정해 줄 것이고 X_val, y_val이 되겠죠
그리고 여기에서는 모델이 초반에 실행될지 말지를 정하기 위해서
에폭을 2 정도로 설정해 줄 것이고
여기에서 callbacks를 checkpointer랑 earlystopping으로 지정해 줄 거예요 여기에서 정의해
줬었죠
그럼 계속해서 한번 실행해 봅시다 shift + enter 해주고
모델이 바뀌었는지 안 바뀌었는지 봅시다
시간이 걸리게 되면 나쁜 신호는 아니에요 이건 이제 모델이 학습되고 있고
그리고 여기에 2개의 에폭이 있고
지금 accuracy 같은 경우는 23%에서 42%에서 점점 증가가 될거예요
그리고 이 두 에폭 동안 무슨 일이 일어나는지 봅시다
그리고 이다음에 할 것은 이 모델 구조를 json 파일에 저장해 줄 거예요
그래서 지난 model 1을 기억해 보시면 모델에 대한 2가지를 저장했었어요
모델 구조를 .json으로 저장했었고 실제 가중치들을 .hdf5에 저장했었죠
자, 여기에 가중치들이 있고 이들 중에 가장 최적의 가중치들만 저장할 거예요
그리고 모델 구조만 저장할 것이죠
그래서 이를 위해 'FacialExpression-model.json'을 열어주고, 'w'는 적는다는 뜻이에요
그리고 model_json에 적어 주면 이게 제 model_2_emotion의 실제 구조가 될 거예요
그리고 이것을 'FacialExpression-model.json' 이라는 파일명에 저장해 주는 것이죠
그러면 실행해 봅시다
그리고 여기에 여러분들을 위한 미니 과제가 있고 이건 미니 과제 숙제가 될 거예요
여러분들이 하셔야 할 것들은
모델을 가지고 와서 몇몇 개를 조금 바꿔서 실험을 해보는 거예요
예를 들어, 배치 사이즈를 조금 바꿔본다고 하면
예를 들어, 64 대신에 배치 사이즈를 32로
바꿔준다던가 혹은 128로 바꿔줄 수도 있겠죠
patience 값에 다른 값들을 적용해 보는 것도 해보셨으면 좋겠어요
예를 들어, patinece를 위해 20 에폭 대신에 예를 들어 성급하게 해주는 것이죠
예를 들어, 10 에폭만 해준다던가 그리고 이게 모델 성능을 개선할지 악화시킬지
한번 보는 거예요
그리고 다른 옵티마이저도 한번 사용해 보세요 Adam optimizer 대신에, 예를 들어
stochastic gradient descent나 SGD optimizer를 써볼 수도 있죠
아니면 예를 들어 Keras 문서를 보면 여기에 쓰일 수 있는 다양한 Optimizer들이 적혀있어요
성능을 개선하기 위해서 예를 들어 다른 네트워크 구조를 시도해 볼 수도 있죠
예를 들어서 2개의 Res-block을 실행시키는 대신에 또 다른 Res-block을 추가할 수도 있고, 아니면 Convolution에
다른 사이즈를 정할 수도 있죠 그냥 이걸 가지고 실험을 해보는 거예요
그리고 이게 AI를 배우는 아름다움이에요 딥 러닝 분야가 굉장히 새로운 분야라서
모든 것이 최근에 나왔죠
말 그대로 인간의 지능을 복제하고 있는 거니까요 그 자체로 궁극적인 지능이죠
지금 작은 뇌를 만들고 있는 거예요
실험해 보고 학습시키는 방법을 모두 자세하기 알지는 않지만
이게 AI 설명 가능성 프로젝트를 전체적으로 하려는 이유이고
모델을 직접 열어봐서 왜 이런 구체적인 결정을 했고
무엇을 생각했는지 어떻게 배웠는지 이런 것들을 알아볼 거예요
상당히 재미있고 흥미로울 거예요
실험해 볼 수도 있고 GPU에 접근하고 TPU에 접근할 수도 있고
세상의 어느 곳이든 이 모든 것을 할 수 있죠 정말 놀라운 거예요
아시다시피 예를 들어 특정 하드웨어가 없어도 말이에요
'딥러닝' 카테고리의 다른 글
감정Ai(17) - 얼굴 표정 분류기 모델 평가하기 (0) | 2023.05.04 |
---|---|
감정Ai(16) - 핵심성과지표 분류기 이해하기(정확도, 정밀도, 재현율 차이) (0) | 2023.05.04 |
감정Ai(14)- 이미지 확대하기 (0) | 2023.05.04 |
감정Ai(13)- 얼굴 표정 탐지를 위해 이미지 시각화하기 (0) | 2023.05.04 |
감정Ai(12)- 얼굴 표정(감정) 데이터 집합 가져오고 둘러보기(얼굴 표정 감지 파트) (0) | 2023.05.04 |