IT's 우

생활코딩 머신러닝야학_부록2: 모델을 위한 팁, BatchNormalization layer 본문

생활코딩/머신러닝(텐서플로우(python))

생활코딩 머신러닝야학_부록2: 모델을 위한 팁, BatchNormalization layer

디우 2021. 1. 15. 02:35
728x90

BatchNormalization layer를 사용하여 보다 학습이 잘되는 모델을 만들어보기

 

보스턴 집값 예측
###########################
# 라이브러리 사용


import tensorflow as tf
import pandas as pd

 

###########################
# 1.과거의 데이터를 준비합니다.


파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/boston.csv'
보스턴 = pd.read_csv(파일경로)

# 종속변수, 독립변수
독립 = 보스턴[['crim', 'zn', 'indus', 'chas', 'nox',
'rm', 'age', 'dis', 'rad', 'tax',
'ptratio', 'b', 'lstat']]
종속 = 보스턴[['medv']]
print(독립.shape, 종속.shape)

 

###########################
# 2. 모델의 구조를 만듭니다
X = tf.keras.layers.Input(shape=[13])
H = tf.keras.layers.Dense(8, activation='swish')(X)
H = tf.keras.layers.Dense(8, activation='swish')(H)
H = tf.keras.layers.Dense(8, activation='swish')(H)
Y = tf.keras.layers.Dense(1)(H)
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse')

 

# 2. 모델의 구조를 BatchNormalization layer를 사용하여 만든다. 위 모델의 구조와 비교해보자.

히든레이어를  Dense레이어와 Activation레이어로 분리하여 그 사이에 BatchNormalization 레이어를 배치하는 것이 효과가 좋다!!!!

 

X = tf.keras.layers.Input(shape=[13])

H = tf.keras.layers.Dense(8)(X)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('swish')(H)

H = tf.keras.layers.Dense(8)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('swish')(H)

H = tf.keras.layers.Dense(8)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('swish')(H)

Y = tf.keras.layers.Dense(1)(H)
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse')

###########################

 

# 3.데이터로 모델을 학습(FIT)합니다.
model.fit(독립, 종속, epochs=1000)

 

 

분류모델에 BatchNormalization layer 사용해보기
아이리스 품종 분류


###########################
# 라이브러리 사용
import tensorflow as tf
import pandas as pd

###########################

 

# 1.과거의 데이터를 준비합니다.


파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv'
아이리스 = pd.read_csv(파일경로)

 

# 원핫인코딩


아이리스 = pd.get_dummies(아이리스)

# 종속변수, 독립변수
독립 = 아이리스[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = 아이리스[['품종_setosa', '품종_versicolor', '품종_virginica']]
print(독립.shape, 종속.shape)

 

###########################
# 2. 모델의 구조를 만듭니다
X = tf.keras.layers.Input(shape=[4])
H = tf.keras.layers.Dense(8, activation='swish')(X)
H = tf.keras.layers.Dense(8, activation='swish')(H)
H = tf.keras.layers.Dense(8, activation='swish')(H)
Y = tf.keras.layers.Dense(3, activation='softmax')(H)
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy',
metrics='accuracy')

 

###########################


# 2. 모델의 구조를 BatchNormalization layer를 사용하여 만든다.

마찬가지로 히든레이어를  Dense레이어와 Activation레이어로 분리하여 그 사이에 BatchNormalization 레이어를 생성한다.

 

X = tf.keras.layers.Input(shape=[4])

H = tf.keras.layers.Dense(8)(X)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('swish')(H)

H = tf.keras.layers.Dense(8)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('swish')(H)

H = tf.keras.layers.Dense(8)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('swish')(H)

Y = tf.keras.layers.Dense(3, activation='softmax')(H)
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy',
metrics='accuracy')

###########################
# 3.데이터로 모델을 학습(FIT)합니다.
model.fit(독립, 종속, epochs=1000)

 

출처: 생활코딩

◎Batch Normalization

출처:excelsior-cjh.tistory.com/178

배치 정규화라고 하는데, 배치 정규화는 각 층의 활성화 함수의 출력값 분포가 골고루 분포되도록 '강제'하는 방법으로, 각 층에서의 활성화 함수 출력값이 정규분포(normaldistribution)를 이루도록 하는 방법이다.

즉, 학습하는 동안 이전 레이어에서의 가중치 매개변수가 변함에 따라 활성화 함수 출력값의 분포가 변화하는 내부 공변량변화(Internal Covariate Shift) 문제를 줄이는 방법이 바로 Batch Noarmalization이다. 

 

 

728x90
반응형