반응형
 
 

1. CNN 이론

Convolution Neural Network : 컴퓨터 비전 및 인공지능 이미지 인식의 핵심 기술

  • 스마트폰의 안면 인식, 자율주행 차량의 카메라 센서, 공장 불량품 검사 장비처럼 "엄청나게 빠른 속도(Real-time)로 기기 자체(Edge)에서 돌아가야 하는 환경"에 사용
  • 초고속 실시간 처리, 인프라 비용 절감, 짧은 문장의 패턴 분류가 목적인 텍스트 분류 시에도 CNN 사용 (by Gemini)
    • 정교한 긴 글 문맥 파악과 최고 수준의 정확도가 필요하다면 👉 Transformer(BERT 등)나 LLM이 유리

1.1 개요

 
Convolution 용어 정리
  • 합성곱
  • 컨볼루션
  • 길쌈부호(통신공학)
 

과거에는 이미지를 입력할 때 모든 데이터를 한 줄로 쭉 펴서 연결하는 FC(Fully Connected, 완전 연결) 네트워크를 주로 사용
  • 공간적 특성을 무시한다는 단점





 
 


고양이 뇌의 시각 세포 전체가 한 번에 반응하는 것이 아니라, 특정 형태나 특정 부분의 그림에만 반응하는 뉴런들이 따로 있다는 것을 발견


"이미지 전체를 통째로 보지 말고 부분 부분 나누어서 특징을 추출하자"

1.2 CNN

 
  1. Conv layer
    1. 이미지 위를 훑으며 선이나 면 같은 핵심 '특징을 추출'
  2. ReLU
    1. 데이터에 '비선형성을 추가'해 특징을 더욱 도드라지게 만듬
  3. Pooling
    1. 불필요한 부분은 버려지고 핵심만 압축
  4. Fully connected layer
    1. 뽑아낸 특징 데이터들은 일렬로 길게 펼쳐져 최종 '분류 결정'을 내리게 됨
  5. Softmax
    1. 뒤죽박죽인 점수들을 0과 1 사이의 '확률 값'으로 변환

1.2.1 Convolutional layer

 
컨볼루셔널 레이어


컴퓨터에게 컬러 이미지는 32x32 크기라고 할 때, RGB(Red, Green, Blue) 세 가지 색상 채널이 합쳐진 32x32x3 형태의 3차원 데이터(벡터)로 인식


고양이의 시각 인식 예시처럼 부분 인식을 위해 5x5 크기의 필터를 쓴다면, 색상 채널 3을 포함해 5x5x3 크기의 영역만 떼어서 한 번에 살펴보게 됨.
 
 

5x5 필터 영역에 있는 여러 개의 픽셀 값들을 입력(x)으로 받아서, 'Wx + b' 공식을 적용해 딱 '하나의 숫자'로 요약해 내는 것
 
 

W(Weight, 가중치)
  • 필터가 가진 고유의 값
  • W와 이미지의 픽셀 값(x)을 곱함


b(bias, 편향)
  •  


결국 복잡한 이미지의 일부분이 Wx+b 연산을 하는 필터를 거치면 필터의 특징을 담은 점 하나로 압축



1.2.2 ReLU

 
 


f(x) = max(0, x)


입력값이 0보다 작으면 0으로 만들고, 0보다 크면 입력값 그대로 통과시키는 단순한 함수


특징 맵(Feature Map)의 모든 원소에 개별적으로 적용되는 원소별(Element-wise) 연산이기 때문에, 입력된 데이터의 가로, 세로, 채널 크기(차원)를 절대 변경하지 않음


인공신경망이 복잡한 데이터(이미지 등)를 학습하려면 수학적인 '비선형성(Non-linearity)'이 필수적이기 때문에 들어가는 필수
 
 

하나의 점을 뽑아냈다면 필터를 옆으로, 그리고 아래로 이동시키며 전체 이미지를 훑어야 함


스트라이드(Stride)
  • 필터가 한 번에 몇 칸 씩 이동할 지


출력 크기
  • (입력 크기 - 필터 크기) / 스트라이드 + 1



 
 

필터를 적용하면 결과물이 점점 작아지면서 모서리 부분의 정보를 잃어버리는 문제 발생


패딩
  • 원본 이미지 테두리에 0이라는 가상의 픽셀을 둘러주는 것
  • 입력과 출력 이미지의 크기를 동일하게 유지
  • 이미지 모서리(테두리) 인식



 
 

사진에는 윤곽선, 질감 등 여러 특징이 숨어있으므로 한 개의 필터만 쓰지 않음


