생활코딩/머신러닝야학

Tensorflow - BatchNormalization layer (학습이 잘 되는 모델)

hayjo 2020. 8. 19. 15:26

[강의 출처] opentutorials.org/module/4966/29242

 

부록2: 모델을 위한 팁 - Tensorflow 1

수업소개 BatchNormalization layer를 사용하여 보다 학습이 잘되는 모델을 만들어 봅니다. 강의  소스코드 colab |  backend.ai  보스턴 집값 예측 ########################### # 라이브러리 사용 import tensorflow as

opentutorials.org


 

# 라이브러리 사용 
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) # (506, 13) (506, 1)

# 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')
"""
여러 번 학습을 시켜도 loss 감소 수준이 만족스럽지 못할 때 아래 코드처럼 BatchNormalization 적용
"""

# 2. 모델의 구조를 BatchNormalization layer를 사용하여 만든다.
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')
"""
기존 모델로 1000회 학습시 loss: 20.5985 수준
BatchNormalization 모델로 1000회 학습시 loss: 13.1637 수준
"""
# 라이브러리 사용 
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를 사용하여 만든다.
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 사용에 따라 성능을 비교해보면
기존 모델로 1000회 학습시 loss: 0.0472 - accuracy: 0.9867 수준
BatchNormalization 모델로 batch_size = 150 기준 250회 학습시 loss: 0.0478 - accuracy: 0.9867 수준
epochs을 1000까지 늘리면 loss: 5.8190e-04 - accuracy: 1.0000 수준까지 도달 가능
"""

 

*batch_size: 가중치 갱신(학습의 정확도 체크)를 샘플 몇 개마다 할 지

-다만 메모리가 작을 때는 상대적으로 작게 설정하는 것이 유리함

[참고출처] tykimos.github.io/2017/03/25/Fit_Talk/