[딥러닝 Express] Chapter 09. 컨벌루션 신경망 - (2)

배규리·2024년 1월 28일

AI 기초

목록 보기
24/32
post-thumbnail

이제 CNN의 구조에 대해 상세하게 살펴볼 것이다.

4. 컨벌루션 신경망을 해석해보자.

컬러 영상을 처리하는 CNN의 레이어를 분석해보자.
아래에서는 32개의 Filter를 사용하고 있다.
커널을 통해 나온 값은 활성화 함수 ReLU를 통과하게 되고, 다시 이 값은 Max-Pooling Layer을 통해 출력된다. 이전에 배웠 듯이 Filter의 개수인 32만큼의 Feature Map이 생성된다.

AlexNet 신경망 해석

AlexNet을 간단히 정의하면 아래와 같다.

AlexNet은 2012년에 개최된 ILSVRC(ImageNet Large Scale Visual Recognition Challenge) 대회의 우승을 차지한 컨볼루션 신경망(CNN) 구조이다.


이 구조는 위의 사진과 같은데 상세한 특징 아래와 같다.

  • 입력 영상은 컬러이므로 입력 데이터의 깊이는 3이고 크기는 227x227이다. AlexNet은 8개의 레이어(5개의 Convolution Layer, 3개의 완전 연결 Layer)로 구성되어 있다.

  • 첫 번째 레이어 Conv1

    • 11x11x3 필터 96개
    • 보폭 4
    • 패딩 X
    • ReLU 활성화 함수
    • 보폭 2로 3x3 Map Pooling
      -> 27x27x96 크기의 특징맵
  • 두 번째 레이어 Conv2

    • 5x5x48 필터 256개 (128개를 2번씩 사용)
    • 보폭 1
    • zero-padding 2
    • ReLu 활성화 함수
    • 보폭 2로 3x3 Overlapping Max Pooling
      -> 13x13x256 크기의 특징맵
  • 세 번째 레이어 Conv3

    • 3x3x256 필터 384개 (192개를 2번씩 사용)
    • 보폭 1
    • zero-padding 1
    • ReLU 활성화 함수
    • 보폭 2로 3x3 Overlapping Max Pooling
      -> 13x13x384 크기의 특징맵
  • 네 번째 레이어 Conv4

    • 3x3x256 필터 384개 (192개를 2번씩 사용)
    • 보폭 1
    • zero-padding 1
    • ReLU 활성화 함수
      -> 13x13x384 크기의 특징맵
  • 다섯 번째 레이어 Conv5

    • 3x3x256 필터 384개 (192개를 2번씩 사용)
    • 보폭 1
    • zero-padding 1
    • ReLU 활성화 함수
    • 보폭 2로 3x3 Overlapping Max Pooling
      -> 6x6x256 크기의 특징맵
  • 여섯 번째 레이어 FC1

    • 완전 연결 레이어
    • 다섯 번째 레이어의 6x6x256 특징맵을 1차원으로 만든다.
    • 6x6x256 = 9216차원의 1차원 벡터 생성
    • 4096개의 뉴런과 Full Connected(각 GPU 채널당 2048개)
    • ReLU 함수로 활성화
  • 일곱 번째 레이어 FC2

    • 완전 연결 레이어
    • 4096개의 유닛과 Full Connected
    • ReLU 함수로 활성화
  • 여덟 번째 레이어 FC3

    • 완전 연결 레이어
    • 1000개의 뉴런과 Full Connected
    • Softmax 함수로 1000개의 클래스에 대한 확률 도출

5. 케라스로 컨벌루션 신경망 구현하기

Convolution Layer(컨벌루션 레이어)

tf.keras.layers.Conv2D(filters, kernel_size, strides=(1,1), activation=None, input_shape, padding='vaild'

  • filters: 필터의 개수
  • kernel_size: 필터의 크기
  • strides: 보폭
  • activation: 활성화 함수
  • input_shape: 입력 배열의 형상
  • padding: 패딩 방법

예시 코드

import tensorflow as tf

shape = (4, 28, 28, 3) # (배치 크기, 입력 이미지 x, 입력 이미지 y, 채널 수)

x = tf.random.normal(shape)
y = tf.keras.layers.Conv2D(2, 3, activation = 'relu', input_shape = shape[1:])(x)
print(y.shape)


3x3 크기의 필터 2개로 보폭은 디폴트값인 1씩 이동하여 나온 결과이다.
padding값이 디폴트값인 valid로 설정되어 추가적으로 넣어주지 않아서 출력값의 크기가 28x28에서 26x26으로 줄어든 것을 확인할 수 있다.

Pooling Layer(풀링 레이어)

tf.keras.layers.MaxPooling2D(pool_size=(2,2), strides=None, padding='valid')

  • pool_size: 풀링 윈도우의 크기
  • strides: 보폭
  • padding: 패딩 방법
import tensorflow as tf
x = tf.constant([
    [1., 2., 3.],
    [4., 5., 6.],
    [7., 8., 9.]])
x = tf.reshape(x, [1,3,3,1])
max_pool_2d = tf.keras.layers.MaxPooling2D(pool_size =(2,2), strides = (1, 1), padding='valid')
print(max_pool_2d(x))


3x3x1형태의 입력을 2x2 윈도우로 이동하며 max-pooling한 결과가 제대로 도출된 것을 확인할 수 있다.


Pooling과 Convolution 과정을 거치면서 줄어드는 레이어의 크기값을 도출하는 과정이 꽤나 헷갈린다...
혼자 습득한거라서 확실하진 않지만, Convolution 과정에서는
(기존의 레이어의 크기) = (필터의 크기 - stride값) + stride 값 * x
여기서의 x값이 다음 레이어의 한 변의 길이가 되는 것같다.
누군가한텐 당연한 것일 수 있지만ㅎ,,ㅎ
나름 머리쓴~ 결과물~🥹

그럼 실습을 통해서 더 제대로 살펴보자!

참고 자료
https://velog.io/@lighthouse97/AlexNet%EC%9D%98-%EC%9D%B4%ED%95%B4

profile
백엔드 개발은 취미인 AI 개발자🥹

0개의 댓글