Programming/python-numpy

Tensorflow, Numpy - squeeze()와 flatten()의 차이

방황하는 데이터불도저 2023. 9. 25. 17:49

Tensorflow(Keras)에서는 다양한 연산을 해줄 수 있는함수들을  Layer의 형태로 제공해주고 있다.
(ex. Dense, Convolution, Pooling,,,)
 
어떤 값들이 Layer를 통해서 나오는 Output은 텐서 형태로 그 결과물에 대해 추가적인 변형을 주고싶을 때는 해당 객체를 numpy형태로 변환해주어야한다. 그 과정은 아래의 MaxPooling2D 레이어를 거친 결과물로 예시를 들어 코드를 작성한 것에서 pooled_max.numpy()부분이다.

import numpy as np
import tensorflow as tf

from tensorflow.keras.layers import MaxPooling2D

N, n_H, n_W, n_C = 1, 5, 5, 1
f, s = 2, 1

x = tf.random.normal(shape=(N, n_H, n_W, n_C))
pool_max = MaxPooling2D(pool_size=f, strides=s)

pooled_max = pool_max(x)

print(f"pooled max (Original) : {pooled_max.numpy().shape}\n{pooled_max.numpy()}\n")

print(f"pooled max (Squeeze) : {pooled_max.numpy().squeeze().shape}\n{pooled_max.numpy().squeeze()}\n")

print(f"pooled max (Flatten) : {pooled_max.numpy().flatten().shape}\n{pooled_max.numpy().flatten()}\n")

해당 글에서 설명하고자 하는 squeeze()와 flatten()함수는 이 numpy() 변환과정을 해주지 않으면, 아래와같은 에러가 발생하기 때문에, 필수적으로 거쳐줘야하는 과정이다.

numpy()를 적용해주지 않은 경우

위의 코드에서 MaxPooling2D 레이어를 거친 원본 결과와 squeeze한 경우, flatten한 경우의 결과는 아래와 같다.

  • Squeeze는 실질적으로 원소가 포함되어있는 축이 아닌, 추가적으로 감싸져있는 (=shape중에서 1인) 축을 제거해주어 shape를 더 간소화 해주는 역할을 해준다.
  • Flatten은 스퀴즈와 달리 아예 모든 축을 없애고 원소를 행-열 순서대로 가져와 하나의 축(리스트)에 담아주는 것이다.

위의 차이에 따라서 (1, 4, 4, 1) 형태인 원본데이터를 squeeze를 통하면 (4, 4)로 정리되고, flatten을 통하면 (16,)로 정리된다.