Data Science/한번에 끝내는 딥러닝&인공지능

한 번에 끝내는 딥러닝/인공지능 (Conv Layers)

민듀키티 2022. 2. 8. 18:12

1. Image Tensors

Conv Layers는 Image 처리시 많이 사용되는 것으로, 위와 같이 사진을 픽셀로 나누어 image tensor를 만들게 된다.

 

컴퓨터 상에서 이미지는 R, G, B로 표현이 된다. 그래서 위의 그림과 같이 3개의 RGB 채널이 모여 3차원의 텐서가 만들어지게 된다. 그리고 이를 이용해 컬러 이미지 N개를 만들면, 4차원의 텐서가 만들어지게 된다.

 

 

 

2. Correlation

 

correlation은 두 신호 사이에 유사성을 측정해주는 도구이다. 

사진과 필터의 크기가 같은 사이즈라고 가정할 때의 그림으로, 딥러닝에서 correlation 계산공식은 그림과 같다.

x,f는 앞에서 배운 weight의 역할과 같다.

 

 

3*3 크기의 사진과 필터를 flatten을 시켜주면 위와 같이 시각화가 가능하다.

correlation 연산은 dot product 연산이랑 같아지는 형태가 됨을 확인할 수 있다.

 

3. Window Extraction

 

사진이 있을 때, 딥러닝을 구현하기 위해서는 픽셀 단위로 나누게 된다.

window = 3 이라고하면, 픽셀 3개를 뽑게 되는 것이고, window = 4 라고 한다면, 픽셀 4개를 뽑게 되는 것이다.

한 픽셀씩 옮겨가서 window를 계속해서 뽑게된다.

 

우선 window가 1D인 경우이다. 이 경우 첫번째 window 값은 x0, x1, x2가 되게 되고, 두번째 window 값은 x1, x2, x3이 되게 된다. 이렇게 한 픽셀씩 옮겨가면서 3개씩 픽셀을 뽑게 되는 형태이다.

 

2D도 마찬가지이다. 위는 3*3 크기의 window size를 가지게 되는 것이고 오른쪽으로 한 칸 씩 계속해서 이동하면서 window를 뽑게 된다.

 

 

4. Computations of Conv Layers

w는 windows 이고 k는 필터이다. 앞에서 배운 것과 같이, conv layer도 필터를 w라고 생각하며 곱해주는 형태라고 생각하면 된다.

 

필터가 지나가게 되면, nh와 nw의 수는 어떻게 변하게 되냐 ?

사진이 5*5 크기이고, 필터의 크기가 3*3이라고 했을 때, 필터가 지나가게 되면 결국 3*3 크기로 변하게 된다.

이처럼 nh = nh - f + 1 , nw = nw - f + 1 이런 식으로 정의할 수 있게 된다.

 

 

 

5. Conv Layers

 

 

딥러닝에서는 필터 뱅크가 사용되게 되는데, 

앞에서 배운 것에서 weight가 다 다른 것 처럼, 필터도 필터 안에 값들이 다 다르다.

 

 

만약 첫번째 필터의 채널 수가 10개라고 가정하면, A[1]에서 10개의 Channel이 만들어지게 된다.

그리고 두번째 필터를 통해 l2개 마다 하나의 이미지가 만들어짐을 알 수 있다.

 

 

 

6. 코드 구현

(1) Shape of Conv Layers
 
import tensorflow as tf

from tensorflow.keras.layers import Conv2D

N, n_H, n_W, n_C = 1, 28, 28, 5
n_filter = 1
k_size = 3


# conv에 들어갈 image를 만드는 단계
images = tf.random.uniform(minval=0, maxval=1,
                          shape = ((N, n_H, n_W, n_C)))


conv =  Conv2D(filters =n_filter,kernel_size=k_size)

# conv에 image 를 통과
y = conv(images)

W, B = conv.get_weights()


print (images.shape)
print (W.shape)
print(B.shape)
print (y.shape)

>>>

(1, 28, 28, 5)

(3, 3, 5, 1)

(1,)

(1, 26, 26, 1)

 

 

(2) Correlation Calculation

import numpy as np
import tensorflow as tf

from tensorflow.keras.layers import Conv2D

N, n_H, n_W, n_C = 1, 5, 5, 1
n_filter = 1
k_size = 3

images = tf.random.uniform(minval=0, maxval = 10,
                          shape=((N, n_H, n_W, n_C)))

conv = Conv2D(filters=n_filter, kernel_size=k_size)

y = conv(images)
print("Y(Tensorflow): \n", y.numpy().squeeze())
W, B = conv.get_weights()

####
images = images.numpy().squeeze()
W = W.squeeze()
y_man = np.zeros(shape = (n_H - k_size + 1, n_W - k_size + 1))
for i in range(n_H - k_size + 1):
  for j in range(n_W - k_size + 1):
    window = images[i : i+k_size, j : j+k_size]
    y_man[i, j] = np.sum(window*W) + B


print("Y(Manual): \n", y_man)

>>>