IT

머신러닝 3rd

https.. 2024. 10. 20. 04:11

CNN(합성곱 신경망)이란?
원본 이미지에 잘 설계된, 이미지의 특징을 찾기 위한 커널을 합성곱해서
내가 원하는, 커널에 의해 특징이 부각된 결과를 뽑아내는 것
필터를 인공지능이 자동으로 찾게 한다.
사람이 필터의 모양이 어떤 특징인지 해석 불가능하다.
필터의 특징맵이 최적의 결과를 만들어 내기 위한 과정이었다. 만을 추측가능하다.
즉, 원본 이미지가 있고, 이미지에 대한 행렬의 합성곱 연산을 하는 커널이 있다면,
필터 사이즈에 맞게 원본 이미지를 가져와서
픽셀값 곱하고 더하고... 한 칸씩 이동시키면서 필터와 원본 이미지를 접목해서
필터의 행렬을 다 계산해서 하나의 픽셀을 만든다.
 
커널이란?
합성곱 계층에서 가중치에 해당한다.
이미지의 특징을 찾기 위한 기능을 하는 행렬을 필터 또는 커널이라고 부른다.
필터의 특징을 역으로 이용하면,
어떤 사진만이 가지고 있는 이미지의 특징을 찾아내는 필터를 만들 수 있다.
 
CNN-MNIST... (28, 28) Grey 스케일
CNN-CIFAR-10...(32, 32, 3) RGB 스케일
 
Convolution(합성곱)
이미지 상에 어떤 특징이 어느 부분에 있는지를 알면 이미지를 분류할 때 유용
 
Convolution(합성곱)의 원리
필터를 순차적으로 사용자가 정한 이동량만큼 stride
 
Convolution 연산은 만들어질 때부터 3차원 형태의 데이터를 받음.
모델 생성에서 데이터의 형태가 (28, 28)이 아닌 (28, 28, 1)의 3차원 형태여야 한다.
따라서, 독립변수를 reshape 명령어를 통해 차원을 바꿔줘야 함
그리고, Conv2D(Convolutino)의 작성이 완료되어 Dense(완전 연결 계층, 전결합층)을 작성하기 전에 Flatten 명령어를 사용하여 입력 데이터를 1차원으로 바꿔주는 평탄화 작업을 수행해야 한다. 전결합층은 1차원을 입력으로 받기 때문
 
MaxPool2D
Pooling이란? 이미지 사이즈를 줄이는 것
2가지 방식이 있다.
1) max pool: 이미지 사이즈를 줄일 때 최대값을 남김
2) average pool: 이미지 사이즈를 줄일 때 평균값을 남김
-> Convolution처럼 겹치면서 하지 않고, 사용자가 정한 grid에서 원하는 값을 추출하여 이미지 크기를 줄임
겹쳐 이동하지 않고, 최대 혹은 평균값만 유지하며 옆으로 이동
 
완전 연결 계층의 한계와 CNN의 도입
완전 연결 계층은 2차원 이미지 데이터를 1차원 배열로 평탄화 시키는 과정에서 이미지 데이터의 형상이 훼손된다.
인접한 픽셀들 간의 중요한 정보가 손실되어, 글자의 크기, 위치, 회전, 변형에 민감하게 반응하지 못한다.
이 문제를 해결하기 위해 CNN이 제시되었으며, 
CNN은 이러한 형상 변화를 고려하여 학습할 수 있다.
 
합성곱 계층
CNN의 핵심 구성 요소로, 데이터의 형상을 유지하면서 학습한다.
필터가 뉴런 역할을 하며, 학습 과정에서 적절한 필터가 업데이트된다.
필터는 이미지의 유사한 영역을 강조하는 특성 맵을 생성해 다음 계층으로 전달한다.
연산은 필터와 입력 데이터를 곱한 후 합을 구하는 방식으로 수행되며, 마지막에 편향이 더해진다.
 
패딩
출력 데이터의 공간적 크기를 조절하기 위해 사용되는 파라미터이다.
필터의 크기가 커질수록 특징 맵이 작아져 모서리 정보가 손실되기 때문에 이를 조절하기 위해 패딩을 적용한다.
입력 데이터와 출력 데이터의 크기를 같게 해주는 zero-padding, same-padding이 주로 사용된다.
 
스트라이드
입력 데이터에 필터를 적용할 때, 이동하는 간격을 조절하는 파라미터이다.
기본적으로 한 칸씩 이동하는 경우 스트라이드 값은 1이며,
입력 데이터가 너무 큰 경우 연산량을 줄이기 위해 스트라이드 값을 조정한다.
 
LeNet-5

import tensorflow as tf
import pandas as pd

# 테스트 데이터 무시. 반복을 돌 떄, 횟수를 가지고 오는 변수를 받지 않겠다.
(Xdata, Ydata), _ = tf.keras.datasets.mnist.load_data()
Xdata = Xdata.reshape(60000, 28, 28, 1) # CNN은 입력 데이터의 형태가 3차원이기 때문에 변환해줌
Ydata = pd.get_dumies(Ydata) # 원-핫 인코딩

X = tf.keras.layers.Input(shape=[28, 28, 1]) # 3차원 데이터 형태
H = tf.keras.layers.Conv2D(6, kernel_size=5, padding='same', activation='swish')(H) 
# LeNet-5의 INPUT이 (32, 32)인데, mnist는 (28, 28)이기 때문에 
# 코드 그대로 쓰려면 입력 데이터, 출력데이터의 크기를 같게 해주는 same-padding 사용해야함
# padding은, 출력 데이터의 공간적 크기를 조절하기 위해 사용하는 파라미터이다.
H = tf.keras.layers.MaxPool2D()(H) # 절반 줄어듦 (14, 14)가 됨
# 이미지 사이즈를 줄이는 것.
# Convolution 연산처럼 겹쳐 이동하지 않고, 사용자가 정한 grid에서 원하는 값 추출하여 이미지 크기를 줄인다.

H = tf.keras.layers.Conv2D(16, kernel_size=5, activation='swish')(H) # (14 - x) + 1 = 5.. 사이즈는 (10, 10)
H = tf.keras.layers.MaxPool2D()(H) # 절반 줄어듦 (5, 5)가 됨

H = tf.keras.layers.Flatten()(H) # CNN은 3차원을 입력 데이터로 받지만 Dense는 1차원 형태를 받아서 평탄화 해줌
H = tf.keras.layers.Dense(120, activation='swish')(H)
H = tf.keras.layers.Dense(84, activation='swish')(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)

model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy', metrics='accuracy')

# 모델 학습
model.fit(Xdata, Ydata, epochs=10)

# 모델 예측 및 정답 확인
pred = model.predict(Xdata[0:5])
print(pred.round(2))
Ydata[0:5]

'IT' 카테고리의 다른 글

4차 산업혁명과 창의컴퓨팅  (2) 2024.11.05
머신러닝 4th  (0) 2024.10.23
머신러닝 2nd  (0) 2024.10.20
머신러닝-1st  (0) 2024.10.20
리눅스 마스터 2급 1차 2403회  (0) 2024.08.15