본문 바로가기

파이썬 & 머신러닝과 딥러닝

19일차 - 함수형 API, 전이학습, 데이터 증대, 이미지 분류

 

합성곱 신경망의 시각화

 

가중치 시각화 (필터 시각화)

 

CNN은 학습을 하면 자기가 잘 찾아내는 쪽으로 weight가 학습됨

예를 들어 첫번째 필터가 곡선을 나타내는 필터라 가정하면

이미지가 3x3에 곱하고 더한 결과가 나오게 되는데 

자기가 찾는 곡선과 일치하면 곱하고 더한 출력값 z가 크게 활성화됨 -> 찾아냄

곡선에 해당하는 부분에 가중치(weight)가 큰 값이 학습되어 있다.

 


 

합성곱 신경망의 시각화 – 가중치 시각화

만들어진 특성맵과 특성 시각화 - 저번 시간 코드 이어서

 

 

-> 32장의 필터 시각화 하기

 


 

 

-> 3x3 weight 시각화 

-> 0.0 쪽에 값이 몰려있는 양상

 

 

 

-> imshow() : weight 출력

-> vmin, vmax : 절대 기준치를 잡아줌 (같은 값은 같은 색)

-> 3x3 32장이 출력됨

-> 가중치에 따라 나타나는 색이 다르고

밝게 빛나는 필터를 보고 역으로 특징점을 찾을수 있다.

 

 


 

학습되지 않은 필터와 비교해보기

 

 

-> 학습을 시키지 않으니 랜덤하게 퍼져있는 모습

-> 시각화 하면 큰 패턴 없이 비슷한 이미지가 출력됨

-> weight는 랜덤에서 시작하고 학습을 하면서 의미있는 weight로 변해간다.

 


 

특성맵 시각화

저번에 우리가 만든 모델의 구조

 

 

-> 첫번재 레이어의 활성화(activite)된 필터 출력해보기 (중간에서 뽑아보기)

 

참고: 모델 객체의 predict() 함수를 호출하면 입력부터 마지막 층까지 모든 계산을 수행한 후 최종 출력을 반환

(지금 최종 출력이 아닌 중간값을 보려고 하는 것임)

 


 

함수형 API

Dense층 2개로 이루어진 완전 연결 신경망을 함수형 API로 만드는 법

 

 

   hidden layer 하나만 있는 레이어 가정시

input layer 객체 만들고 input layer의 결과를 dense1에 넣는 것 같은 결과

dense1 layer의 결과를 dense2에 넣는 효과

  최종적으로 input 레이어의 객체와 output 레이어의 객체를 모델 변수에 넣어주면

input, dense, 출력 레이어가 있는 모델이 만들어짐 

-> 객체를 함수처럼 매개변수로 넘겨주기 -> 함수형 API

 

 

Conv_acti : 모델 객체의 입력과 첫번째 합성곱 층의 출력으로 구성된 새로운 모델

• Conv_acti의 predict() 함수는 첫 번째 합성곱층의 출력을 반환할 것임

- 즉, 첫번째 합성곱층의 특성맵 정보를 얻을 수 있는 것임

 


 

첫 번째 합성곱층의 특성 맵 시각화

 

 

-> train_input[0:1].reshape(-1, 28, 28, 1) / 255.0

: train_input의 0번째를 4차원으로 만들고 하나의 샘플 따내기

-> 첫번째 합성층을 거친 결과가 출력됨

-> 16개씩 출력 2줄로 출력해보면 신발에 대한 특성맵 출력됨

 

-> 곱하고 더했을 때 면을 만나는 애를 출력하거나 대각선을 만나는 애를 출력하거나

가로를 만나는 애를 출력하는 등 특성맵의 시각화와 합성곱 신경망의 시각화의 관계를 알 수 있음

-> 특징점을 만났을 때 시각화 됨

 


 

두 번째 합성곱층의 특성 맵 시각화

 

 

-> 64개를 출력해본 결과 (중요하지 않은 부분은 어두운 색)

