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

AlexNet을 간단히 정의하면 아래와 같다.
AlexNet은 2012년에 개최된 ILSVRC(ImageNet Large Scale Visual Recognition Challenge) 대회의 우승을 차지한 컨볼루션 신경망(CNN) 구조이다.

이 구조는 위의 사진과 같은데 상세한 특징 아래와 같다.
입력 영상은 컬러이므로 입력 데이터의 깊이는 3이고 크기는 227x227이다. AlexNet은 8개의 레이어(5개의 Convolution Layer, 3개의 완전 연결 Layer)로 구성되어 있다.
첫 번째 레이어 Conv1
27x27x96 크기의 특징맵두 번째 레이어 Conv2
13x13x256 크기의 특징맵세 번째 레이어 Conv3
13x13x384 크기의 특징맵네 번째 레이어 Conv4
13x13x384 크기의 특징맵다섯 번째 레이어 Conv5
6x6x256 크기의 특징맵여섯 번째 레이어 FC1
9216차원의 1차원 벡터 생성일곱 번째 레이어 FC2
여덟 번째 레이어 FC3
tf.keras.layers.Conv2D(filters, kernel_size, strides=(1,1), activation=None, input_shape, padding='vaild'
예시 코드
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으로 줄어든 것을 확인할 수 있다.
tf.keras.layers.MaxPooling2D(pool_size=(2,2), strides=None, padding='valid')
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