본문 바로가기

Programming/Python

[Python] 딥러닝 학습률 출력을 위한 프로그래스바 구현 (tqdm, custom function)

인공지능 모델을 학습할 때, tqdm을 사용해서 흔히 학습률을 출력해서 확인하고는 합니다. tdqm의 함수를 사용해서 프로그레스 바를 출력해도 좋습니다만, 저희 입맛대로 커스텀해서 프로그래스 바를 구현할 수도 있습니다. 

 

이번에는 인공지능 모델 학습을 위해 세부 정보를 출력하는 pregress bar 구현 방법두 가지 정도 보여드리겠습니다. 

 

for문은 아래 코드를 사용해서 간단하게 표현해 보겠습니다. 학습환경을 간단하게 구현하기 위해서 아래 for문을 사용하겠습니다. 

num_epochs = 5    # 전체 에폭수 정의
for epoch in range(num_epochs):	# epoch for문 
    for i, (images, targets) in enumerate(train_dataloader): # iteration for문
    	loss = 0.05    # 임의로 표현한겁니다.

 

 

✅ 방법 1: tqdm 

제일 흔하게 사용하는 방법입니다. 

pip install tqdm 한 후 import 하여 사용할 수 있습니다. 

pip install tqdm

 

구체적으로 loss와 같은 상세한 정보를 출력하고 싶다면 set_description 함수를 사용해서 text를 설정할 수 있습니다. 

 

from tqdm.notebook import tqdm

num_epochs = 5    # 전체 에폭수 정의
for epoch in range(num_epochs):	# epoch for문 
    train = tqdm(train_dataloader)
    for i, (images, targets) in enumerate(train): # iteration for문
        loss = 0.05
        train.set_description(f"Epoch {epoch}\tloss {loss}")    # score나 loss 등 원하는 글 출력할 수 있읍.

 

정상적으로 출력되는 것을 확인할 수 있습니다. 

 

✅ 방법 2: custom 함수

다음은 직접 구현한 progress bar입니다. 

def progress_learning(epoch, i, total_batches, progress_length=30, print_str=''):
    current = i + 1 # 현재 iteration 수
    percent = round(current / total_batches * 100) 
    step_cnt = int(current * progress_length / total_batches) # progress_length 중에 지금 몇번째 step인지
    
    bar = '=' * step_cnt + ' ' * (progress_length - step_cnt) # step만큼 '=' 출력, 빈 공간은 ' ' 출력
    end_char = '\n' if current == total_batches else '\r'   # 개행문자. 100%일 때는 linefeed, 아닐때는 carriage return
    
    print(f'Epoch {epoch}\t {percent:3d}% [{bar}] {print_str}', end=end_char)

num_epochs = 5    # 전체 에폭수 정의
for epoch in range(num_epochs):	# epoch for문 
    for i, (images, targets) in enumerate(train_dataloader): # iteration for문
        loss = 0.05
        progress_learning(epoch, i, len(train_dataloader), print_str=f'loss {loss}')

 

함수에 사용되는 매개변수는 다음과 같습니다. 

  • epoch: 진행 중인 에폭 수
  • i: 진행중인 iteration 수
  • total_batches: 전체 배치 개수(전체 iteration 수)
  • progress_length: =로 표현할 길이
  • print_str: 추가로 출력할 string

 

저 같은 경우에는 이렇게만 했지만, 직접 원하시는 대로 추가로 수정해서 쓰면 더 좋겠죠?

 


 

저는 다분히 취향에 따라 하트로 바꿔서 수정했습니다 

 

def progress_learning(epoch, i, total_batches, progress_length=20, print_str=''):
    current = i + 1 # 현재 iteration 수
    percent = round(current / total_batches * 100) 
    step_cnt = int(current * progress_length / total_batches) # progress_length 중에 지금 몇번째 step인지
    
    bar = '❤️' * step_cnt + '💙' * (progress_length - step_cnt) # step만큼 '=' 출력, 빈 공간은 ' ' 출력
    end_char = '\n' if current == total_batches else '\r'   # 개행문자. 100%일 때는 linefeed, 아닐때는 carriage return
    
    print(f'Epoch {epoch}\t {percent:3d}% [{bar}] {print_str}', end=end_char)

num_epochs = 5    # 전체 에폭수 정의
for epoch in range(num_epochs):	# epoch for문 
    for i, (images, targets) in enumerate(train_dataloader): # iteration for문
        loss = 0.05
        progress_learning(epoch, i, len(train_dataloader), print_str=f'loss {loss}')
        time.sleep(0.1)

 

위 코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다. 

 

마찬가지로 제가 수정한 대로 정상적으로 출력되는 것을 확인할 수 있습니다.