# 시그모이드 활성화
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)
! 이 예제가 완벽히 돌아가지 않습니다. steps_per_ecoch이 가진 데이터의 양에 비해 너무 크기 때문이죠. 이 예제가 끝까지 완성되는 것을 보고 싶다면 적어도 (10 * 30)개의 배치가 필요합니다. 하지만 1000개의 데이터에서 32개의 데이터를 가진 배치가 300개가 만들어지지 않으니 깔끔하게 끝까지 돌아가지진 않겠죠?
Dataset.batch를 이용하여 배치 데이터를 생성하기 때문에 batch_size가 필요하지 않습니다.