Open sihunh opened 1 year ago
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
model = Sequential([ Conv2D(filters=32, kernel_size=(3, 3), padding='same', activation='relu', input_shape=(28, 28, 1)), MaxPooling2D(pool_size=(2, 2)), Conv2D(filters=64, kernel_size=(3, 3), padding='same', activation='relu'), MaxPooling2D(pool_size=(2, 2)), Flatten(), Dense(units=128, activation='relu'), Dense(units=10, activation='softmax') ])
패딩(padding)을 추가하는 코드는 Conv2D 레이어의 padding 매개변수를 이용하여 설정할 수 있습니다.
padding 매개변수는 'valid'와 'same' 두 가지 값을 가질 수 있습니다. 'valid'는 패딩을 사용하지 않고 입력 이미지의 가장자리 특성맵을 버리는 옵션입니다. 'same'은 입력 이미지와 동일한 크기의 출력 특성맵을 생성하고 입력 이미지 주위에 제로 패딩을 추가하는 옵션입니다.
Conv2D는 2차원 컨볼루션 레이어를 만드는 함수입니다. 이 함수에 입력값으로 다음과 같은 인자들이 전달됩니다.
filters : 필터의 개수를 정수형 값으로 지정합니다. 이 값은 출력 공간의 차원 수를 나타내며, 컨볼루션을 통해 나온 출력 데이터의 채널 수가 됩니다.
kernel_size : 필터의 크기를 정수 혹은 튜플 형태로 지정합니다. 이 값은 2D 컨볼루션 윈도우의 너비와 높이를 나타냅니다.
padding : 경계 처리 방법을 정의합니다. 'valid' 또는 'same' 값을 지정할 수 있습니다. 'valid'는 유효한 영역만 출력에 포함되도록 입력의 가장자리를 무시하는 것을 의미합니다. 'same'은 출력 크기가 입력과 동일하도록 입력의 경계에 0을 추가하는 것을 의미합니다.
activation : 활성화 함수를 지정합니다. 여기에서는 'relu'를 사용합니다.
input_shape : 입력 데이터의 형태를 지정합니다. 이 값은 (높이, 너비, 채널) 형태의 튜플로 지정합니다.
따라서, 위 코드에서 Conv2D 레이어는 32개의 필터를 사용하고, 필터의 크기는 (3, 3)이며, 'same' 패딩을 적용합니다. 또한, 입력 데이터의 형태는 (28, 28, 1)입니다. 마지막으로, 'relu' 활성화 함수가 사용됩니다.
패딩(padding)에는 'valid padding'과 'same padding' 이외에도 'causal padding'이 존재합니다.
Valid padding: 패딩을 추가하지 않습니다. 출력 크기가 입력보다 작아집니다.
Same padding: 출력 크기가 입력과 같아지도록 입력 주변에 패딩을 추가합니다. 출력 크기가 입력보다 작아지지 않습니다.
Causal padding: 시계열 데이터에서 사용됩니다. 현재 시점 이전의 데이터만을 사용해 예측하기 위해 입력 데이터의 처음부터 차례로 한 칸씩 이동하면서 패딩을 추가합니다. 이렇게 하면 현재 시점 이전의 데이터만을 사용하게 되어 시계열 데이터에 적합한 학습이 가능합니다.
각 패딩의 특징에 따라 적절한 패딩을 선택하여 모델을 설계하면 됩니다.
Causal padding은 주로 시계열 데이터에서 사용됩니다. 시계열 데이터는 과거와 현재가 관련이 있으므로, 현재 시점 이전의 데이터만을 사용해 예측하는 경우에 적합합니다.
예를 들어, 주가 예측 모델에서는 과거의 주가 데이터만으로 미래의 주가를 예측해야 합니다. 이 경우에는 causal padding을 사용하여 현재 시점 이전의 데이터만을 사용해 모델을 학습할 수 있습니다.
또한, 자연어 처리 분야에서도 causal padding을 사용하는 경우가 있습니다. 문장 생성 모델에서는 이전 단어들만을 이용해 다음 단어를 예측해야 하기 때문에 causal padding을 사용하여 이전 단어들만을 고려하는 모델을 구성할 수 있습니다.
작은 이미지를 전처리할 때에는 몇 가지 주의해야 할 점이 있습니다.
이미지 크기를 증가시키기
작은 이미지를 그대로 사용하면 모델이 이미지에서 패턴을 찾기 어렵기 때문에, 이미지 크기를 증가시켜야 합니다. 이 때, 이미지를 확대할 때 이미지의 해상도가 낮아지는 문제가 발생할 수 있으므로, 보간법(interpolation)을 사용하여 이미지를 부드럽게 확대할 수 있습니다.
데이터 증강을 활용하기
데이터 증강(data augmentation)은 기존의 데이터를 변형하여 새로운 데이터를 만들어내는 방법입니다. 예를 들어, 이미지를 회전, 이동, 크기 조절, 반전 등의 방법으로 변형하여 데이터의 다양성을 높일 수 있습니다. 따라서 작은 이미지를 확대하는 대신 데이터 증강을 활용하여 모델의 일반화 성능을 높일 수 있습니다.
네트워크 구조 변경하기
작은 이미지를 다루기 위해 일반적으로는 모델의 구조를 변경해야 할 필요가 있습니다. 예를 들어, Convolutional Neural Network(CNN)에서는 커널의 크기를 작게 설정하거나, 더 많은 합성곱 계층을 추가하여 모델의 성능을 향상시킬 수 있습니다.
따라서, 작은 이미지를 전처리할 때에는 이미지 크기 증가, 데이터 증강, 네트워크 구조 변경 등의 방법을 사용하여 모델의 성능을 향상시킬 수 있습니다.
그럼 이미지 크기 증가 시키는 방법??
이미지 크기를 증가시키는 방법에는 여러 가지가 있습니다.
보간법(interpolation) 사용하기
가장 일반적인 방법으로, 이미지의 크기를 늘리는데 사용됩니다. 이미지를 확대할 때, 이미지의 해상도가 낮아지는 문제가 발생할 수 있는데, 이를 해결하기 위해 이미지의 크기를 증가시킬 때 보간법을 사용합니다. 대표적인 보간법으로는 Nearest Neighbor, Bilinear, Bicubic, Lanczos 등이 있습니다.
패딩(padding) 추가하기
이미지를 확대할 때, 이미지의 가장자리 부분은 새로운 픽셀값을 생성할 수 없기 때문에, 이미지의 크기를 증가시키면서도 이미지의 경계 부분에서 픽셀값이 손실되는 문제가 발생할 수 있습니다. 이를 해결하기 위해 패딩(padding)을 추가하여 이미지를 확장할 수 있습니다. 대표적인 패딩 방법으로는 zero padding, reflect padding, replicate padding 등이 있습니다.
합성곱 신경망(CNN)에서 스트라이드(stride) 조절하기
합성곱 신경망에서는 입력 이미지에 필터(kernel)를 적용하여 특징 맵(feature map)을 생성합니다. 이 때, 스트라이드를 조절하여 특징 맵의 크기를 조절할 수 있습니다. 예를 들어, 스트라이드를 2로 설정하면 특징 맵의 크기가 입력 이미지의 크기의 절반으로 줄어듭니다. 따라서, 스트라이드를 작게 조절하면 특징 맵의 크기를 늘릴 수 있습니다.
이 외에도, 이미지 크기를 증가시키는 방법으로는 Upsampling, Transpose Convolution, Sub-pixel Convolution 등의 방법이 있습니다.