각기 다른 가중치(W)를 가진 필터를 여러 개 동시에 적용
  • 6개의 다른 필터를 사용했다면, 똑같은 이미지를 훑었더라도 결과물은 6개의 각기 다른 특징을 담은 맵이 생성되어 두께(Depth)가 6이 됨


필터 안의 가중치(Variable)들은 사람이 일일이 정해주는 것이 아님
  • 처음에는 무작위(Random) 값으로 초기화
  • 수많은 데이터 학습하면서 스스로 정교한 값을 찾아감









1.2.3 Pooling

 
 

컨볼루션을 거친 데이터는 여전히 크기가 큼


풀링
  • 데이터의 가로, 세로 사이즈를 작게 줄여주는 과정
  • 일종의 샘플링(Sampling)


데이터의 공간적 크기를 줄여 연산량을 감소시키는 실질적인 '차원 축소' 과정


맥스 풀링
  • 가장 큰 값만 고르는 방법으로 가장 널리 사용되는 방법
  • 평균을 내거나 제일 작은 값을 고르는 것 보다 효과적
 
 

서브샘플링(하위 샘플링)
  • "전체 데이터 중에서 일부만 골라내어 크기를 줄이는 행위"를 뜻하는 데이터 처리 용어
  • 초고해상도 사진을 웹사이트 업로드용으로 작게 줄일 때(Resize), 픽셀을 듬성듬성 솎아내어 크기를 줄이는 것을 이미지 처리 학문에서 '서브샘플링' 혹은 '다운샘플링'이라고 부름


맥스풀링은 그 서브샘플링을 구현하는 구체적인 방법 중 하나


cf> '샘플링'이란 전체 중에서 일부를 뽑아내는 행동
 

ReLU와 Pooling의 차이


 



1.2.4 Fully Connected layer

 
 

  1. 특징을 찾는 Conv(컨볼루션)
  2. 음수를 0으로 만들어 수학적 비선형성을 부여하는 ReLU(Rectified Linear Unit, 렐루)
  3. 크기를 압축하는 Pooling(풀링)



 
 

입체적인 데이터를 1차원 배열로 길게 폄 (Flatten)


이 1차원 데이터를 우리가 흔히 아는 기본 인공신경망인 FC(Fully Connected, 완전 연결) 레이어에 입력


FC 레이어는 각각의 이미지 클래스(예: 개, 고양이, 자동차)에 대해 "내가 보기에 고양이일 점수는 150점, 강아지일 점수는 -20점이야"라는 형태의 가공되지 않은 원시 점수(Logit, 로짓)를 계산

1.2.5 Softmax

 
 

이 뒤죽박죽인 점수들을 전부 합쳤을 때 딱 1(100%)이 되도록, 아름다운 '확률 값'으로 변환해 주는 역할
 
 

1.3 CNN case study

 

 


 
 

 
 
 
 

 
 
알파고는 바둑판의 상태를 하나의 '이미지'처럼 인식하여 다음 장소에 돌을 둘 확률을 계산해 냄

1.3.1 알파고의 CNN 적용 사례

 
 


 
 
바둑판의 크기인 19 * 19 공간에, 돌의 위치 정보(돌이 있는지 없는지 등)를 담은 48개 채널이 겹겹이 쌓여 있는 형태
 

  1. CONV1
    1. 패딩 : 23 × 23 크기로 늘림
    2. 필터 연산: 5 × 5인 필터를 stride 1로 설정하여 컨볼루션 연산을 수행. 대국 버전 알파고에서는 192개의 필터 사용
    3. 활성화 함수: 연산 후 ReLU(Rectifier Nonlinearity)를 적용하여 비선형성 확보
    4. 출력 크기: 19 × 19 × 192
  2. CONV2~12
    1. 반복 구조: 2번째부터 12번째 레이어까지 총 11개의 은닉층이 동일한 패턴을 반복하며 이미지의 깊은 특징을 추출합니다.
    2. 패딩: 이전 레이어의 출력을 제로 패딩하여 21 × 21 크기로 만듭니다.
    3. 필터 연산: 크기 3 × 3 필터 192개를 스트라이드 1로 연산한 후, ReLU 사용
    4. 출력 크기: 19 × 19 × 192
 
 
  1. 최종출력층 CONV
    1. 필터 연산: 마지막 레이어에서는 크기 1 × 1인 필터 단 1개만 사용해 스트라이드 1 사용. 이때 바둑판의 각 위치마다 서로 다른 바이어스(Bias) 값을 적용합니다.
    2. 확률 변환: 최종적으로 소프트맥스(Softmax) 함수를 적용합니다.
    3. 출력 크기: 19 × 19
    4. 의미: 바둑판의 각 좌표마다 '여기에 돌을 두면 승리할 확률이 얼마나 되는지'를 나타내는 다음 수에 대한 확률 지도(Probability map of promising moves)를 완성
 
 

