Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

AI와 데이터 사이언스의 이론과 실전

CNN 기초 개념 및 용어 본문

카테고리 없음

CNN 기초 개념 및 용어

큐트아리 2024. 3. 26. 16:17

1. CNN(Convolutional Neural Networks)

  • 합성곱 인공 신경망
  • 전통적인 인공 신경망에 Convolutional Layer를 붙인 형태
  • 컨볼루셔널 레이터를 통해 입력받은 이미지에 대한 특징(feature)을 추출하게 되고, 추출한 특징을 기반으로 기존의 뉴럴 네트워크에 이용하여 분류
  • 딥러닝의 경우 일렬로 데이터가 들어감으로 고안된 방법(딥러닝은 2차원 데이터의 좌표값을 유지하지 못함)
  • 합성곱은 행렬로 고안되어있어 좌표값(위치값)을 가지고 있음으로 CNN은 이미지연산에 많이 쓰임

2. CNN을 사용하는 이유

  • 이미지를 분류할 때 DNN(Deep Neural Network)의 문제점
    • 일반적인 DNN은 1차원 형태의 데이터를 사용해야 함
    • 2차원 이상의 데이터가 입력되는 경우 flatten 시켜서 한 줄로 데이터를 변환후 넣어야 함
    • 이미지의 공간적/지역적 정보가 손실

DNN의 문제점을 해결하기 위해 이미지를 그대로(Raw Input) 받음으로 공간적/지역적 정보를 유지

3. 이미지 데이터

  • 컬러 이미지는 3개의 채널로 이루어진 텐서
  • 컴퓨터는 이미지를 숫자로 인식하여 연산을 함

  • 이미지의 정보는 0부터 255까지 256개의 숫자로 표현
  • 예) 빨강 255, 파랑 255, 초록 255은 흰색
  • 예) 빨강 0, 파랑 0, 초록 0은 검은색

4. Convolution 연산

  • 컨볼루션 연산을 진행하면 출력 텐서의 크기가 작아짐
  • 필터는 항상 정방행렬이여야함
  • 패딩 : 이미지의 크기가 줄어들지 않기위해 입력값 주위로 0을 넣어서 입력값의 크기를 인위적으로 키워 결과값이 작아지는 것을 방지 
  • 2D 컨볼루션
    • 컬러 이미지에서는 2D 컨볼루션 연산을 수행
    • 결과는 하나의 값으로 합쳐짐

  • 풀링
    • 중요한 특징을 추출하고 차원을 축소하기 위해 풀링 연산을 사용
    • MaxPool(MaxPool2D), AvgPool(AvgPool2D)

  • stride
    • 필터를 적용하는 간격을 설정
    • 필터를 적용해서 얻어낸 결과를 Feature Map 또는 Activation map이라고 부름
  • 드롭아웃(Dropout) 레이어
    • 오버피팅을 막기 위해 사용하는 레이어
    • 학습중일때 랜덤하게 값을 발생하여 학습을 방해함으로 학습용 데이터에 결과가 치우치는 것을 방지함
  • FC LAyer(Fully Connected Layer)
    • 이미지를 분류 또는 설명하기 위해 예측하는 레이어

5. CNN 체험

https://adamharley.com/nn_vis/

6. CNN을 구성하는 레이어

  • Conv2D : 특징 추출
  • ReLU : 활성화 함수
  • MaxPool2D : 차원 축소
  • Conv2D : 특징 추출
  • ReLU : 활성화 함수
  • MaxPool2D : 차원 축소
  • ...
  • Flatten : 다차원에서 1차원으로 변경
  • Linear : 선형회귀
  • ReLU : 활성화 함수
  • Sigmoid / Softmax 출력

7. CNN을 코드 구현 및 설명

import torch
import torch.nn as nn
import torch.optim as optim
# 배치크기(개수) * 채널(1:흑백,3:컬러) * 높이 * 너비
# 이미지를 여러개를 넣으면 배치크기가 늘어남(배치 사이즈와 같은 개념)
# 즉 28 * 28 로 이루어진 1개의 흑백 이미지
inputs = torch.Tensor(1,1,28,28)
print(inputs.shape)
# 첫번째 Conv2D
# Conv2D는 합성곱(convolution) 연산을 수행하여 입력 이미지로부터 특징 맵(feature map)을 생성
# 흑백사진이긴한데 컬러도 처리할 수 있게 만들어 놓겠음
# in_channels : 넣을 데이터의 수
# out_channels : 내보낼 수(보통 2의 배수), 컨볼루션 레이어에서 생성할 필터(filter) 또는 커널(kernel)의 수를 의미
# kernel_size : kernel(filter)의 사이즈(최소 3*3)
# padding : 이미지크기축소방지, same을 하면 여백을 0으로 채워서 계산한 결과 출력
# stride : step과 같은 의미, 디폴트 값이 1
conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3,padding ='same' )
out = conv1(inputs)
print(out.shape)
# out은 torch.Size([1, 32, 28, 28])가 됨
# 즉, 28*28사이즈의 이미지 1개가 32개의 특징 맵을 생성
# 첫번째 MaxPool2D
# MaxPool2D  = 입력 이미지의 공간적 차원을 감소시키고 가장 중요한 특징을 추출하여 CNN의 계산 효율성을 향상시키는 다운샘플링 기법
# 특징을 뽑아서 차원(크기)을 줄여줌
# kernel_size = 2면 이미지크기가 절반으로 줄어들음(얘는 안겹치게 커널이 걸어가니까)
pool = nn.MaxPool2d(kernel_size = 2)
out = pool(out)
print(out.shape)
# 두번째 Conv2D
conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding ='same' )
out = conv2(out)
print(out.shape)
# torch.Size([1, 64, 14, 14])
# 두번째 MaxPool2D
pool = nn.MaxPool2d(kernel_size = 2)
out = pool(out)
print(out.shape)
# torch.Size([1, 64, 7, 7])
# 1열로 펼치기
flatten = nn.Flatten()
out = flatten(out)
print(out.shape) # 94*7*7
# torch.Size([1, 3136])
fc = nn.Linear(3136,10)
out = fc(out)
print(out.shape)
# torch.Size([1, 10])