컴퓨터공학/인공지능

[인공지능] 6장. 컨볼루션 신경망과 컴퓨터 비전2

NIMHO 2023. 4. 13. 16:13
728x90

복습하기 위해 학부 수업 내용을 필기한 내용입니다.
이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다.

6.3 컨볼루션 신경망의 학습

컨볼루션 신경망은 커널을 학습한다.

 

6.3.1 손실 함수와 옵티마이저

손실 함수

- 다층 퍼셉트론과 컨볼루션 신경망은 중간층이 다르지만 입력과 출력은 동일하므로 같은 손실함수를 사용한다.

 

옵티마이저

- 다층 퍼셉트론은 엣지 가중치, 컨볼루션 신경망은 커널의 화소 값을 최적화한다는 점만 다르다.

- 학습 원리는 동일하므로 같은 옵티마이저를 사용한다.

 

6.3.2 통째 학습 (End-to-End)

고전적인 컴퓨터 비전은 수작업 특징을 사용한다.

- 사람의 직관으로 설계하기 때문에 어느 정도 성능 달성 가능

- 주어진 데이터에 최적이 아니기 때문에 자연 영상처럼 복잡한 데이터에서 낮은 성능

 

딥러닝은 특징을 학습

- 특징 추출에서 패러다임 변화: 특징 추출과 분류를 동시에 학습으로 알아낸다.

- 입력에서 출력까지 전 과정을 한꺼번에 학습하므로 통째 학습(end-to-end learning)이라 부른다.

 

아래 그림은 컨볼루션 신경망의 특징 학습을 설명한다.

- 앞부분(컨볼루션층과 풀링층)은 특징 추출, 뒤 부분(FC 층)은 분류를 담당한다.

 

6.3.3 딥 컨볼루션 신경망(DCNN)의 성능이 월등한 이유

네 가지 이유

- 통째 학습: 따로 최적화하여 붙이는 이전 방식보다 우수

- 특징 학습: 수작업 특징보다 우수

- 신경망 깊이를 깊게 하여 풍부한 특징을 추출: 수십~수백 층 사용

- 데이터의 원래 공간적 구조(spatial structure)를 유지한 채 특징 추출

     - 해상도만 달라지지 공간적 구조는 동일하다.

728x90

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차원 구조로 변환시킨다.

728x90