Pooling 미사용
  • 19 * 19 바둑판 전체 좌표 단위 확률 정보를 최대한 유지하기 위해

2. CNN 텐서플로우 예시

2.1 텐서플로우 기본 API

 
 


손글씨(MNIST) 3 이라는 이미지 로딩
  • 28 * 28 size


cf> MNIST
MNIST는 Modified National Institute of Standards and Technology (수정된 미국 국립표준기술연구소)의 약자입니다.
기계 학습(Machine Learning) 및 컴퓨터 비전(Computer Vision) 분야에서 모델 학습의 성능을 평가하기 위해 널리 사용되는 대표적인 손글씨 숫자 데이터베이스 입니다.
 

  • 3*3 filter 5개 사용
  • padding SAME 설정으로 제로 패딩 사용
  • stride 2 설정으로 output size 4분의 1 사이즈인 14*14로 축소됨
  • 총 5장의 서브 샘플링된 이미지

 
 
  • stride 2로 설정하여 7 * 7 size로 축소됨

2.2 Simple CNN 예시

 
 
Conv1
  • 28 * 28 size 32개가 max pooling시 stride 2로 14 * 14 size 32개로 변경
 
 

Conv2
  • 7 * 7 size 64개
 
 

총 3136개 (7*7*64)로 FC layer 처리
총 10개의 output
 
 
Simple CNN으로 98.85% 정확도

2.3 Deep CNN 예시

 
 
 



CNN을 중첩 시킴
99.38%로 정확도 향상

2.3 텐서 플로우 class 사용

  • class, layer 사용해 보다 간단히 사용하는 API
 
 

 
 

class Model과 layer 사용해 보다 쉽게 CNN 설정 가능

3. CNN 실습

 
 
영상에서 소개된 버전은 old version
제미나이에 문의해보니 텐서 플로우 코드 짜줌.
 
텐서플로우 코드 #6
mnist.load_data() 통해 손글씨 7만장 로딩
(학습용 6만장 + 시험용 1만장)
  1. x_train (학습용 문제지): 모델을 훈련시키기 위한 60,000장의 숫자 이미지
  2. y_train (학습용 정답지): 그 60,000장의 이미지가 각각 무슨 숫자인지 적힌 정답 라벨 (예: 0, 3, 7 등)






#40 학습(?)
model.fit(x_train, y_train, epochs=5, batch_size=128)
  • batch_size=128: 60,000장의 이미지를 한 장씩 풀고 수정하면 너무 비효율적이니까, 128장씩 묶어서 한 번에 풀고 오답 노트를 작성(가중치 수정)하라는 뜻
  • epochs=5: 60,000장 전체 문제지를 처음부터 끝까지 총 5번 반복해서 풀라는 뜻
  • 학습이란 레이어(구조) 자체를 계속 무한정 덧붙여 쌓는 것이 아니라, 정해진 레이어 구조 속에 수만 장의 데이터를 수차례(Epoch) 반복해서 통과시키며 정답을 맞히기 위해 오차를 줄여나가는 과정

google colab 접속 해 실행 결과

 
 

 
 


  • 6만장 전체를 총 5번 풀음
  • 469
    • 가중치 업데이트 횟수 의미
    • (60000 / 128) == 469
  • loss (오차): 모델의 예측이 실제 정답과 얼마나 빗나갔는지 보여주는 지표야. 에포크가 지날수록 값이 0.1723에서 0.0209로 꾸준히 떨어지고 있음.
    • 학습을 거듭할수록 오차가 상당히 떨어지면서 모델이 똑똑해지고 있다는 뜻
  • accuracy (학습 정확도): 학습 데이터에 대한 정답률이야.
    • 첫 번째 94.74%
    • 5번 반복 학습한 후에는 99.31%까지 상승
  • 313
    • 모델이 한 번도 본 적 없는 새로운 시험지(테스트 데이터 10,000장)를 주고 평가를 진행한 단계
    • 실행 결과 99.14%.


(그림이 없어서 그냥 그런가부다)
반응형

'IT' 카테고리의 다른 글

Notion에서 아이펜슬로 그림 추가하는 방법  (0) 2021.03.14
Little-Endian / Big-Endian  (0) 2010.08.16
2010 문화체육관광부 우수 학술도서 선정~!  (0) 2010.07.31
PKI  (0) 2010.05.26
콘덴서 읽기  (0) 2010.05.20

+ Recent posts