합성곱 신경망(convolutional neural network, CNN)
CNN의 가장 중요한 구성 요소는 합성곱 층(convolutional layer)이다. 첫 번째 합성곱 층의 뉴런은 입력 이미지의 모든 픽셀에 연결되는 것이 아니라 합성곱 층 뉴런의 수용장 안에 있는 픽셀에만 연결된다. 이런 구조는 네트워크가 첫 번째 은닉층에서는 작은 저수준 특성에 집중하고, 그다음 은닉층에서는 더 큰 고수준 특성으로 조합해나가도록 도와준다. 이런 계층적 구조는 실제 이미지에서 흔히 볼 수 있으며, 이는 CNN이 이미지 인식에 잘 작동하는 이유 중 하나이다.
< 필터 >
뉴런의 가중치는 수용장 크기의 작은 이미지로 표현될 수 있다.
층의 전체 뉴런에 적용된 하나의 필터는 하나의 특성 맵(feature map)을 만든다. 이 맵은 필터를 가장 크게 활성화시키는 이미지의 영역을 강조한다. 물론 수동으로 필터를 정의할 필요가 없다. 훈련하는 동안 합성곱 층이 자동으로 해당 문제에 가장 유용한 필터를 찾고 상위층은 이들을 연결하여 더 복잡한 패턴을 학습한다.
실제 합성곱 층은 여러가지 필터를 가지고 필터마다 하나의 특성 맵을 출력하므로 3D로 표현하는 것이 더 정확하다.
각 특성 맵의 픽셀은 하나의 뉴런에 해당하고 하나의 특성 맵 안에서는 모든 뉴런이 같은 파라미터(즉 동일한 가중치와 편향)를 공유하지만, 다른 특성 맵에 있는 뉴런은 다른 파라미터를 사용한다. 하나의 합성곱 층이 입력에 여러 필터를 동시에 적용하여 입력에 있는 여러 특성을 감지할 수 있다.
텐서플로에서 각 입력 이미지는 보통 [높이, 너비, 채널] 형태의 3D 텐서로 표현된다. 하나의 미니배치는 [미니배치 크기, 높이, 너비, 채널] 형태의 4D 텐서로 표현된다. 합성곱 층의 가중치는 [fh,fw,fn',fn] 형태의 4D 텐서로 표현된다. 합성곱 층의 편향은 간단하게 [fn] 형태의 1D 텐서로 나타낸다.
from sklearn.datasets import load_sample_image
import numpy as np
china=load_sample_image('china.jpg')/255
flower=load_sample_image('flower.jpg')/255
images=np.array([china,flower])
batch_size,height,width,channels=images.shape #(2, 427, 640, 3)
filters=np.zeros(shape=(7,7,channels,2),dtype=np.float32)
filters[:,3,:,0]=1 #수직선
filters[3,:,:,1]=1 #수평선
outputs=tf.nn.conv2d(images,filters,strides=1,padding='SAME')
plt.imshow(outputs[0,:,:,1],cmap='gray')
plt.show()
이 예에서는 필터를 직접 지정했지만 실제 CNN에서는 보통 훈련 가능한 변수로 필터를 정의하므로 앞서 설명한 것처럼 신경망이 가장 잘 맞는 필터를 학습할 수 있다. 변수를 직접 만드는것보다 keras.layers.Conv2D 층을 사용한다.
from tensorflow import keras
conv=keras.layers.Conv2D(filters=32,kernel_size=3,strides=1,padding='same',activation='relu')
이 코드는 3x3크기의 32개의 필터와 (수평과 수직 방향으로) 스트라이드 1, 'same' 패딩을 사용하는 Conv2D층을 만들고 출력을 위해 ReLU 활성화 함수를 적용한다.
'Computer Vision > Deep learning' 카테고리의 다른 글
23. 케라스를 사용해 ResNet-34 CNN 구현 (0) | 2021.06.13 |
---|---|
22. ResNet, Xception (0) | 2021.06.12 |
21. LeNet-5, AlexNet, GoogleNet (0) | 2021.06.12 |
20. CNN 구조 (0) | 2021.06.12 |
19. 풀링 층 (0) | 2021.06.12 |