다운로드
작성자: admin 작성일시: 2016-07-05 22:39:19 조회수: 4862 다운로드: 391
카테고리: 머신 러닝 태그목록:

CNN 기초

이미지 필터링

신경망의 레이어 수가 많아질수록 입력과 출력 사이의 비선형성을 잘 표현할 수 있지만 대신 찾아내야할 파라미터의 수가 많아져서 현실적으로 최적화가 불가능하다. 이를 해결하기 위해 이미지 입력의 경우 파라미터의 수를 대폭 줄이면서 특징을 찾아내는 방법이 CNN(Convolutional Neural Network) 모형이다.

  • 파라미터 수를 줄이기 위해 전체 이미지가 아닌 일부 영역의 값만 선형조합하여 특징을 찾아낸다.
  • 어느 위치에 있는지 모르기 때문에 영역을 이동시키면서(scanning) 특징을 찾는다. 다만 이동하는 동안 특징 계산 가중치값은 변하지 않는다.
  • 한 종류의 특징만 사용하지 않고 여러 종류의 특징을 찾는다.

다음 그림은 기존의 Fully-Connected 구조 혹은 Dense Network라고 불리는 기존의 신경망 모형과 CNN 모형을 비교한 것이다. 전체 이미지로부터 $i$번째 특징 $\phi_i$를 구하려면 기존에는 입력 이미지의 전체 데이터 즉 $x_1$부터 $x_N$을 모두 조합해야 한다.

$$ \phi_i = \sigma \left( \sum_{j=0}^{N^2-1} w[i,j] x[j] \right) $$

이 식에서 $w[i,j]$와 $x[j]$는 지금까지 $w_{ij}$, $x_j$로 쓰던 기호를 첨자가 잘 보이도록 표현법을 바꾼 것이다.

하지만 CNN 모형에서는 $K \times K$ 영역만을 이용하여 특징 $\phi_{ij}$를 계산한다.

$$ \phi_{ij} = \sigma \left( \sum_{k_1=0}^{K-1}\sum_{k_2=0}^{K-1} w[k_1, k_2] x[i-k_1, j-k_2] \right) $$

이 식에서는 입력 데이터를 1차원 벡터로 펼치지 않고 2차원인 행렬 형태 그대로 사용하므로 $x[\cdot,\cdot]$ 기호로 표현하였다.

그림 20.3.1 : 이미지 필터링

스캐닝과 패딩

그림: Valid Padding

그림: Same Padding

Feature Map

  • 만약 weight가 특정 이미지 패턴에 대해 a=1인 출력을 내도록 training 되었다면
    • hidden layer는 feature가 존재하는 위치를 표시하는 지도(map)
  • 여기에서의 feature는 input data를 의미하는 것이 아니라 image 분류에 사용되는 input data의 특정한 pattern을 뜻함
In [1]:
from scipy.ndimage.filters import convolve

r1 = np.zeros(16)
r2 = np.hstack([np.zeros(2), np.ones(12), np.zeros(2)])
r3 = np.insert(np.insert(np.zeros(14), 2, 1), -2, 1)
x = 15 * np.vstack([r1, r1, r2, np.tile(r3, (10, 1)), r2, r1, r1])

k1 = np.zeros((2, 2))
k1[:, 0] = 0.5
k1[:, 1] = -0.5

k2 = np.zeros((2, 2))
k2[0, :] = 0.5
k2[1, :] = -0.5

phi1 = np.maximum(0, convolve(x, k1))
phi2 = np.maximum(0, convolve(x, k2))

sns.set(font_scale=1)
plt.figure(figsize=(10, 7))
plt.subplot(231)
sns.heatmap(x, cmap=mpl.cm.bone_r, annot=True, fmt="2.0f",
            cbar=False, xticklabels=False, yticklabels=False,
            annot_kws={"size": 5})
plt.title("original image")
plt.subplot(232)
sns.heatmap(k1, cmap=mpl.cm.bone_r, annot=True, fmt="2.1f",
            cbar=False, xticklabels=False, yticklabels=False,
            annot_kws={"size": 5})
plt.xlim(-8, 8)
plt.ylim(-8, 8)
plt.title("kernel 1")
plt.subplot(233)
sns.heatmap(k2, cmap=mpl.cm.bone_r, annot=True, fmt="2.1f",
            cbar=False, xticklabels=False, yticklabels=False,
            annot_kws={"size": 5})
plt.xlim(-8, 8)
plt.ylim(-8, 8)
plt.title("kernel 2")

plt.subplot(235)
sns.heatmap(phi1, cmap=mpl.cm.bone_r, annot=True, fmt="2.0f",
            cbar=False, xticklabels=False, yticklabels=False,
            annot_kws={"size": 5})
plt.title("feature map 1")

plt.subplot(236)
sns.heatmap(phi2, cmap=mpl.cm.bone_r, annot=True, fmt="2.0f",
            cbar=False, xticklabels=False, yticklabels=False,
            annot_kws={"size": 5})
plt.title("feature map 2")
plt.show()

Max Pooling

  • 일부 이미지를 생략하여 이미지 사이즈를 축소
    • 영역내에서 가장 최대값 출력
    • 영역내에 이미지 패턴이 존재하는지의 여부의 정보만 남김

그림 20.3.2 : Max pooling 연산

Multiple Feature Maps

  • 하나의 공통 weight set은 한 종류의 image feature만 발견 가능
  • 복수의 feature map (weight set) 필요

그림 : Multiple Feature Map

Multi-Channel CNN

  • 컬러 이미지와 같이 입력 채널이 여러개이거나 feature map을 입력으로 받는 다음 단계의 CNN 레이어
  • 각각의 채널에 대해 다른 이미지 필터를 하나의 세트로 사용하여 필터링 한 결과를 합산

그림: Multi-Channel CNN

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!