-> Max Pooling을 한 결과라서 하나만 뽑아내고 나머진 버린 결과

-> 첫번째 합성곱층 레이어보다 직관적이지 않은 모습

 

 

 

데이터 증대 (data augmentation)

   이미지를 학습시킬 때 학습 데이터의 양이 적을 경우

학습 데이터를 조금씩 변형시켜 학습데이터의 양을 늘리는 방식 

   ImageDataGenerator 클래스를 사용하여 데이터 증대가 가능

 

  • Rotation range=60 : 60도로 회전
  • Width_shift=0.4 : 너비를 양쪽으로 shift
  • Height_shift=0.4 : 높이를 위아래로 shift
  • shear_range=60 : 비틀기
  • Zoom_range=0.4 : 확대
  • Brightness_range = [0.7, 1.3] : 밝기 변형

강아지와 고양이를 구분해보자 (데이터 증대 적용)

- Train 폴더: 학습용 이미지 (총 2000장- 고양이, 강아지 각각 1000장 씩)

- Test 폴더: 검증용 이미지 (총 200장 - 고양이, 강아지 각각 100장 씩)

 


 

데이터 준비

 ImageDataGenerator를 이용한 이미지 전처리 및 데이터 증대 설정

  • 0~255값을 0~1로 정규화 (rescale = 1./255)
  • Shear_range = 0.2
  • Zoom_range = 0.2
  • Horizontal_flip = True

 

 

참고: 테스트 데이터의 경우 0~1로 정규화만 수행 (데이터 증대 필요 X)

 


 

ImageDataGenerater와 디렉토리를 연결

• 앞에서 설정한 속성을 디렉토리 내 이미지 파일들에 적용

 

 

-> 마운트된 자신의 구글 드라이브 경로를 기입해야함

-> target_size, batch_size 조절

-> class_mode = 'binary' 이진 모드

 

-> 2개의 클래스로 이루어진 2000장, 200장의 이미지가 찾아졌다고 출력됨


 

모델 (CNN) 구성

 


 

학습

• ImageDataGenerator를 사용할 경우에는 학습은

fit()함수가 아닌 fit_generator() 함수를 사용해야함

 

 

 

-> steps_per_epoch : 한번의 에포크에서 훈련에 사용할 배치(batch)의 개수 

(전체 샘플 수 / batch_size 로 설정하는 것이 일반적임)

(batch_size는 "ImageDataGenerater 와 디렉토리를 연결” 과정에서 설정하였음 (batch_size=20))

-> validation_steps = 5 : 한번의 에포크가 끝날 때 검증에 사용되는 배치의 개수를 지정

 

 


 

결과확인

 

 


Transfer Learning (전이학습)

CNN, 신경망, 로지스틱 회귀 같은 기술 (이론적으로 모델링 되어 배포된 모델)은 아님

 

재사용 가능한 모델 - 기존에 있는 모델 사용

 

Fine-tuning

사전에 잘 정의된 모델 있다면

  1. 전체 모델 그대로 사용
  2. 일부 레이어만 사용하고 나머지만 학습
  3. 모든 레이어 가중치 동결 (출력층만 학습)


 

전략 #3 모든 레이어 가중치 동결 실습

Convolutional base (VGG16) 준비

 

 

-> include_top = False : 출력층은 가져오지 않음

-> input_shape : 입력 데이터의 크기


 

출력층 추가

 


 

Conv층 학습 동결

 

-> 전체를 conv_base.trainable = False


 

Compile 및 학습

 


 

전략 #2 일부 레이어 가중치 동결 실습

ResNet50을 사용해보자

 

 

 

출력층 추가

 

 


 

Conv층 학습 “일부” 동결

 

• 앞에서 20번째 레이어까지는 학습을 동결

• 20번째 레이어부터 마지막 레이어까지는 새롭게 학습

-> 일부만 conv_base.trainable = False

 

 

 


사진 출처 : 혼자 공부하는 머신러닝 + 딥러닝 강의자료