본문 바로가기

AI 인공지능

인공지능 수첩 ( 레이어 / Convolution / Deconvolution / Upsampling의 종류 / 합성곱 신경망 / 세임 패딩 / 밸리드 패딩 / 풀링 )

반응형

 

레이어 (layer)

- 여러 개의 논리적인 개체가 을 이루어서 하나의 물체를 구성하는 것

- Linear 레이어는 선형 변환을 활용해 데이터를 특정 차원으로 변환함.

- Linear 레이어는 입력의 차원, 출력의 차원에 해당하는 가중치(Weight)를 가짐.

- 가중치(Weight)의 모든 요소를 파라미터라고 함.

- 지나치게 많은 파라미터는 오버피팅을 야기함.

- Dense클래스 속 use_bias파라미터를 True로 바꿔주면 편향 값을 더해줄 수 있음.

- tf.keras.layers.Layer.count_params(): 총 파라미터 개수를 출력함.

import tensorflow as tf

batch_size = 64

boxes = tf.zeros((batch_size, 4, 2)) # Tensorflow는 Batch를 기반으로 동작함.

first_linear = tf.keras.layers.Dense(units=1, use_bias=False) # units은 출력 차원 수를 의미함.

first_out = first_linear(boxes)

first_out = tf.squeeze(first_out, axis=-1) # (4, 1)을 (4,)로 변환해줌. (차원 축소)


Convolution

- 이미지를 필터로 훑으며 각 픽셀을 곱하여 더함.

- 이미지와 필터가 겹치는 부분의 값을 서로 곱한 후 그 값을 모두 더하면 새로운 이미지의 한 픽셀값이 됨.

- [ 필터의 개수 x 필터의 가로 x 필터의 세로 ] 로 이루어진 가중치(Weight)를 가짐.

- 필터 사이즈를 키우면 파라미터 사이즈 및 연산량이 커지며, Accuracy도 떨어지게 될 가능성이 높음.

- 입력 데이터의 수용 영역(Receptive Field)이 충분히 커야 정확한 탐지(detection)가 가능함.

- Max Pooling 레이어를 통해 효과적으로 수용 영역을 키우고, 정보 집약 효과를 극대화할 수 있음.

- dialted convolutions은 수용 영역(receptive field)을 효율적으로 넓힐 수 있으며, pooling이후 unpooling 할 때 해상도를 높일 수 있음.

import tensorflow as tf

batch_size = 64

pic = tf.zeros((batch_size, 1920, 1080, 3))

conv_layer = tf.keras.layers.Conv2D(filters=16,

kernel_size=(5, 5),

strides=5,

use_bias=False)

conv_out = conv_layer(pic)

flatten_out = tf.keras.layers.Flatten()(conv_out)


Deconvolution

- Convolution의 결과를 역재생해 원본 이미지와 최대한 유사한 정보를 복원해냄.

1. 패키지 임포트 및 MNIST 데이터셋 로딩

2. AutoEncoder 모델 구성

3. AutoEncoder 모델 훈련

4. AutoEncoder 복원 테스트

1. 패키지 임포트 및 MNIST 데이터셋 로딩

import numpy as np

from tensorflow.keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D

from tensorflow.keras.models import Model

from tensorflow.keras.datasets import mnist

import json

import matplotlib.pyplot as plt

# MNIST 데이터 로딩

(x_train, _), (x_test, _) = mnist.load_data() # x_train자신이 라벨이 됨.

x_train = np.expand_dims(x_train, axis=3)

x_test = np.expand_dims(x_test, axis=3)

x_train = x_train.astype('float32') / 255.

x_test = x_test.astype('float32') / 255.

2. AutoEncoder 모델 구성

# Input 부분

input_shape = x_train.shape[1:]

input_img = Input(shape = input_shape)

# Encoder 부분

encode_conv_layer_1 = Conv2D(16, (3, 3), activation='relu', padding='same')

encode_pool_layer_1 = MaxPooling2D​((2, 2), padding='same')

# Decoder 부분

decode_conv_layer_1 = Conv2D(4, (3, 3), activation='relu', padding='same')

decode_upsample_layer_1 = UpSampling2D((2, 2))

-------------------------------------------

# Conv2DTranspose를 활용한 모델

from tensorflow.keras.layers import Conv2DTranspose

decode_conv_layer_1 = Conv2DTranspose(4, (3, 3), activation='relu', padding='same')

decode_upsample_layer_1 = UpSampling2D((2, 2))

3. AutoEncoder 모델 훈련

autoencoder.compile( optimizer='adadelta', loss='binary_crossentropy')

autoencoder.fit(x_train, x_train,

epochs=2,

batch_size=256,

shuffle=True,

validation_data=(x_test, x_test))

4. AutoEncoder 복원 테스트

x_test_10 = x_test[:10]

x_test_hat = autoencoder.predict(x_test_10) # AutoEncoder 모델의 이미지 복원생성

x_test_imgs = x_test_10.reshape(-1, 28, 28)

x_test_hat_imgs = x_test_hat.reshape(-1, 28, 28)


Upsampling의 종류

- Nearest Neighbor : 복원해야 할 값을 가까운 값으로 복제함. (디폴트)

- Bed of Nails : 복원해야 할 값을 0으로 처리한다.

- Max Unpooling : Max Pooling 때 버린 값을 실은 따로 기억해 두었다가 그 값으로 복원함.

 


 

합성곱 신경망 (Convolution Neural Network)

- 이미지 처리분야에서 뛰어난 성능을 발휘함.

- 합성곱은 입력데이터의 일부에 가중치를 적용해나감.

- 이동하면서 동일한 필터(= 커널 = 가중치 도장 = 뉴런)를 적용함.

- 특성맵(feauture map)​: 합성곱 계산을 통해 얻은 출력

- ​입력 -> 필터(커널) -> 특성맵

- 합성곱층(Conv2D)에서 특성맵을 생성하고, 풀링층(MaxPool2D)에서 크기를 줄이는 구조가 쌍을 이룸.


세임 패딩 (same padding)

- 입력특성맵의 크기를 동일하게 만들기 위해 입력 주위에 0으로 가상의 원소를 채우는 것

- 이미지의 모서리에 있는 정보를 잃어버리지 않도록 해줌.

- .Conv2D( 필터 개수, kernel_size=(3, 3), activation = 'relu' , padding = 'same' )


 

밸리드 패딩 (valid padding)

- 패딩없이 순수한 입력배열에서만 합성곱을 하여 특성맵을 만드는 것

- padding매개변수의 디폴트값


풀링 (pooling)

- 특성맵의 너비와 높이를 줄임.

- 특성맵의 개수는 변하지 않고 그대로임.

- 커널에 가중치가 없음. -> 최대 풀링과 평균 풀링을 사용

- 최대(max) 풀링: 도장을 찍은 영역에서 가장 큰값을 고름 / .MaxPooling2D( 풀링의 크기 )

- 평균(average) 풀링: 도장을 찍은 영역에서 평균값을 계산함 / .AveragePooling2D( 풀링의 크기 )

- 풀링의 크기와 스트라이드는 같음. (풀링의 크기가 (2,2)이면 가로세로 2칸씩 겹치지 않고 이동함. -> 특성맵의 크기를 절반으로 줄임.)

반응형