8장 합성곱 신경망 소개
- 간단한 컨브넷 만들기 질문?! 왜 input에 샘플데이터 갯수는 포함되지 않는가?? → batch_size에 따라 변해서 제외함
- input.layer에 []대괄호가 있는이유?? → 데이터 타입이 tensor이어서
- 합성곱 연산
- 필터 윈도우 커널 같은 말이다
- 컨브넷의 두 가지 성질
- 학습 패턴은 평행 이동 불변성을 가진다: 왼쪽 위에서 모서리를 발견한 패턴은 오른쪽 아래에서도 같은 패턴을 파악한다.
- 패턴의 공간적 계층 구조를 학습할 수 있다: 합성곱층을 거칠수록 더 큰 패턴을 학습시킴
- 합성곱 연산은 특성 맵에 적용된다.
- 특성 맵은 높이, 너미, 깊이(색깔 채널 RGB) 3가지 축을 기본으로 한다.
- 입력 텐서와 특성 맵의 합성곱을 통해 출력 특성 맵을 만든다.
- 출력 특성 맵의 최종 shape은 높이, 너비, 깊이(필터의 갯수)가 된다.
- 합성곱은 핵심적이 2개의 파라미터가 있다.
- 입력으로부터 뽑아낼 패치의 크기 33 혹은 55를 많이 쓴다.
- 특성 맵의 출력 깊이: 필터갯수. 32, 128 등 2의 제곱으로 많이 쓴다.
- 그 외에 슬라이딩, 합성곱 커널, 스트라이드, 패딩이라는 단어가 있다. (난 알지롱~)
- 참고로 p289의 그림은 잘못된 그림이다 넘어가자
- 최대풀링연산
- 커널 크기는 보통 22, 33을 사용하여 다운샘플링을 한다.
- 출력별로 최댓값(주로 이걸 사용)이나 평균값을 출력한다.
- 왜 특성 맵을 다운샘플링하는가? 그렇게 안하면 특성의 공간적 계측 구조를 학습하는데에 도움이 되지 않고 가중치 파라미터가 너무 많아져서 과대적합이 발생한다.
- 특성 맵, 합성곱, 최대 풀링에 대해 이해 끄읏
8.2 소규모 데이터셋에서 밑바닥부터 컨브넷 훈련하기
- 소규모 데이터셋 (5000개) 사용하여 성능 높히는 방법을 익힐 것임
1단계: 어떠한 규제 방법도 사용하지 않는 베이스라인: 정확도 70%
2단계: 과대적합을 막기 위한 데이터 증식: 정확도80~85%
3단계: 사전훈련된 네트워크로 특성 추출: 정확도 97.5%%
4단계: 사전 훈련된 네트워크를 세밀하기 튜닝: 정확도 98.5%
- 구글 캐글 데이터셋 내려받기: 그냥 순서대로 따라해보면됨
- p298shutil 패키지: "shell utility"의 줄임말로 파일 및 디렉토리 복사, 이동, 삭제 등의 작업을 수행하는 데 사용된다.
- keras.layers에 Rescaling도 존재한다
- 데이터 전처리: 그냥 하면 됨
- p302 Dataset 이해하기 ← 정말 이해하기 어려웠다
- 효율적인 입력 파이프라인을 만들기 위해 도와주는 API이다.
- Dataset 객체는 반복자이다. for루프에 사용할 수 있으며 일반적으로 입력데이터와 레이블의 배치를 반환한다. 이 객체를 바로 fit메서드에 전달할 수 있다. → for문의 in에 들어가는 종규들이 리스트, 딕셔너리, range 등등과 같이 있을 때 Dataset 객체도 가능하다.
- 비동기 데이터 프레패칭?? → 이전 배치를 모델이 처리하는 동안 다음 배치 데이터 전처리b
- 배치를 위해서 데이터를 효율적으로 사용할 수 있게 만들려고 사용한다 → 만약 1000개의 샘플 16개의 열을 가진 자료를 배치 32개마다 shape을 출력한다고 한다면 (32개의 행, 16개열)마다 shape이 출력되고 책의 코드에는 i ≥2면 멈추게 되어있어서 3번만 반복하여 출력함
- imape_dataset_form_directory가 Dataset 객체로 만들어진 것이며 그렇게 만들어진 train_dataset, validation_dataset, test_dataset은 Dataset객체들이다??
- 데이터증식
- RandomFlip(’horizontal’)
- RandomRotation(0.1)
- RandomZoo,(0.2)
- 등의 방식으로 데이터를 증식한다 → 하지만 이 방식은 여러 말들이 많다(별로 안좋다)
- 뜬금문제: 만약 train accuracy가 val accuracy보다 안좋게 나오면 지칭하는 상황은? 과소적합 만약 train, val 둘다 성능이 잘 안좋게 나오는 상황은? 과소적합
- 에폭수가 적어도 언더피팅이다
8.3 사전 훈련된 모델 활용하기
- 사전 훈련된 모델은 일반적으로 대규모 이미지 분류 문제를 위해 대량의 데이터셋에서 미리 훈련된 모델이다.
- imageNet 사용할 것임~
- 모델은 VGG16사용할 것임~ 왜? 구조가 간단하고 좋은 성능이어서~
- 이외에도 VGG, ResNet, Inception, Xception 등이 있다
- 사전 훈련된 모델 사용하는 두 가지 방식
- 특성 추출
- 미세 조정
- 머신러닝/딥러닝 차이: 특성 추출을 사람이 하는가 기계가 알아서 하는가~
- 특성 추출
- 학습된 모델의 훈련된 합성곱 기반 층만 그대로 사용하고 훈련된 분류기는 제외하여 새로운 분류기를 추가하여 사용할 것이다.
- 합성곱 층만 재사용하는 이유? 말이 많은데 한마디로 성능이 좋아서 이다.
conv_base = keras.applications.vgg16.VGG16(
weights = "imagenet",
include-top = False,
input_shape = (180, 180, 3))
- 이 시점에서 또다시 두가지로 나뉜다.
- 데이터 증식 사용없이 진행하기
- 빠르고 비용이 적게 든다. 그냥 평범하게 사용하면 된다~
- 데이터 증식 사용하여 진행하기
- 준비한 모델 위에 Dense층을 쌓아 확장한다. 엔드-추-엔드 전체 모델을 실행, 비용 많이듦
- 합성곱 기반 층들을 동결해야함 → 훈련하는 동안 가중치가 업데이트 되지 않게 막아야한다
- 그 다음 단계는
- 데이터 증식 단계
- 동결된 합성곱 기반 층
- 밀집 분류기
- 미세 조정하기
- 단계
- 사전에 훈련된 기반 네트워크 위에 새로운 네트워크 추가
- 가반 네트워크를 동결
- 새로 추가한 네트워크 훈련
- 기반 네트워크에서 일부 층의 동결 해제
- 동결을 해제한 층과 새로 축가한 층을 함께 훈련
- 더 많은 층을 미세 조정하지 않는 이유?
- 하위 층은 일반적이고 재사용 가능한 특성들을 인코딩하고 상위 층은 좀 더 특화된 특성을 인코딩한다. 따라서 상위층을 미세 조정하는 것이 유리하다
- 훈련해야할 파라미터가 많을수록 과대적합의 위험이 커진다.
- 마무리하며…ImageNet이랑 VGG16의 관계는?? → VGG16은 ImageNet 데이터셋에서 사전 훈련된 심층 합성곱 신경망(Convolutional Neural Network, CNN) 아키텍처이다.
문제)
문제 1. 캐글 페이지에서 데이터셋을 받을 수 있는 코드를 실제로 찾아봅시다.
문제 2. 각각의 조건에 따라 어떻게 행동하면 좋을 지 아래 표를 채우시오
(사전학습된 데이터와 상이 / 사전학습된 데이터와 유사)
(보유 데이터 양 많음 / 보유 데이터 양 적음)
문제 3. 교재에서 추천한 fine-tuning 순서에 대해서 서술해봅시다
추가문제)
문제 1. 케창딥 8장의 코드를 다운로드 받아 주석을 완성해주세요.
문제 2. mnist 데이터를 가져와 Dataset 객체를 만들어보자.
문제 3. ResNet을 불러와 Dropout 계층을 중간에 집어넣고 classifier 부분을 10개 클래스를 분류하는 모델로 변경해볼것
문제1:
# kaggle.json 파일을 업로드하세요.
from google.colab import files
files.upload()
# kaggle 데이터셋 다운로드
!kaggle competitions download -c dogs-vs-cats
# 압축풀기
!unzip -qq dogs-vs-cats.zip
!unzip -qq train.zip
문제2:
1 2
3 4 로 가정하였을 때
1: 데이터 증식 없이 특성추출 살짝, 블럭 몇개씩만 추가적으로 fine-tuning
2: 데이터 증식 없이 미세조정(high 레벨 새로운 분류기만)
3: 데이터 증식 사용하여 특성추출 + 미세조정???
4: 데이터 증식 사용하여 특성추출(새로운 분류기만)
→ 데이터가 사전학습된 모델과 상이할 경우: 특성추출, 유사할 경우: 미세조정
→ 기준을 모르겠다….아 헷갈려
용어 정립이 안되니까 더 헷갈리는듯….정리하자면
1: 안써도 되는데 변화를 많이줌
2: 안써도 되는데 변화를 적게 줌 (마지막 Dense layer만 살짝 변경)
3: 데이터 증식 사용해서 변화 많이 줌 →fine tuning을 많이~
4: 데이터 증식 사용해서 훈련된 블럭층 몇개 + 마지막 Dense layer 살짝 변경 → 특성추출
문제3: fine-tunging 순서(미세 조정)
- 사전에 훈련된 기반 네트워크 위에 새로운 네트워크 추가
- 가반 네트워크를 동결
- 새로 추가한 네트워크 훈련
- 기반 네트워크에서 일부 층의 동결 해제
- 동결을 해제한 층과 새로 축가한 층을 함께 훈련
추가문제1:
추가문제2: 이거 참고하면…되지 않을까?!
- from_tensor_slices() 함수를 사용하여 생성된 데이터셋은 TensorFlow의 다양한 변환 함수와 함께 사용할 수 있습니다. 예를 들어, map(), filter(), batch(), shuffle() 등의 함수를 사용하여 데이터셋을 전처리하거나 변환할 수 있습니다.
from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
BATCH_SIZE = 64
BUFFER_SIZE = 20000
dataset = dataset.from_tensor_slices(train_imges)
dataset = dataset.cache()
dataset = dataset.map(lambda x: tf.reshape(train, (60000, 28, 28, 1)))
dataset = dataset.shuffle(BUFFER_SIZE)
dataset = dataset.batch(BATCH_SIZE)
dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)
print("슝=3")
추가문제3: (생략)
8장 후기: 이미 많이 공부한 CNN 관련 내용이어서 크게 어렵지는 않았다 후딱 지나간 느낌 근데 좀 헷갈리는 것들이 후반에 좀 있었다