Tensorflow fit 함수

이재경·2023년 1월 9일
0

인공지능

목록 보기
6/14

fit함수 채워넣기

tensorflow의 fit 함수는 학습을 진행하는 과정을 다루는 가장 중요한 함수입니다. 이번 실습에서는 fit 함수의 매개변수들을 채워 넣으면서 학습 과정을 조절해보겠습니다. 지시사항에 적힌 조건을 참고하여 fit 함수를 완성하세요.

지시사항
아래 매개변수의 설명을 참고하여 fit 함수를 완성하고 학습을 진행하세요.

학습과정
학습 데이터는 x_train 과 y_train을 사용합니다.
batch의 크기는 100으로 설정합니다.
학습은 11epoch부터 시작하여 20 epoch까지 학습합니다.
학습 과정의 출력은 진행바를 표시하지 않지만, 수치정보는 표시합니다.
학습 데이터의 순서는 섞지 않습니다.
검증과정
검증 데이터는 x_val, y_val을 사용합니다.
검증 과정의 batch_size는 50, step은 10으로 설정합니다.
검증 과정은5 epoch마다 수행합니다.

import tensorflow as tf
import numpy as np
from tensorflow.keras import layers

np.random.seed(100)
def generate_data(batch_size, n_steps):
    freq1, freq2, offsets1, offsets2 = np.random.rand(4,batch_size,1)
    time = np.linspace(0, 1, n_steps)
    series = 0.5 * np.sin((time - offsets1)*(freq1 * 10 + 10))
    series += 0.1 * np.sin((time - offsets2)*(freq2 * 10 + 10))
    series += 0.1 * (np.random.rand(batch_size,n_steps) - 0.5)
    return series[...,np.newaxis].astype(np.float32)

def make_model(n_step):
    model = tf.keras.models.Sequential()
    model.add(layers.Flatten(input_shape= [n_step,]))
    model.add(layers.Dense(1))
    model.compile(optimizer = 'adam', loss = 'mse')
    return model

n_step = 50
series = generate_data(10000, n_step +1)
x_train, y_train = series[:7000, :n_step],series[:7000,-1]
x_val, y_val = series[7000:9000, :n_step],series[7000:9000,-1]
x_test, y_test = series[9000:, :n_step],series[9000:,-1]

# 모델 구성
fcl_model = make_model(n_step)

# TODO: 지시사항을 보고 fit 함수의 매개변수를 설정하세요
hist=fcl_model.fit(
x=x_train, y=y_train, batch_size=100, epochs=20, verbose=2,shuffle=False,
validation_data=(x_val,y_val),  initial_epoch=10,
validation_steps=10, validation_batch_size=50, validation_freq=5)

사용자 정의 콜백함수

이번 실습에서는 직접 콜백함수를 작성하여 학습과정에 사용해보겠습니다. 지시사항에 따라 3개의 함수를 구현하시면 됩니다.

지시사항
콜백함수는 클래스의 형태로 구현되며 tf.keras.callbacks.Callback를 상속받아 제작합니다.
정의한 콜백함수를 fit 함수에 전달할 때는 클래스가 아닌 클래스의 인스턴스를 생성하여 전달해야 합니다.
fit 함수의 callbacks는 콜백함수들의 리스트를 입력 받습니다. 따라서 생성한 인스턴스를 리스트로 묶어서 전달하세요.
아래 정보에 따라 콜백함수 클래스 MyCallback에 3개의 함수를 추가하세요.
학습이 시작될 때
학습이 시작되면 on_train_begin(self, logs=None) 함수가 호출됩니다.
이 함수가 호출되면 "Train begin"이 출력되도록 코드를 작성하세요
한 epoch이 시작될 때
한 epoch이 시작되면 on_epoch_begin(self, epoch, logs=None) 함수가 호출됩니다.
이 함수가 호출되면 "%depoch begin"가 출력되도록 코드를 작성하세요.
"%d"에는 현재 epoch이 출력되도록 합니다.
한 epoch이 끝날 때
한 epoch이 끝나면 on_epoch_end(self, epoch, logs=None) 함수가 호출됩니다.
이 함수가 호출되면 "%depoch end"가 출력되도록 코드를 작성하세요.
"%d"에는 현재 epoch이 출력되도록 합니다.

import tensorflow as tf
import numpy as np
from tensorflow.keras import layers

np.random.seed(100)
def generate_data(batch_size, n_steps):
    freq1, freq2, offsets1, offsets2 = np.random.rand(4,batch_size,1)
    time = np.linspace(0, 1, n_steps)
    series = 0.5 * np.sin((time - offsets1)*(freq1 * 10 + 10))
    series += 0.1 * np.sin((time - offsets2)*(freq2 * 10 + 10))
    series += 0.1 * (np.random.rand(batch_size,n_steps) - 0.5)
    return series[...,np.newaxis].astype(np.float32)

