[Visualization] keras 결과물(history) 시각화하는 함수

2020. 11. 21. 20:30분석 Python/Visualization

728x90

keras를 사용하면 쉽게 결과물들을 저장을 할 수 있다.

이런 식으로 metrics에 제공하는 함수나, 함수를 만들면 fitting 할 때 저 부분들에 대해서 epoch 마다 저장을 해준다.

model.compile(loss = keras.losses.BinaryCrossentropy(label_smoothing = 0.0),
              optimizer = adam, metrics =['accuracy',get_f1])

실제로 fit을 하게 됬을 때, validation_data를 넣으면 `val_accuracy` 와 `val_get_f1` 형태로 저장이 된다.

history = model.fit(train, 
                    train_y,
                    validation_data=(valid, valid_y),       
                   )

다음과 같이 dict 형태로 저장이 된다.

history.history.keys()
## dict_keys(['loss', 'accuracy', 'get_f1', 'val_loss', 'val_accuracy', 'val_get_f1'])

형태를 보면, 규칙이 있는 것을 알 수 있다.

train 결과는 loss , accuracy , get_f1 / valid 결과는 val_loss , val_accuracy , val_get_f1

 

그래서 다음 결과를 얻게되면 시각화하는 함수를 공유한다.

def vis(history,name) :
    plt.title(f"{name.upper()}")
    plt.xlabel('epochs')
    plt.ylabel(f"{name.lower()}")
    value = history.history.get(name)
    val_value = history.history.get(f"val_{name}",None)
    epochs = range(1, len(value)+1)
    plt.plot(epochs, value, 'b-', label=f'training {name}')
    if val_value is not None :
        plt.plot(epochs, val_value, 'r:', label=f'validation {name}')
    plt.legend(loc='upper center', bbox_to_anchor=(0.05, 1.2) , fontsize=10 , ncol=1)
    
def plot_history(history) :
    key_value = list(set([i.split("val_")[-1] for i in list(history.history.keys())]))
    plt.figure(figsize=(12, 4))
    for idx , key in enumerate(key_value) :
        plt.subplot(1, len(key_value), idx+1)
        vis(history, key)
    plt.tight_layout()
    plt.show()

 

사용법은 아주 간단하다

이걸 시행하면, validation 이 있는 경우에는 같이 보여주고, 없는 경우에는 training만 보여준다. 

plot_history(history)

728x90