딥러닝 CNN 알고리즘이란?
CNN의 컨셉은?
인간의 시각처리 과정에서 영감을 받아 설계되었고, 패턴인식에 뛰어난 성능을 보인다.
원리를 고양이 분류로 들어보자면,
- 고양이의 특정 부분을 잘 캐치해 내는 필터 제작
- 귀 부분을 찾으면 숫자가 커지고, 귀가 없으면 숫자가 0에 가까워짐.
- 이동
- 왼쪽 위 끝에서부터 오른쪽으로 몇 칸씩 이동하며 '귀'를 탐색.
- 오른쪽 끝까지 이동한 후 왼쪽으로 돌아가 아래로 몇 칸 이동하여 다시 오른쪽으로 이동하는 과정을 반복.
CNN 컨셉 - 모델 학습
- CNN 학습의 목적
- 고양이를 잘 인식할 수 있는 여러 개의 필터를 만드는 것.
- 귀, 눈 등 우리가 이해하는 고유한 특징을 정확히 학습하는 것이 아닌, 고양이를 탐지하는 데 필요한 최적의 특징을 학습함.
- 학습된 필터는 특정 특징을 추출하는 역할을 하며, 이는 자동으로 학습됨.
- 필터의 정의
- 필터는 특징 추출기 역할을 함.
예측 단계
- 학습된 필터를 사용해 새로운 이미지에서 특징을 추출하고, 해당 이미지가 고양이인지 아닌지를 판단.
의 과정이다~
무작정 코드 보기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import random as rd
from sklearn.model_selection import train_test_split
from sklearn.metrics import *
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Input
from keras.backend import clear_session
from keras.optimizers import Adam
from keras.datasets import mnist, fashion_mnist
# 학습곡선 함수
def dl_history_plot(history):
plt.figure(figsize=(10,6))
plt.plot(history['loss'], label='train_err')
plt.plot(history['val_loss'], label='val_err')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend()
plt.grid()
plt.show()
# 케라스 데이터셋으로 부터 fashion_mnist 불러오기
(x_train, y_train), (x_val, y_val) = fashion_mnist.load_data()
x_train.shape, y_train.shape
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
# 데이터 살펴보기
# 아래 숫자를 바꿔가며 화면에 그려 봅시다.
n = 1
plt.figure()
plt.imshow(x_train[n], cmap=plt.cm.binary)
plt.colorbar()
plt.show()
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.imshow(x_train[i], cmap=plt.cm.binary)
plt.xlabel(class_names[y_train[i]])
plt.tight_layout()
plt.show()
#데이터 준비
#CNN은 3차원 구조의 이미지(데이터셋은 4차원)를 입력해야 합니다.(input_shape)
#형태 변환
x_train = x_train.reshape(60000,28,28,1)
x_val = x_val.reshape(10000,28,28,1)
#scaling
x_train = x_train / 255.
x_test = x_val / 255.
0-255 값으로 되어있는 데이터를 0-1 사이 값으로 변환
그냥 나누면 된다
모델링코드는
clear_session()
model = Sequential([Input(shape = (28, 28, 1)),
Conv2D(32, kernel_size=3, input_shape=(28,28,1), padding='same', activation ='relu'), # strides = 1 기본값
MaxPooling2D(pool_size = 2), # strides = pool_size 기본값
Conv2D(64, kernel_size = 3, padding='same', activation = 'relu'),
MaxPooling2D(pool_size = 2),
Flatten(),
Dense(128, activation = 'relu'),
Dense(10, activation = 'softmax')
])
model.summary()
model.compile(optimizer=Adam(learning_rate=0.0001), loss='sparse_categorical_crossentropy')
history = model.fit(x_train, y_train, epochs = 10,
validation_split=0.2).history
#위에 작성해둔 함수로 그래프로 학습결과 확인하기
dl_history_plot(history)
구조
CNN은 이미지나 데이터를 입력받아 이를 처리하는 여러 층으로 구성된 신경망입니다. 다음은 주요 구조 요소입니다:
- Input Shape (입력 형태):
- 입력 데이터의 크기입니다. 예를 들어, 28 x 28 x 1은 28x28 크기의 흑백 이미지(채널=1)를 의미합니다.
- 컬러 이미지는 보통 채널=3으로, RGB 색상을 포함합니다.
- Convolutional Layer (합성곱 층):
- 필터(커널)를 사용하여 이미지의 특정 패턴을 탐색합니다.
- padding=same은 출력 크기를 입력과 동일하게 유지하기 위해 테두리에 0을 채웁니다.
- kernel=3x3은 3x3 크기의 필터를 의미하며, stride=1은 필터가 한 번에 한 칸씩 이동한다는 뜻입니다.
- 합성곱 연산 후에는 활성화 함수(예: ReLU)가 적용됩니다.
- Max Pooling Layer (최대 풀링 층):
- 합성곱 층에서 뽑아낸 특징을 요약하고 출력 크기를 줄입니다.
- 예: Pooling=2x2, Stride=2는 2x2 영역 내에서 최대값을 선택하고 두 칸씩 이동하여 특징을 추출합니다.
- 이 과정을 통해 모델의 계산량을 줄이고 불필요한 정보를 제거합니다.
- Flatten Layer (평탄화 층):
- 다차원 배열(예: 7x7x64)을 1차원 벡터로 변환하여 완전 연결층(Dense Layer)로 전달합니다.
- 예: 3136 x 128은 3136개의 입력이 128개의 노드로 연결됨을 의미합니다.
- Dense Layer (완전 연결 층):
- 입력된 벡터를 받아 분류나 회귀 작업을 수행합니다.
- Dense Node=128 + ReLU는 128개의 노드를 가진 층이며 활성화 함수는 ReLU를 사용합니다.
- 마지막 Dense Node=10 + softmax는 10개의 노드로 출력하며, Softmax 함수로 각 클래스에 대한 확률을 계산해 다중 클래스 분류를 합니다.
핵심 포인트
- Input Shape은 입력 데이터의 크기.
- Convolutional Layer는 필터로 패턴을 찾아 특징 맵을 생성.
- Max Pooling Layer는 특징을 압축하고 계산 효율을 높임.
- Flatten은 데이터를 일차원 벡터로 변환해 Dense Layer로 전달.
- Dense Layer는 최종 출력과 분류를 담당.
정규화 기법 적용
- Dropout: 학습 중 일부 노드를 랜덤하게 제거하여 과적합을 방지합니다.
- Batch Normalization: 각 층의 출력값을 정규화하여 학습을 안정화하고 속도를 높입니다.
하이퍼파라미터 튜닝(Hyperparameter Tuning)
- 학습률(Learning Rate), 배치 크기(Batch Size), 필터 크기, 층의 수 등을 최적화합니다.
- Grid Search나 Random Search 방법을 통해 최적의 하이퍼파라미터를 탐색할 수 있습니다.
- 최신 기법으로는 Bayesian Optimization이나 Hyperband를 사용한 자동 하이퍼파라미터 최적화가 있습니다.
이런 방법 등으로 성능을 높일수있다