Programming/python-deep learning

[Tensorflow] 그림으로 이해하는 CNN 연산과정 (코드포함)

방황하는 데이터불도저 2023. 9. 21. 19:59
import numpy as np
import tensorflow as tf

from tensorflow.keras.layers import Conv2D

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

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

# Forward Propogation(Tensorflow)
conv = Conv2D(filters=n_filter, kernel_size=k_size)
Y = conv(images)
print(f"Y.shape : {Y.shape}\n")
print(f"Y : \n{Y.numpy().squeeze()}\n")
# Output

Y.shape : (1, 2, 2, 5)

Y : 
[[[-0.20035964 -0.0273858   0.61534065 -0.1894783  -0.21524388]
  [-0.50362647  0.13066293  1.0642405   0.90791166  0.27396682]]

 [[-0.04333424 -0.06945033  1.0375061   0.01980186  0.17100859]
  [ 0.07311662  0.06280583  0.78456306 -0.00442532 -0.13051277]]]

실제 코드의 결과는 각 행렬의 (i,j) 원소끼리 열을 구성하고 있다. 위의 그림처럼 일반적인 (channel, height, width) 형태로 output의 shape을 만들어주기 위해서는 아래의 코드를 사용할 수 있다.

# (1*5*5*3) → (1*2*2*5) → (5*2*2)
Y = np.transpose(Y.numpy().squeeze(), (2,0,1))    

print(f"Y.transpose.shape : \n{Y.shape}\n")                                       
print(f"Y.transpose : \n{Y}\n")
# Output

Y.transpose.shape : 
(5, 2, 2)

Y.transpose : 
[[[-0.20035964 -0.50362647]
  [-0.04333424  0.07311662]]

 [[-0.0273858   0.13066293]
  [-0.06945033  0.06280583]]

 [[ 0.61534065  1.0642405 ]
  [ 1.0375061   0.78456306]]

 [[-0.1894783   0.90791166]
  [ 0.01980186 -0.00442532]]

 [[-0.21524388  0.27396682]
  [ 0.17100859 -0.13051277]]]