!tensorboard --logdir logs/fit
%load_ext tensorboard
%tensorboard --logdir {'./logs'}
import datetime
# 자신의 규칙에 따라서 잘 정리
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir)
model.fit(x=train_x,
y=train_y,
epochs=5,
validation_data=(test_x, test_y),
callbacks=[tensorboard_callback])
loss_fn = tf.keras.losses.categorical_crossentropy
train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.CategoricalAccuracy(name='train_accuracy')
test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.CategoricalAccuracy(name='test_accuracy')
@tf.function
def train_step(x, y) :
with tf.GradientTape() as tape:
pred = model(x)
loss = loss_fn(y, pred)
gradients = tape.gradient(loss, model.trainable_variables)
opt.apply_gradients(zip(gradients, model.trainable_variables))
train_loss(loss)
train_accuracy(y, pred)
@tf.function
def test_step(x, y) :
pred = model(x)
loss = loss_fn(y, pred)
test_loss(loss)
test_accuracy(y, pred)
current_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
train_log_dir = 'logs/gradient_tape/' + current_time + '/train'
test_log_dir = 'logs/gradient_tape/' + current_time + '/test'
train_summary_writer = tf.summary.create_file_writer(train_log_dir)
test_summary_writer = tf.summary.create_file_writer(test_log_dir)
batch_size = 64
num_of_batch_train = train_x.shape[0] // batch_size
num_of_batch_test = test_x.shape[0] // batch_size
for epoch in range(5):
for i in range(num_of_batch_train):
idx = i * batch_size
x, y = train_x[idx:idx+batch_size], train_y[idx:idx+batch_size]
train_step(x, y)
print("\r Train : {} / {}".format(i, num_of_batch_train), end='\r')
for i in range(num_of_batch_test):
idx = i * batch_size
x, y = test_x[idx:idx+batch_size], test_y[idx:idx+batch_size]
test_step(x, y)
print("\r Test : {} / {}".format(i, num_of_batch_test), end='\r')
with train_summary_writer.as_default():
tf.summary.scalar('loss', train_loss.result(), step=epoch)
tf.summary.scalar('acc', train_accuracy.result(), step=epoch)
with test_summary_writer.as_default():
tf.summary.scalar('loss', test_loss.result(), step=epoch)
tf.summary.scalar('acc', test_accuracy.result(), step=epoch)
fmt = 'epoch {} loss: {}, accuracy: {}, test_loss: {}, test_acc: {}'
print(fmt.format(epoch+1,
train_loss.result(),
train_accuracy.result(),
test_loss.result(),
test_accuracy.result()
)
)
#매 epoch마다 reset
train_loss.reset_states()
test_loss.reset_states()
train_accuracy.reset_states()
test_accuracy.reset_states()
logdir = "logs/train_data/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer = tf.summary.create_file_writer(logdir)
for i in np.random.randint(10000, size=10):
# img를 그리기 위해서는 차원을 줄이면 안된다.
img = train_x[i:i+1]
with file_writer.as_default():
# 개별적인 이미지를 보기때문에 step=0
tf.summary.image("Training Sample data : {}".format(i), img, step=0)
import io
from sklearn.metrics import confusion_matrix
def plot_to_image(figure): # plot의 figure를 이미지로
buf = io.BytesIO()
plt.savefig(buf, format='png')
plt.close(figure)
buf.seek(0)
image = tf.image.decode_png(buf.getvalue(), channels=4)
image = tf.expand_dims(image, 0)
return image
def plot_confusion_matrix(cm, class_names): #figure를 시각화
figure = plt.figure(figsize=(8, 8))
plt.imshow(cm)
plt.title("Confusion matrix")
plt.colorbar()
tick_marks = np.arange(len(class_names))
threshold = cm.max() / 2.
for i in range(cm.shape[0]):
for j in range(cm.shape[1]):
color = "white" if cm[i, j] > threshold else "black"
plt.text(j, i, cm[i, j], horizontalalignment="center", color=color)
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
return figure
logdir = "logs/fit/cm/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer_cm = tf.summary.create_file_writer(logdir)
test_images = test_x[:100]
test_labels = np.argmax(test_y[:100], axis=1)
def log_confusion_matrix(epoch, logs):
test_pred_raw = model.predict(test_images)
test_pred = np.argmax(test_pred_raw, axis=1)
classes = np.arange(10)
cm = confusion_matrix(test_labels, test_pred, labels=classes)
figure = plot_confusion_matrix(cm, class_names=classes)
cm_image = plot_to_image(figure)
with file_writer_cm.as_default():
tf.summary.image("Confusion Matrix", cm_image, step=epoch)
cm_callback = tf.keras.callbacks.LambdaCallback(on_epoch_end=log_confusion_matrix)
model.fit(x=train_x,
y=train_y,
epochs=5,
batch_size=32,
validation_data=(test_x, test_y),
callbacks=[tensorboard_callback, cm_callback])
Reference
1) 제로베이스 데이터스쿨 강의자료