def make_model(n_step):
    model = tf.keras.models.Sequential()

    model.add(layers.SimpleRNN(20, return_sequences = True, input_shape = [None, 1])) 
    model.add(layers.SimpleRNN(20))
    model.add(layers.Dense(1))

    model.compile(optimizer = 'adam', loss = 'mse')
    return model

n_step = 50
series = generate_data(10000, n_step +1)
x_train, y_train = series[:7000, :n_step],series[:7000,-1]
x_val, y_val = series[7000:9000, :n_step],series[7000:9000,-1]
x_test, y_test = series[9000:, :n_step],series[9000:,-1]

e = 20 # 채점을 위한 구성입니다. 변경하지 마세요

# TODO: 지시사항을 참고하여 콜백함수를 정의하세요
class MyCallback(tf.keras.callbacks.Callback):
    def on_train_begin(self, logs=None):
        print("Train begin")

    def on_epoch_begin(self, epoch, logs=None):
        print("%depoch begin"%epoch)

    def on_epoch_end(self, epoch, logs=None):
        print("%depoch end"%epoch)

def main():        
    deep_rnn = make_model(n_step)
    mc=MyCallback()
    hist=deep_rnn.fit(
    x=x_train, y=y_train, epochs=e,verbose=0,
    validation_data=(x_val, y_val),validation_freq=2,callbacks=[mc]) # TODO: 정의한 콜백함수를 리스트로 묶어 전달하세요

if __name__ == "__main__":
    main()

내장 콜백함수

Tensorflow.keras에 내장된 콜백함수들을 사용하면 학습과정을 컨트롤하는 다양한 기능들을 사용할 수 있습니다. 이번 실습에서는 내장 콜백함수 중 과적합이 일어나기 전에 학습을 멈추는 EarlyStopping과 주기적으로 모델을 저장하는 ModelCheckpoint을 학습 코드에 추가해보겠습니다. 지시사항에 따라 코드를 완성하세요.

지시사항
EarlyStopping
tf.keras.callbacks.EarlyStopping에 정의되어 있습니다.
감시할 monitor 값은 'val_loss'로 설정합니다.
mode는 auto로 설정합니다.
verbose는 결과를 출력하도록 1로 설정합니다.
2번 이상 성능이 개선되지 않으면 멈추도록 patience는 2로 설정합니다.
ModelCheckpoint
tf.keras.callbacks.ModelCheckpoint에 정의되어 있습니다.
filepath는 "./chkpnt/{epoch:04d}.ckpt"로 설정합니다.
monitor는 EarlyStopping 과 같이 검증시 loss값으로 설정합니다.
mode 역시 자동으로 설정되도록 합니다.
verbose는 1로 설정합니다.
가장 좋았던 모델만 저장하도록 save_best_only를 설정하세요
모델의 가중치를 포함한 모델의 모든 정보가 저장되도록 save_weights_only를 설정하세요.
매 epoch마다 저장되도록 save_freq를 설정하세요
fit 함수에 전달
cb_earlystop와 cb_chkpnt를 리스트로 묶어 fit 함수의 callbacks 매개변수로 전달하세요.

import os

import tensorflow as tf
from tensorflow.keras import layers, Sequential, Input
from tensorflow.keras.optimizers import Adam

import numpy as np
import matplotlib.pyplot as plt

SEED = 2021

def load_cifar10_dataset():
    train_X = np.load("./dataset/cifar10_train_X.npy")
    train_y = np.load("./dataset/cifar10_train_y.npy")
    test_X = np.load("./dataset/cifar10_test_X.npy")
    test_y = np.load("./dataset/cifar10_test_y.npy")
    
    train_X, test_X = train_X / 255.0, test_X / 255.0
    
    return train_X, train_y, test_X, test_y

def build_mlp_model(img_shape, num_classes=10):
    model = Sequential()
    model.add(Input(shape=img_shape))
    model.add(layers.Flatten())
    model.add(layers.Dense(2048, activation="relu"))
    model.add(layers.Dense(1024, activation="relu"))
    model.add(layers.Dense(256, activation="relu"))
    model.add(layers.Dense(64, activation="relu"))
    model.add(layers.Dense(num_classes, activation="softmax"))
    return model

