` 1

이 글에는 즉시실행, Estimator, pipeline이 포함됩니다.

print(tf.__version__)
print(keras.__version__)

2.0.0-alpha0
2.2.4-tf

사용한 버전은 다음과 같습니다.

케라스는 Sequential을 사용하여 층을 차례대로 쌓습니다.  tf.keras.Sequential

 

층 설정

 

tf.keras.layers 에 있는 클래스는 공통으로 몇가지 매개변수를 가지고 있습니다.

- activation : default는 활성화 함수를 지정하지 않습니다.

- kernel_initializer / bias_initializer : default 는 'glorot_uniform' 입니다.

- kernel_regularizer / bias_regularizer : defualt는 규제를 적용하지 않습니다.

 

다음은 여러가지 매개변수를 사용한 Dense층 객체 예시입니다.

 # 시그모이드 활성화
layers.Dense(64, activation='sigmoid')
# 위와 같은 문장입니다.
layers.Dense(64, activation = tf.keras.activations.sigmoid)

# 규제항 추가 입니다.
layers.Dense(64, kernel_regularizer=tf.keras.regularizers.l1(0.01))
layers.Dense(64, bias_regularizer=tf.keras.regularizers.l2(0.01))

# 커널을 랜덤한 직교 행렬로 초기화한 층입니다.
layers.Dense(64, kernel_initializer='orthogonal')

# 절편 벡터를 상수 2.0으로 설정
layers.Dense(64, bias_initializer=tf.keras.initializers.Constant(2.0))

 

훈련과 평가

훈련 준비

Sequential과 같은 메서드로 층을 구성한 뒤 compile 메서드를 호출하여 학습 과정을 설명합니다. 밑의 코드를 보면 배열 형태로 층을 쌓듯이 앞에서부터 쌓아주는 것을 볼 수 있습니다. 

model = tf.keras.Sequential([
# 64개의 유닛을 가진 완전 연결 층을 모델에 추가합니다:
layers.Dense(64, activation='relu', input_shape=(32,)),
# 또 하나를 추가합니다:
layers.Dense(64, activation='relu'),
# 10개의 출력 유닛을 가진 소프트맥스 층을 추가합니다:
layers.Dense(10, activation='softmax')])

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

tf.keras.Model.compile에는 세 개의 중요한 매개변수가 있습니다.

-    optimizer : tf.keras.optimizers.Adam(SGD)와 같은 tf.keras.optimizers 아래의 옵티마이저 객체를 전달합니다. 'adam', 'sgd'처럼 문자열로 지정할 수도 있습니다.

-    loss : mse, categorical_crossentropy, binary_crossentropy 등이 자주 사용됩니다. 손실 함수를 커스터마이즈할 수 있으며, tf.keras.losses 모듈 아래의 객체를 전달합니다.

-    metrics : tf.keras.metrics 모듈을 사용합니다.

- 더하여서 훈련과 평가를 즉시 실행하려면 run_eagerly=True 매개변수를 전달할 수 있습니다.

다음은 훈련의 예시입니다. 

# 평균 제곱 오차로 회귀 모델을 설정합니다.
model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
              loss='mse',       # 평균 제곱 오차
              metrics=['mae'])  # 평균 절댓값 오차

# 크로스엔트로피 손실 함수로 분류 모델을 설정합니다.
model.compile(optimizer=tf.keras.optimizers.RMSprop(0.01),
              loss=tf.keras.losses.CategoricalCrossentropy(),
              metrics=[tf.keras.metrics.CategoricalAccuracy()])

 

Numpy 데이터를 사용한 훈련

데이터 셋이 작은 경우엔 numpy 배열을 메모리에 적재하여 모델을 훈련하고 평가할 수 있습니다.

 

import numpy as np

data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))

model.fit(data, labels, epochs=10, batch_size=32)

tf.keras.Model.fit 에는 세 개의 중요한 매개변수가 있습니다.

-    epochs : 전체 입력 데이터를 얼마나 순회할 것인가

-    batch_size : 데이터를 작은 배치로 나누어서 순회합니다.

-    validation_data : (x_val, y_val) 형태로 넣어주어야 합니다.

 

다음은 validation_data를 사용하는 예입니다.

 import numpy as np

data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))

val_data = np.random.random((100, 32))
val_labels = np.random.random((100, 10))

model.fit(data, labels, epochs=10, batch_size=32,
          validation_data=(val_data, val_labels))

 

tf.data 데이터셋을 사용한 훈련

tf.data는 대규모 데이터셋이나 분산 작업을 할때 사용하면 훨씬 빠르고 편리합니다. fit 메서드에 tf.data.Dataset 객체를 전달합니다.

# 예제 `Dataset` 객체를 만듭니다:
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)

# Dataset에서 `fit` 메서드를 호출할 때 `steps_per_epoch` 설정을 잊지 마세요.
model.fit(dataset, epochs=10, steps_per_epoch=30)

여기서 fit 메서드는 steps_per_epoch 매개변수를 사용합니다. 

다음 에포크로 넘어가기 전에 모델이 수행할 훈련 단계 횟수입니다.

! 이 예제가 완벽히 돌아가지 않습니다. steps_per_ecoch이 가진 데이터의 양에 비해 너무 크기 때문이죠. 이 예제가 끝까지 완성되는 것을 보고 싶다면 적어도 (10 * 30)개의 배치가 필요합니다. 하지만 1000개의 데이터에서 32개의 데이터를 가진 배치가 300개가 만들어지지 않으니 깔끔하게 끝까지 돌아가지진 않겠죠? 

Dataset.batch를 이용하여 배치 데이터를 생성하기 때문에 batch_size가 필요하지 않습니다.

Dataset은 검증 데이터에도 사용할 수 있습니다.

dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)

val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_labels))
val_dataset = val_dataset.batch(32)

model.fit(dataset, epochs=10,
          validation_data=val_dataset)

 

평가와 예측

tf.keras.Model.evaluate 와 tf.keras.Model.predict 메서드에는 넘파이 배열이나 tf.data.Dataset을 사용할 수 있습니다.

data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))

model.evaluate(data, labels, batch_size=32)

model.evaluate(dataset, steps=30)
result = model.predict(data, batch_size=32)
print(result.shape)