합성곱 신경망의 시각화
가중치 시각화 (필터 시각화)
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
사전에 잘 정의된 모델 있다면
- 전체 모델 그대로 사용
- 일부 레이어만 사용하고 나머지만 학습
- 모든 레이어 가중치 동결 (출력층만 학습)
전략 #3 모든 레이어 가중치 동결 실습
Convolutional base (VGG16) 준비
-> include_top = False : 출력층은 가져오지 않음
-> input_shape : 입력 데이터의 크기
출력층 추가
Conv층 학습 동결
-> 전체를 conv_base.trainable = False
Compile 및 학습
전략 #2 일부 레이어 가중치 동결 실습
ResNet50을 사용해보자
출력층 추가
Conv층 학습 “일부” 동결
• 앞에서 20번째 레이어까지는 학습을 동결
• 20번째 레이어부터 마지막 레이어까지는 새롭게 학습
-> 일부만 conv_base.trainable = False
사진 출처 : 혼자 공부하는 머신러닝 + 딥러닝 강의자료
'파이썬 & 머신러닝과 딥러닝' 카테고리의 다른 글
파이썬 문법 보충, 데이터 분석 라이브러리 (1) | 2024.06.28 |
---|---|
20일차 - 순환신경망의 개념, RNN 드롭아웃, LSTM, 영화리뷰 분류, 로이터 기사 분류 (2) | 2024.02.07 |
18일차 - 합성곱 신경망의 개념, 2차원 합성곱, 3차원 합성곱, 합성곱 신경망 시각화 (0) | 2024.02.05 |
17일차 - 크로스엔트로피, 다층 신경망 그래디언트 소멸, 하이퍼파라미터 최적화, 손실 곡선, 검증 손실, 드롭아웃, 모델 저장과 복원 (0) | 2024.02.02 |
16일차 - 딥러닝의 역사, 퍼셉트론, 다층 퍼셉트론, 역전파 알고리즘 상세, 활성화 함수 및 원리 (0) | 2024.02.01 |