: Convolutional Neural Network, CNN
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
: 합성곱층에서 받은 최종 출력 데이터( Activation Map )의 크기를 줄이거나 특정 데이터를 강조한다.
➡️ 데이터의 사이즈를 줄여주며 노이즈를 상쇄시키고, 미세한 부분에서 일관적인 특징을 제공한다.
<Pooling Layers 처리하는 방법>
➡️ 보통은 합성곱 과정에서 만들어진 특징들의 가장 큰 값들만 가져와서 사이즈 감소 (Max Pooling)
-> 이미지 크기를 줄여 계산을 효율적으로 하고 데이터를 압축하는 효과가 있기 때문에 오버피팅을 방지해주기도 함.
-> 이미지를 추상화 해주기 때문에 너무 자세히 학습하지 않도록 해서 오버피팅을 방지
-> 대체적으로 컬러이미지에는 Max Pooling, 흑백이미지에는 Min Pooling 사용
✅ Convolution 연산을 하면 filter, kernel_size 에 해당하는 filter의 개수만큼 통과시켜서 feature map을 생성한다.
➡️ CNN(= 피처자동추출기) : 비정형 이미지를 입력했을 때 이미지를 전처리하지 않고 그대로 넣어주면 알아서 feature map 생성한다.
➡️ Feature map : feature가 어떤 특징을 갖고 있는지 나타남. 선이 있는지, 0, 1 다양한 모양을 랜덤하게 생성해서 통과시키면 해당 특징이 있는지 학습하게 하는건 convolution 연산
✅ Activation Function(활성화함수)를 통과시킨 output을 activation map을 생성한다
➡️ relu 함수를 사용하게 되면 출력값에 활성화 함수를 적용한 Activation map 반환
✅ TF API
model.add(layers.Conv2D(filters=64, kernel_size=(3, 3),
activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
✅ Padding, Striding 등을 사용해서 입력과 출력사이즈를 조정, Stride는 필터의 이동 보폭을 조정한다.
➡️ DNN의 단점을 보완한 CNN의 특징
Conv, Pooling 연산을 하게 되면 데이터의 공간적인 특징을 학습하여 어떤 패턴이 있는지 알게 됨
Pooling을 통해 데이터를 압축하면 데이터의 용량이 줄어들며, 추상화를 하기 때문에 너무 자세히 학습하지 않게 됨. 오버피팅 방지한다.
DNN ↔️ CNN ( 가장 큰 차이 )
: 1차원 flatten 해서 넣어주는 게 아니라 Conv, Pooling 연산을 통해 특징을 학습하고 압축한 결과를 flatten 해서 DNN에 넣어준다.