복습 - CNN 구조(3차원 구조)
* 이미지를 다루므로 기본적으로 3차원 데이터(너비, 높이, 깊이)를 다룸
AlexNet
구성 : 합성곱층 5개 + 완전연결층 3개 //맨 마지막 완전연결층 : 카테고리 1,000개로 분류(소프트맥스 활성화 함수 사용)
특징 : GPU 2개를 기반으로 한 병렬 구조(⇒ 연산 속도가 빨라짐)
AlexNet의 합성곱층에서 사용된 활성화 함수 : 렐루
각 계층의 구조적 세부 사항
- 입력 : 227×227×3 크기의 RGB 이미지
- 출력 : 각 클래스(혹은 카테고리)에 해당하는 1000×1 확률 벡터
계층 유형 | 특성 맵 | 크기 | 커널 크기 | 스트라이드 | 활성화 함수 |
이미지 | 1 | 227×227 | – | – | – |
합성곱층 | 96 | 55×55 | 11×11 | 4 | 렐루(ReLU) |
최대 풀링층 | 96 | 27×27 | 3×3 | 2 | – |
합성곱층 | 256 | 27×27 | 5×5 | 1 | 렐루(ReLU) |
최대 풀링층 | 256 | 13×13 | 3×3 | 2 | – |
합성곱층 | 384 | 13×13 | 3×3 | 1 | 렐루(ReLU) |
합성곱층 | 384 | 13×13 | 3×3 | 1 | 렐루(ReLU) |
합성곱층 | 256 | 13×13 | 3×3 | 1 | 렐루(ReLU) |
최대 풀링층 | 256 | 6×6 | 3×3 | 2 | – |
완전연결층 | – | 4096 | – | – | 렐루(ReLU) |
완전연결층 | – | 4096 | – | – | 렐루(ReLU) |
완전연결층 | – | 1000 | – | – | 소프트맥스(Softmax) |
* 합성곱층 크기₂ : (크기₁ - 필터 크기 + 2패딩) / 스트라이드 + 1
- 첫 번째 합성곱층
- 커널 크기 : 11×11×3
- 스트라이드 : 4
- 특성맵 : 96개 생성
⇒ 출력 : 55×55×96
✔ 첫 번째 계층을 거치며,
- GPU-1 : 주로 컬러와 상관없는 정보를 추출하기 위한 커널이 학습됨
- GPU-2 : 주로 컬러와 관련된 정보를 추출하기 위한 커널이 학습됨
각 GPU의 결과
예제 - AlexNet 모델 생성
원래 AlexNet의 마지막 계층에는 뉴런이 1000개 있지만 예제에서는 클래스 두 개만 사용
합성곱 신경망을 구축하는 데 Model Subclassing API를 사용
1. 모델 생성
- 데이터셋은 개와 고양이
num_classes = 2
class AlexNet(Sequential):
def __init__(self, input_shape, num_classes):
super().__init__()
self.add(Conv2D(96, kernel_size=(11, 11), strides=4, padding='valid', activation='relu',
input_shape=input_shape, kernel_initializer='he_normal'))
self.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid', data_format='channels_last'))
...
self.add(Flatten())
self.add(Dense(4096, activation='relu'))
self.add(Dense(4096, activation='relu'))
self.add(Dense(1000, activation='relu'))
self.add(Dense(num_classes, activation='softmax'))
self.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
① kernel_initializer; 가중치 초기화
가중치 초기화 방법
· 확률 분포 기반의 가중치 초기화
: 특정한 확률 분포에 기반해 랜덤한(임의의) 값을 추출하여 가중치를 초기화
- 균일 분포 : 최솟값과 최댓값 사이의 값들이 동일한 확률로 추출됨
(-0.05에서 0.05 사이의 값을 동일한 확률로 추출하도록 설정되어 있음)
- 정규 분포 : 종 모양의 분포, 평균에 가까운 값일 수록 더 높은 확률로 추출됨
(평균이 0, 표준편차가 0.05인 정규 분포에서 값을 추출하도록 설정되어 있음)
· 분산 조정 기반의 가중치 초기화
: 확률 분포 기반으로 추출한 값으로 가중치를 초기화하되, 이 확률 분포의 분산을 가중치별로 동적으로 조절
✔ 분산 조절엔 해당 가중치에 'fan in'과 'fan out'이 사용됨
📝Note. fan in과 fan out
· fan in : 해당 계층에 들어오는 입력 텐서의 차원 크기
· fan out : 해당 계층이 출력하는 출력 텐서의 차원 크기
예) 1000×200 크기의 완전 연결층 - fan in : 1000, fan out : 200
* 텐서 : 3차원 이상의 배열 형태
- LeCun 초기화 방식
- 입력값의 크기가 커질수록 초기화 값의 분산을 작게 만듦(⇒ 결과 : 0에 가까운 값이 추출됨)
- 종류 lecun_uniform, lecun_normal
- Xavier 초기화 방식 :
- fan in과 fan out을 모두 고려하여 확률 분포를 계산
eCun 방식에서 2를 곱한 후 fan in과 fan out을 합한 크기로 나누어 준 값으로 확률 분포를 조정
- 종류 : glorot_uniform, glorot_normal
- 활성화 함수로 하이퍼볼릭 탄젠트를 사용하는 신경망에서 많이 사용됨(렐루에선 잘 작동X)
- He 초기화 방식
- Xavier 방식의 한계를 극복위해 제안된 기법. Xavier방식에서 fan out을 제거함
(== fan out보다 fan in에 집중한 가중치)
- 종류 : he_uniform, he_normal
- ResNet을 학습시킬때 해당 기법을 사용하면 CNN의 깊은 신경망을 잘 학습시킬 수 있음
② data_format; 입력에 대한 형식을 지정
입력 형식 설정 파라미터 종류
- channels_last : 입력 데이터 텐서의 형식이 (배치 크기, 높이, 너비, 채널 개수)가 됨
- channels_first : 입력 데이터 텐서의 형식이 (배치 크기, 채널 개수, 높이, 너비)가 됨
2. 데이터 호출 및 데이터셋 전처리(증가)
- AlexNet은 파라미터를 6000만 개 사용
- 충분한 데이터가 없으면 과적합이 발생
✔ 예제는 충분한 규모의 데이터가 아님 → 작은 데이터셋을 사용하여 강력한 성능을 낼 수 있는 전처리가 필요(ImageDataGenerator를 사용)
3. 텐서보드 설정 및 모델 훈련
텐서보드 - 모델 훈련 결과 시각화
· AlexNet 정확도
· AlexNet 오차
→ 성능이 좋지 않음
4. 분류에 대한 예측 & 예측 결과 시각화
예측 결과가 좋지 못함 → 파라미터에 대한 튜닝 必
성능 높이는 방법 : 더 많은 이미지 데이터를 사용, 파라미터 조정
'Etc > Deep Learning' 카테고리의 다른 글
6장 합성곱 신경망(4) - 객체 인식을 위한 신경망(R-CNN, 공간 피라미드 풀링, Fast R-CNN, Faster R-CNN) (0) | 2021.08.12 |
---|---|
6장 합성곱 신경망Ⅱ(3) - 이미지 분류를 위한 신경망(VGGNet, GoogLeNet, ResNet) (0) | 2021.08.11 |
6장 합성곱 신경망Ⅱ(1) - 이미지 분류를 위한 신경망(LeNet-5) + 실습 : 🔜파이썬 개념 추가 정리하기 (0) | 2021.08.09 |
5장 합성곱 신경망Ⅰ(4) - 그래프 합성곱 네트워크 (0) | 2021.08.09 |
5장 합성곱 신경망Ⅰ(+) - 이미지를 255로 나누는 이유(ELLIPSIS 객체, np.newaxis, 다차원 배열 슬라이싱, 255) (0) | 2021.08.08 |