Callback 기반 Loggingfit() 함수 내 callback 파라미터를 활용하여 편리하게 로그를 기록할 수 있음import tensorflow as tf
import datetime
# 데이터 준비
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
# 모델 정의 (Sequential API)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 로그 디렉토리 명시
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tb = tf.keras.callbacks.TensorBoard(
log_dir=log_dir, # 디렉토리
histogram_freq=1, # 1 에포크마다 히스토그램 데이터 기록
)
# 모델 학습
model.fit(
x_train,
y_train,
epochs=10,
batch_size=256,
validation_data=(x_test, y_test),
callbacks=[tb], # 리스트 내 callback 명시
)
Summary 기반 Loggingtf.summary 클래스를 이용하여 사용자가 직접 로그를 기록하는 방식으로, 보다 세밀한 커스터마이징이 가능함compile(), fit()과 함께 사용하기 어려우므로 수동 컴파일, 학습 단계를 구현한 다음 필요한 부분에 로그 기록 코드를 넣어 사용함import tensorflow as tf
import datetime
# 데이터 준비
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
# 로그 디렉토리 설정
log_dir = "logs/summary/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer = tf.summary.create_file_writer(log_dir)
# 모델 정의 (Subclassing API)
class CustomModel(tf.keras.Model):
def __init__(self):
super(CustomModel, self).__init__()
self.flatten = tf.keras.layers.Flatten(input_shape=(28, 28))
self.dense1 = tf.keras.layers.Dense(128, activation='relu')
self.dropout = tf.keras.layers.Dropout(0.2)
self.dense2 = tf.keras.layers.Dense(10, activation='softmax')
def call(self, inputs):
x = self.flatten(inputs)
x = self.dense1(x)
x = self.dropout(x)
return self.dense2(x)
model = CustomModel()
# 수동 컴파일
loss_object = tf.keras.losses.SparseCategoricalCrossentropy()
optimizer = tf.keras.optimizers.Adam()
train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')
test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')
# 수동 학습
@tf.function
def train_step(images, labels):
with tf.GradientTape() as tape:
predictions = model(images)
loss = loss_object(labels, predictions)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
train_loss(loss)
train_accuracy(labels, predictions)
@tf.function
def test_step(images, labels):
predictions = model(images)
t_loss = loss_object(labels, predictions)
test_loss(t_loss)
test_accuracy(labels, predictions)
# epoch, batch_size 정의
EPOCHS = 10
BATCH_SIZE = 256
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(BATCH_SIZE)
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(BATCH_SIZE)
for epoch in range(EPOCHS):
# 학습 데이터
for images, labels in train_dataset:
train_step(images, labels)
# 검증 데이터
for test_images, test_labels in test_dataset:
test_step(test_images, test_labels)
# 로그 기록
with file_writer.as_default():
tf.summary.scalar('Train Loss', train_loss.result(), step=epoch)
tf.summary.scalar('Train Acc.', train_accuracy.result(), step=epoch)
tf.summary.scalar('Test Loss', test_loss.result(), step=epoch)
tf.summary.scalar('Test Acc.', test_accuracy.result(), step=epoch)
# 결과 출력
print(f'Epoch {epoch + 1}, '
f'Train Loss: {train_loss.result()}, '
f'Tran Acc.: {train_accuracy.result() * 100}, '
f'Test Loss: {test_loss.result()}, '
f'Test Acc.: {test_accuracy.result() * 100}')
# metric 초기화
train_loss.reset_state()
train_accuracy.reset_state()
test_loss.reset_state()
test_accuracy.reset_state()
tensorboard --logdir=logs # --logdir={로그 디렉토리}
http://localhost:6006에 접속해 시각화 정보 확인
*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.