이 글에는 즉시실행, 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)
'# Machine Learning > TensorFlow doc 정리' 카테고리의 다른 글
tensorflow 2.0 keras Training and evaluation (2) (0) | 2019.04.09 |
---|---|
tensorflow 2.0 keras Training and evaluation (1) (0) | 2019.04.08 |
tensorflow 2.0 keras Functional API (2) (0) | 2019.03.30 |
tensorflow 2.0 keras Functional API (1) (0) | 2019.03.29 |
tensorflow 2.0 keras Overview (2) (0) | 2019.03.24 |