카테고리 없음

딥러닝 CNN

yumin630 2024. 11. 4. 23:32

 

딥러닝 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은 이미지나 데이터를 입력받아 이를 처리하는 여러 층으로 구성된 신경망입니다. 다음은 주요 구조 요소입니다:

  1. Input Shape (입력 형태):
    • 입력 데이터의 크기입니다. 예를 들어, 28 x 28 x 1은 28x28 크기의 흑백 이미지(채널=1)를 의미합니다.
    • 컬러 이미지는 보통 채널=3으로, RGB 색상을 포함합니다.
  2. Convolutional Layer (합성곱 층):
    • 필터(커널)를 사용하여 이미지의 특정 패턴을 탐색합니다.
    • padding=same은 출력 크기를 입력과 동일하게 유지하기 위해 테두리에 0을 채웁니다.
    • kernel=3x3은 3x3 크기의 필터를 의미하며, stride=1은 필터가 한 번에 한 칸씩 이동한다는 뜻입니다.
    • 합성곱 연산 후에는 활성화 함수(예: ReLU)가 적용됩니다.
  3. Max Pooling Layer (최대 풀링 층):
    • 합성곱 층에서 뽑아낸 특징을 요약하고 출력 크기를 줄입니다.
    • 예: Pooling=2x2, Stride=2는 2x2 영역 내에서 최대값을 선택하고 두 칸씩 이동하여 특징을 추출합니다.
    • 이 과정을 통해 모델의 계산량을 줄이고 불필요한 정보를 제거합니다.
  4. Flatten Layer (평탄화 층):
    • 다차원 배열(예: 7x7x64)을 1차원 벡터로 변환하여 완전 연결층(Dense Layer)로 전달합니다.
    • 예: 3136 x 128은 3136개의 입력이 128개의 노드로 연결됨을 의미합니다.
  5. 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 SearchRandom Search 방법을 통해 최적의 하이퍼파라미터를 탐색할 수 있습니다.
  • 최신 기법으로는 Bayesian Optimization이나 Hyperband를 사용한 자동 하이퍼파라미터 최적화가 있습니다.

 

이런 방법 등으로 성능을 높일수있다