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

Convolutional Neural Network 기초

CNN

  • 이미지 분류를 위한 신경망 구조

    • local receptive fields
    • shared weights
    • pooling

Convolution (Image Filtering)

  • image를 특정한 이미지 패턴 즉, filter image(kernel)로 내적하며 스캐닝하여 새로운 이미지 생성

Feature Map

  • 만약 weight가 특정 이미지 패턴에 대해 a=1인 출력을 내도록 training 되었다면
    • hidden layer는 feature가 존재하는 위치를 표시하는 지도(map)
  • 여기에서의 feature는 input data를 의미하는 것이 아니라 image 분류에 사용되는 input data의 특정한 pattern을 뜻함
In [1]:
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])
In [33]:
k1 = np.zeros((2,2))
k1[:,0] = 0.5; k1[:,1] = -0.5
k1
Out:
array([[ 0.5, -0.5],
       [ 0.5, -0.5]])
In [34]:
k2 = np.zeros((2,2))
k2[0, :] = 0.5; k2[1, :] = -0.5
k2
Out:
array([[ 0.5,  0.5],
       [-0.5, -0.5]])
In [50]:
plt.figure(figsize=(20, 6))
plt.subplot(131)
sns.heatmap(x, cmap=mpl.cm.bone_r, annot=True, fmt="2.0f",
            cbar=False, xticklabels=False, yticklabels=False)
plt.title("original image")
plt.subplot(132)
sns.heatmap(k1, cmap=mpl.cm.bone_r, annot=True, fmt="2.1f", 
            cbar=False, xticklabels=False, yticklabels=False)
plt.xlim(-8, 8); plt.ylim(-8, 8)
plt.title("kernel 1")
plt.subplot(133)
sns.heatmap(k2, cmap=mpl.cm.bone_r, annot=True, fmt="2.1f", 
            cbar=False, xticklabels=False, yticklabels=False)
plt.xlim(-8, 8); plt.ylim(-8, 8)
plt.title("kernel 2")
plt.show()
In [36]:
from scipy.ndimage.filters import convolve

phi1 = convolve(x, k1)
phi2 = convolve(x, k2)
In [41]:
convolve?
In [37]:
plt.figure(figsize=(18, 10))
plt.subplot(121)
sns.heatmap(phi1, cmap=mpl.cm.bone_r, annot=True, fmt="2.0f", 
            cbar=False, xticklabels=False, yticklabels=False)
plt.title("feature map 1")
plt.subplot(122)
sns.heatmap(phi2, cmap=mpl.cm.bone_r, annot=True, fmt="2.0f", 
            cbar=False, xticklabels=False, yticklabels=False)
plt.title("feature map 2")
plt.show()

Max Pooling

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

In [38]:
from skimage.measure import block_reduce

phi1r = block_reduce(phi1, (2, 2), np.max)
phi2r = block_reduce(phi2, (2, 2), np.max)
In [40]:
plt.figure(figsize=(18, 10))
plt.subplot(121)
sns.heatmap(phi1r, cmap=mpl.cm.bone_r, annot=True, fmt="2.0f", 
            cbar=False, xticklabels=False, yticklabels=False)
plt.title("max pooled feature map 1")
plt.subplot(122)
sns.heatmap(phi2r, cmap=mpl.cm.bone_r, annot=True, fmt="2.0f", 
            cbar=False, xticklabels=False, yticklabels=False)
plt.title("max pooled feature map 2")
plt.show()

Local Receptive Field

  • Input Layer의 일부 Input에 대해서만 다음 Hidden Layer로 weight 연결
    • 예: 28x28 Input Layer에서 5x5 영역에 대해서만 weight 연결
    • => 다음 Hidden Layer의 크기는 (28-5+1)x(28-5+1) = 24x24
    • Sparse Connectivity

Shared weights and biases

  • 모든 연결에 대해 공통 weight & bias 계수 사용
    • 위 예에서 parameter의 수는 26개 (5x5+1)
$$ \begin{eqnarray} \sigma\left(b + \sum_{l=0}^4 \sum_{m=0}^4 w_{l,m} a_{j+l, k+m} \right). \end{eqnarray} $$
  • 이 연산은 2-D image filter의 convolution연산과 동일
    • => Convolution NN
    • 공통 weight: image kernel, image filter

Multiple Feature Maps

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

  • MNIST digit image 에 대해 training이 완료된 20개 feature map의 예

Max Pooling Layer

Output Layer

  • Flatten
  • Dense (Fully Connected Network)
  • Softmax

Multi-Channel CNN

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

질문/덧글

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