1 분 소요


컨볼루션 신경망

컨볼루션층과 풀링층

  • 컨볼루션층과 완전연결층의 차이
    완전연결층은 1차원 배열의 형태의 데이터를 통해 학습
    단순히 데이터를 펼쳐서 사용하기 때문에 각 이미지 픽셀의 관계를 고려하지 않음
    2차원 배열 형태의 데이터를 1차원 배열 형태의 데이터로 변환하면서 본래 데이터의 특징을 잃어버리게 됨

컨볼루션층은 이미지 픽셀 사이의 관계를 고려하기 때문에 지역적 특징을 학습한다.(공간 정보를 유지)

  • 컨볼루션 필터
    모델의 학습을 통해 필터의 파라미터가 목적에 맞게끔 조정
    주로 홀수 갯수로 사용한다.

이미지 필터 사용해보기

가장자리 검출(Edge-detection)에서 예시로 자주 사용되는 소벨 필터(Sobel Filter)

In [1]:
from keras.datasets import fashion_mnist
In [2]:
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
Out [2]:
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
29515/29515 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26421880/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
5148/5148 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4422102/4422102 [==============================] - 0s 0us/step

In [3]:
import matplotlib.pyplot as plt
In [4]:
plt.imshow(x_train[0], cmap='gray')
Out [4]:
<matplotlib.image.AxesImage at 0x7fb20585b5e0>

img

In [5]:
import numpy as np
import cv2
  • 이미지 필터 정의
In [6]:
# 가로선(horizontal) 특화 필터
h_filter = np.array([[1., 2., 1.],
                    [0., 0., 0.],
                    [-1, -2, -1]])

# 세로선(vertical) 특화 필터
v_filter = np.array([[1., 0., -1],
                    [2., 0., -2],
                    [1., 0., -1]])
In [7]:
# 계산의 편의를 위해 이미지 축소
test_img = cv2.resize(x_train[0], (27, 27))
test_img.shape
Out [7]:
(27, 27)
In [8]:
img_size = test_img.shape[0]
output_size = int((img_size - 3)/1+1) # 필터의 수(3행 3열짜리)를 빼줌 # strides로 나누고 더해줌
print(output_size)
Out [8]:
25

img

strides: 얼만큼 이동할지
필터를 홀수로 잡는 이유는 padding을 했을 때 계산의 편의성 때문이다.
padding=’same’ 원본사이즈와 같게 테두리를 0으로 둘러줌

  • 이미지 필터 적용하기
In [9]:
filter_size = 3

# 필터 적용 함수
def get_filtered_img(filter):
    filtered_img = np.zeros((output_size, output_size))
    for i in range(output_size):
        for j in range(output_size):
            # 컨볼루션 연산
            indice_img = test_img[i:(i+filter_size), j:(j+filter_size)] * filter # 행렬곱
            indice_sum = np.sum(indice_img)
            if indice_sum > 255:
                indice_sum = 255
            filtered_img[i, j] = indice_sum
    return filtered_img
In [10]:
# 필터 적용하기
h_filtered_img = get_filtered_img(h_filter)
v_filtered_img = get_filtered_img(v_filter)
In [11]:
plt.subplot(1, 2, 1)
plt.title('vertival')
plt.imshow(v_filtered_img, cmap='gray')

plt.subplot(1, 2, 2)
plt.title('horizontal')
plt.imshow(h_filtered_img, cmap='gray')
plt.show()
Out [11]:

img

이미지의 특징을 뽑아냄->학습

  • 이미지 필터를 적용한 최종 결과
In [12]:
sobel_img = np.sqrt(np.square(h_filtered_img) + np.square(v_filtered_img))

plt.imshow(sobel_img, cmap='gray')
Out [12]:
<matplotlib.image.AxesImage at 0x7fb1f846a8b0>

img

컨볼루션층을 사용하면 필터를 직접 정의할 필요없이 자동으로 파라미터가 학습을 통해 적절히 조정한다.

컨볼루션 알아보기

컨볼루션 연산(Convolution)
스트라이드(Stride) : 얼만큼 이동해서 연산을 할지
패딩(Padding) : 줄어든 이미지를 매꿈

컨볼루션 연산과 스트라이드

컨볼루션층은 주어진 입력 데이터에서 컨볼루션 필터를 활용하여 원소별 곱과 윈도우 슬라이딩(Window Sliding)을 행하는 컨볼루션 연산을 통해 특징맵(Feature Map)을 만들게 된다.

필터의 크기는 3x3을 일반적으로 많이 사용한다.
컨볼루션 필터는 지정해준 스트라이드 크기만큼 움직인다.

img

패딩

특징맵의 크기가 감소하지 않고, 입력 데이터의 형태와 동일한 형태를 출력값으로 얻고 싶은 경우 사용한다.

풀링연산 알아보기

평균풀링(Average Pooling)

최대풀링(Max Pooling) : 주로 사용(특징은 남기고 크기만 줄임)

주로 2x2 스트라이드와 2x2 윈도우 크기를 사용해 특징맵 크기를 절반으로 줄이는 역할(다운샘플링)을 한다.

img

Reference

  • 이 포스트는 SeSAC 인공지능 자연어처리, 컴퓨터비전 기술을 활용한 응용 SW 개발자 양성 과정 - 심선조 강사님의 강의를 정리한 내용입니다.

댓글남기기