인공지능 모델을 학습할 때, 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)
위 코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다.
마찬가지로 제가 수정한 대로 정상적으로 출력되는 것을 확인할 수 있습니다.