# EarlyStopping 콜백함수의 인스턴스를 cb_earlystop에 저장합니다.
# TODO: 지시사항 1을 참고하여 매개변수를 설정하세요
cb_earlystop = tf.keras.callbacks.EarlyStopping( monitor = 'val_loss' , 
                                                 mode = 'auto',
                                                 verbose = 1,
                                                 patience = 2 )
                                                 
# ModelCheckpoint 콜백함수의 인스턴스를 cb_chkpnt 저장합니다.
# TODO: 지시사항 2을 참고하여 매개변수를 설정하세요
cb_chkpnt = tf.keras.callbacks.ModelCheckpoint( filepath = "./chkpnt/{epoch:04d}.ckpt", 
                                             monitor = 'val_loss',
                                             mode = 'auto',  
                                             verbose =1, 
                                             save_best_only =True,
                                             save_weights_only = False,
                                             save_freq = 'epoch' )

def main(epochs=10):
    tf.random.set_seed(SEED)
    np.random.seed(SEED)
    
    train_X, train_y, test_X, test_y = load_cifar10_dataset()
    img_shape = train_X[0].shape

    print(img_shape)

    optimizer = Adam(learning_rate=1e-3)

    mlp_model = build_mlp_model(img_shape)
    
    mlp_model.compile(optimizer=optimizer, loss="sparse_categorical_crossentropy", metrics=["accuracy"])

    hist = mlp_model.fit(train_X, train_y, epochs=epochs, batch_size=64, validation_split=0.2, shuffle=True, verbose=1, callbacks=[cb_earlystop,cb_chkpnt])
    # TODO: cb_earlystop와 cb_chkpnt를 리스트로 묶어 fit 함수의 callbacks 매개변수로 전달하세요.

    return optimizer, hist

if __name__ == "__main__":
    main()

텐서보드 사용하기

이번 실습에서는 모델이 학습하는 동안 텐서보드(Tensorboard)를 이용해 시각화하는 방법을 실습하겠습니다.
모델은 2개의 RNN Layer와 1개의 Dense Layer로 구성되어 있습니다. 지시사항을 보고 코드를 완성하고 Tensorboard를 통해 학습 과정을 분석해보세요.

지시사항
학습에 필요한 모델과 데이터는 스켈레톤 코드를 통해 제공해드립니다. 아래 정보들을 참고하여 콜백함수를 정의하고 fit 함수에 전달하세요.

텐서보드 콜백함수 정의
텐서보드 콜백함수는 tf.keras.callbacks.TensorBoard입니다.
log_dir은 logs로 설정합니다.
텐서보드 콜백함수를 정의하여 tb에 저장하세요
fit 함수에 사용
위에서 정의한 콜백함수 tb를 callbacks로 전달하세요
callbacks는 콜백함수들을 전달하는 매개변수입니다. 따라서 정의한 콜백함수를 리스트로 묶어서 전달해야 합니다.
fit 함수의 다른 값은 변경하지 않도록 주의하세요.

import tensorflow as tf
import numpy as np
from tensorflow.keras import layers


np.random.seed(100)
def generate_data(batch_size, n_steps):
    freq1, freq2, offsets1, offsets2 = np.random.rand(4,batch_size,1)
    time = np.linspace(0, 1, n_steps)
    series = 0.5 * np.sin((time - offsets1)*(freq1 * 10 + 10))
    series += 0.1 * np.sin((time - offsets2)*(freq2 * 10 + 10))
    series += 0.1 * (np.random.rand(batch_size,n_steps) - 0.5)
    return series[...,np.newaxis].astype(np.float32)

def make_model(n_step):
    model = tf.keras.models.Sequential()

    model.add(layers.SimpleRNN(20, return_sequences = True, input_shape = [None, 1])) 
    model.add(layers.SimpleRNN(20))
    model.add(layers.Dense(1))

    model.compile(optimizer = 'adam', loss = 'mse')
    return model

n_step = 50
series = generate_data(10000, n_step +1)
x_train, y_train = series[:7000, :n_step],series[:7000,-1]
x_val, y_val = series[7000:9000, :n_step],series[7000:9000,-1]
x_test, y_test = series[9000:, :n_step],series[9000:,-1]

# TODO: 텐서보드 콜백함수를 정의하여 tb에 저장하세요
tb = tf.keras.callbacks.TensorBoard(log_dir="logs")

e = 20 #제거 혹은 변경 금지
def main():        
    deep_rnn = make_model(n_step)
    hist=deep_rnn.fit(
    x=x_train, y=y_train, epochs=e,
    validation_data=(x_val, y_val),validation_freq=2,callbacks=[tb]) # TODO: 정의한 콜백함수를 리스트로 묶어 전달하세요
if __name__ == "__main__":
    main()
profile
코딩으로 빛나게

0개의 댓글