복습하기 위해 학부 수업 내용을 필기한 내용입니다.
이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다.
▶6.3 컨볼루션 신경망의 학습
컨볼루션 신경망은 커널을 학습한다.
6.3.1 손실 함수와 옵티마이저
손실 함수
- 다층 퍼셉트론과 컨볼루션 신경망은 중간층이 다르지만 입력과 출력은 동일하므로 같은 손실함수를 사용한다.
옵티마이저
- 다층 퍼셉트론은 엣지 가중치, 컨볼루션 신경망은 커널의 화소 값을 최적화한다는 점만 다르다.
- 학습 원리는 동일하므로 같은 옵티마이저를 사용한다.
6.3.2 통째 학습 (End-to-End)
고전적인 컴퓨터 비전은 수작업 특징을 사용한다.
- 사람의 직관으로 설계하기 때문에 어느 정도 성능 달성 가능
- 주어진 데이터에 최적이 아니기 때문에 자연 영상처럼 복잡한 데이터에서 낮은 성능
딥러닝은 특징을 학습
- 특징 추출에서 패러다임 변화: 특징 추출과 분류를 동시에 학습으로 알아낸다.
- 입력에서 출력까지 전 과정을 한꺼번에 학습하므로 통째 학습(end-to-end learning)이라 부른다.
아래 그림은 컨볼루션 신경망의 특징 학습을 설명한다.
- 앞부분(컨볼루션층과 풀링층)은 특징 추출, 뒤 부분(FC 층)은 분류를 담당한다.
6.3.3 딥 컨볼루션 신경망(DCNN)의 성능이 월등한 이유
네 가지 이유
- 통째 학습: 따로 최적화하여 붙이는 이전 방식보다 우수
- 특징 학습: 수작업 특징보다 우수
- 신경망 깊이를 깊게 하여 풍부한 특징을 추출: 수십~수백 층 사용
- 데이터의 원래 공간적 구조(spatial structure)를 유지한 채 특징 추출
- 해상도만 달라지지 공간적 구조는 동일하다.
▶6.4 컨볼루션 신경망 프로그래밍
여러 가지 실험
- 실험 데이터
- MNIST 필기 숫자
- Fashion MNIST
- 자연 영상 CIFAR-10
- 여러 종류의 층을 사용해 봄으로써 텐서플로의 유연성 확인
6.4.1 필기 숫자 인식
LeNet-5 재현
- C-P-C-P-C-FC-FC 구조 (conv, pooling, fully connected)
- 깊은 다층 퍼셉트론으로 MNIST 인식과 코드가 유사하다. (프로그램 5-9)
cnn = Sequential()
cnn.add(Conv2D(6, (5,5), padding='same', activation='relu', input_shape=(28,28,1))) # 28*28*1 -> 28*28*6
cnn.add(MaxPooling2D(pool_size=(2,2))) # -> 14*14*6
cnn.add(Conv2D(16, (5,5), padding='same', activation='relu')) # -> 14*14*16
cnn.add(MaxPooling2D(pool_size=(2,2))) # -> 7*7*16
cnn.add(Conv2D(120, (5,5), padding='same', activation='relu')) # -> 7*7*120
cnn.add(Flatten())
cnn.add(Dense(84, activation='relu'))
cnn.add(Dense(10, activation='softmax'))
cnn.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
컨볼루션 신경망의 유연한 구조
- keras.io 사이트가 제공하는 신경망 구조와 하이퍼 매개변수 사용
- C-C-P-dropout-FC-dropout-FC 구조(dropout은 규제 기법이므로 C-C-P-FC-FC 구조)
cnn = Sequential()
cnn.add(Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1))) # 28*28*1 -> 26*26*32
cnn.add(Conv2D(64, (3,3), activation='relu')) # -> 24*24*64
cnn.add(MaxPooling2D(pool_size=(2,2))) # -> 12*12*64
cnn.add(Dropout(0.25))
cnn.add(Flatten())
cnn.add(Dense(128, activation='relu'))
cnn.add(Dropout(0.5))
cnn.add(Dense(10, activation='softmax'))
cnn.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
6.4.2 텐서플로 프로그래밍
텐서플로 프로그래밍에서 중요한 네 가지 클래스
- models 클래스(여기서 설명)
- layers 클래스(여기서 설명)
- loss 클래스(5.7절에서 설명)
- optimizers 클래스(5.8절에서 설명)
models 클래스: Sequential과 functional API
- Sequential 함수
- 순차적으로 층을 쌓아 모델을 만드는 경우에 사용
- 대부분 신경망이 이 구조에 해당
- Sequential 함수로 cnn이라는 객체 생성 → add 함수로 층을 쌓아 신경망 설계
- functional API 함수
- 텐서가 흐르다가 중간에서 여러 개로 갈라지는 경우(출력이 여러 개일 수 있다.)
- 시계열이나 생성 모델에서 종종 발생한다.
layers 클래스: Dense(FC), Conv2D(C), MaxPooling2D(P), Flatten(늘린 것) 함수
- 입력 층을 쌓는 코드
cnn.add(Cov2D(32, (3, 3), activation='relu', input_shape=(28,28,1)))
- input_shape=(28,28,1) 매개변수는 신경망에 (28*28*1) 텐서가 입력된다는 사실 알려준다.
- (28*28) 대신 (28*28*1)을 사용하는 이유는 일반성 유지(RGB 영상의 경우 (28*28*3)으로 확장)
- 맨 앞 두 개 매개변수 32, (3,3)은 3*3 크기의 커널을 32개 사용하라는 뜻이다.
- k’=32이고 h=3인 셈이다.
- activation=‘relu’는 컨볼루션 결과에 ReLU 활성 함수를 적용하라는 뜻이다.
- Conv2D의 API
- 은닉층을 쌓는 코드
cnn.add(Conv2D(64, (3,3), activation='relu'))
cnn.add(MaxPooling2D(pool_size=(2,2)))
cnn.add(Dropout(0.25))
cnn.add(Flatten())
cnn.add(Dense(128, activation='relu'))
cnn.add(Dropout(0.5))
cnn.add(Dense(10, activation='softmax'))
- Flatten은 다차원 구조를 1차원 구조로 변환시킨다.
'컴퓨터공학 > 인공지능' 카테고리의 다른 글
[인공지능] 1, 2장. 인공지능 (1, 2장 볼만한 내용) (0) | 2023.04.16 |
---|---|
[인공지능] 6장. 컨볼루션 신경망과 컴퓨터 비전3 (0) | 2023.04.15 |
[인공지능] 6장. 컨볼루션 신경망과 컴퓨터 비전1 (1) | 2023.04.13 |
[인공지능] 5장. 딥러닝과 텐서플로3 (0) | 2023.04.12 |
[인공지능] 5장. 딥러닝과 텐서플로2 (0) | 2023.04.12 |