ML & DL

이미지 분류

jun_code 2022. 5. 12. 23:29

CNN

CNN pytorch 코드 

하이퍼파라미터 코드

이미지 변경

Padding

http://taewan.kim/post/cnn/ : CNN 전체 구조 파악하기

 

 

CNN 구조와 Layer

  • 이미지의 공간 정보를 유지한 상태로 학습이 가능한 모델 => 이미지 분류에 활용되는 방법
  • 구조 예시 : 이미지 -> Conv layer -> ReLu -> Conv layer -> .. -> Pooling layer -> Conv layer -> FC layer -> softmax -> classification
  • 특징 추출 영역(겹겹의 Conv layer와 Pooling layer)과 클래스를 분류하는 부분으로 나뉘어져 있음
  • 마지막 Output feature map을 FC layer에 넣어 class(분류 개수) 수 만큼의 차원으로 바꿈
  • Softmax를 사용하여 최종 classification score를 뽑아냄

from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers import Dense
from keras.layers import Flatten

model = Sequential()
model.add(Conv2D(12, kernel_size=(5, 5), activation='relu', input_shape=(120, 60, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16, kernel_size=(5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(20, kernel_size=(4, 4), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(4, activation='softmax'))

 

Data Augmentation : 데이터 증강 기법

  • 원본 데이터에 변화를 가해 학습에 활용할 수 있도록 새로운 데이터를 만드는 기법
  • 데이터 수를 늘려 Overfitting을 막기 위한 방법으로도 사용됨

CONV Layer : Convolution Layer

  • 입력 데이터에 필터(합성곱)를 적용한 후에 결과를 다음 Layer에 전달하여 활성화 함수를 반영하는 필수 Layer
    • 이미지 등의 데이터에 합성곱을 적용하여 필드의 픽셀 전체를 하나의 값으로 변환하여 필드 전체 정보를 하나의 픽셀 값으로 표현
  • 보편적으로 사용되는 것은 Conv2D
    • Conv2D : 
  • 각각의 Filter당 하나의 Feature Ma이 생성되고 Feature Map들을 쌓아 Output Feature Map이 구성됨
    • Filter가 많은 경우 많은 가중치가 필요하고 이 과정 속에서 overfitting이 발생할 수 있음

Pooling Layer : Convolution Layer

  • 선택적 Layer
  • 생성된 Feature Map의 크기를 줄여 overfitting을 방지하기 위한 방법
  • Conv Layer에서 이미지의 특징을 추출하고 Pooling Layer에서 왜곡을 최소화
  • Pooling 종류
    • Max Pooling : Filter가 이동하는 영역 내에서 최대값만 추출
    • Average Pooling : Filter가 이동하는 영역 내의 평균값 추출
    • Global Average Pooling : 자체적으로 이미지 출력값을 지정

x = torch.randn(128, 1, 28, 28).to(device)
maxpool = nn.MaxPool2d(kernel_size=2, stride=2) # kernel_size=2, stride=2
x_after_maxpool = maxpool(x)
print('x_after_maxpool:',x_after_maxpool.shape) # [128, 1, 14, 14]

x = torch.randn(128, 1, 28, 28).to(device)
maxpool = nn.MaxPool2d(kernel_size=4, stride=4)
x_after_maxpool = maxpool(x)
print('x_after_maxpool:',x_after_maxpool.shape) # [128, 1, 7, 7]
x = torch.randn(128, 1, 28, 28).to(device)
avgpool = nn.AvgPool2d(kernel_size=2, stride=2)
x_after_avgpool = avgpool(x)
print('x_after_avgpool:',x_after_avgpool.shape) # [128, 1, 14, 14]

x = torch.randn(128, 1, 28, 28).to(device)
avgpool = nn.AvgPool2d(kernel_size=7, stride=7)
x_after_avgpool = avgpool(x)
print('x_after_avgpool:',x_after_avgpool.shape) # [128, 1, 4, 4]
x = torch.randn(128, 1, 28, 28).to(device)
global_avg_pool = nn.AdaptiveAvgPool2d((1,1)) # 이미지 출력 값을 (1,1)로 
x_after_global_avg_pool = global_avg_pool(x)
print('x_after_global_avg_pool:',x_after_global_avg_pool.shape) # [128, 1, 1, 1]

FC Layer : Fully Connected Layer

  • 마지막에 이미지 분류를 위한 Layer
  •  

Flatten Layer : Convolution Layer

  • 이미지 특징 추출 부분과 이미지 분류 부분 사이에 이미지 형태의 데이터를 배열로 만드는 Layer

 

CNN 주요 용어

 

Channel

  • 이미지 픽셀은 실수 값을 가지고 있음
  • 컬러 이미지는 RGB 3가지 색상을 픽셀에 실수로 표현하는 3차원 데이터로 3개의 채널로 구성됨
  • 흑백 이미지는 명암으로 픽셀에 실수로 표현하는 2차원 데이터로 1개의 채널로 구성됨
    • 예시 : 높이 39, 폭 31, 컬러 이미지 => (39, 31, 3) / 높이 39, 폭 31, 흑백 이미지 => (39, 31, 1)
  • Conv Layer에 입력되는 데이터는 한 개 이상의 필터가 적용되고 n개 필터가 적용되면 n개의 Channel이 됨

Filter & Stride

  • Filter : 이미지 특징을 찾아내기 위한 파라미터 ( = Kernel)
    • 일반적으로 필터는 4*4, 3*3 행렬이고 일정 간격(Stride)으로 순회하여 각 채널의 합성곱을 하고 모든 채널의 합성곱의 합을 Feature Map으로 만듦

  • Stride : 필터를 순회하는 지정된 간격으로 n칸씩 이동하면서 합성곱을 계산함
x = torch.randn(128, 1, 28, 28).to(device) # x shape : (128, 1, 28, 28)
conv_layer = nn.Conv2d(1, 32, kernel_size=3) # filter : 1, out_channels : 32
x_after_conv = conv_layer(x)
print('x_after_conv:',x_after_conv.shape) # [128, 32, 26, 26]
x = torch.randn(128, 1, 28, 28).to(device)
conv_layer = nn.Conv2d(1, 32, kernel_size=3, stride=2) # stride : 2
x_after_conv = conv_layer(x)
print('x_after_conv:',x_after_conv.shape) # [128, 32, 26, 26]

Padding

  • Conv Layer에서 Filter와 Stride로 Feature Map은 실제 Input data 크기보다 작음
  • 출력 데이터가 작아지는 것을 방지 하기 위해 입력 데이터 외각에 픽셀을 특정 값으로 채우는 것
    • 보통 padding을 0으로 채움

 

Weight(Parameter) Sharing

  • MLP => CNN과 비교
    • 모든 것에 연결되어 parameter 수가 많아 메모리 차지를 많이 함
    • Spatial 정보를 고려하지 않아 이미지 처리에 적절하지 않음
    • 1차원의 Flatten vector만 입력으로 받음
  • CNN
    • Spatial 정보를 고려함
    • Weight(Parameter) Sharing으로 연산과 메모리를 줄임

Translation Equivariance / Translation Invariance

  • Translation Equivariance : 입력 위치가 변하면 출력도 동일하게 위치가 변한 상태로 나오는 것
    • Conv Layer의 특징
  • Translation Invariance : 입력 위치가 변해도 출력의 위치는 변하지 않음
    • 위치 정보가 특히 중요한 경우에는 사용하지 않아야 함

 

Hyper Parameter

  • Loss Function : MSE, Cross Entropy
  • Optimizator : SGD, Nesterov, Momentum, Adam
  • Mini batch size : 너무 크면 메모리가 많이 들고, 너무 작으면 학습이 느림
  • Weight Initialization : 초기 weight가 학습에 영향을 미침
  • Learning Rate : 너무 큰 경우 minimum에 도달하지 못하고, 너무 작은 경우 학습이 느림
  • Epoch : 너무 많이 하는 경우 overfitting, 너무 작은 경우 학습이 덜 됨
  • Layer 수 / Filter 수 : 너무 많은 경우 overfitting, 너무 작은 경우 학습이 덜 됨
  • Activation Function : sigmoid, Relu, LeakyRelu, tanh
  • Dropout
  • Batch Normalization :