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 :