1. 설치
2. 코드 run
3. 서버 사용시 터미널 창에 아래 명령어 입력
- tensorboard를 사용하면 코드를 돌리는 폴더에 runs 폴더가 생성되고, 그 안에 log들이 저장된다.
- 해당 코드의 path에 들어가서 "tensorboard --logdir runs" 입력
4. local에서 3번 결과에 나오는 주소로 접근(default port : 6006)
- http://서버주소:default_port/ 로 접근 가능
5. tensorboard에 출력할 변수 코드에 삽입
from tensorboardX import SummaryWriter
writer = SummaryWriter()
5-1. add_scalars
- writer.add_scalars('변수그룹이름/변수이름', 변수, epoch)
- tensorboard의 scalar에 '변수그룹이름' 그룹이 생기고, 그 안에 '변수이름'으로 그래프가 저장됨
- 예를 들어 loss를 실시간으로 출력하고 싶으면, "writer.add_scalars('loss/L1_loss', 0.2, 13)"
- scalar에 loss라는 그룹이 생기고, 그 그룹 안에 L1_loss 변수가 그래프로 그려진다.
- loss가 여러 개이고, 한 그래프에 여러 개의 loss를 동시에 표현하고 싶다면
- "writer.add_scalars('loss/L1+L2_loss', {'L1' : 'L1 loss 변수', 'L2' : 'L2 loss 변수', 13})
- scalar/loss 에서 한 그래프에 L1, L2 loss의 변수들이 같이 plot 된다.
- 마지막에 입력한 epoch은 그래프의 상단에 출력되서 몇 번째 epoch에 plot 되었는지 확인할 수 있다.
5-2. add_image
5-2-1. torch tensor 이미지 tensorboard/test/torch_image로 보내기
: torch tensor는 (channel, 가로, 세로) 차원의 형식이어야 한다.
x = torch.rand(3, 64, 64)
writer.add_image('test/bulk_image', x, n_iter)
5-2-2. numpy 행렬도 이미지로 보낼 수 있음
x = np.zeros((3, 64, 64))
writer.add_image('test/numpy_image', x, n_iter)
5-2-3. 여러 이미지를 하나로 합쳐서 보내기
: vutils.make_grid를 이용
x = torch.rand(10, 3, 64, 64)
x = vutils.make_grid(x, normalize=True, scale_each=True)
writer.add_image('test/bulk_image', x, n_iter)
5-3. add_text
writer.add_text('Text', 'text logged at step:' + str(n_iter), n_iter)
5-4. add_audio
writer.add_audio('myAudio', dummy_audio, n_iter, sample_rate=sample_rate)
5-5. 학습 파라미터 체크
if epoch % 10 == 0:
for name, param in resnet18.named_parameters():
writer.add_histogram(name, param.clone().cpu().data.numpy(), n_iter)
5-6. add_embedding
: images는 MNIST 데이터로 100개의 이미지 (100, 28, 28)이다.
: unsqueeze(1) 하여 (100, 1, 28, 28)로 만들어서 label_img에 넣는다.
: metadata는 이 이미지의 label 이다.
: 28*28을 784로 펼쳐서 tensorboard에 넘겨주면 된다.
images = dataset.test_data[:100].float()
label = dataset.test_labels[:100]
features = images.view(100, 784)
writer.add_embedding(features, metadata=label, label_img=images.unsqueeze(1))
5-7. add_pr_curve
: pr_curve는 precision-recall curve로 매 시간마다 이를 뿌려준다.
: pr_curve는 precision과 recall의 trade-off 관계
writer.add_pr_curve('xoxo', np.random.randint(2, size=100), np.random.rand(100), n_iter)
5-8. scalar 값 json으로 export 하기
: 코드가 다 돌고 난 후, export_scalars_to_json('경로') 함수를 이용하여 loss, 변수들을 모두 저장할 수 있음
: writer.close()를 이용하여 종료
writer.export_scalars_to_json("./all_scalars.json")
writer.close()
-----------------------------------------------------------------------------------------------------------------------------------
학습 코드 상단부에 SummaryWriter를 정의
from tensorboardX import SummaryWriter
summary = SummaryWriter()
- 모델 학습 과정에서 tensorboard에 plot할 값들에 대한 x축으로 사용할 값이 필요
: iteration 변수 설정
: 전체 학습 loop에 대해 tensorboard 에서 x축으로 사용할 변수(iteration)는 epoch이 변해도 초기화되지 않고 이어서 커져야 함
- 변수 설정 후, 학습 loop에서 매 iteration마다 값을 update하면 실효성도 떨어지고, 너무 데이터가 많아진다.
: 따라서 적절하게 10 iter 나 20 iter 마다 값을 update한다.
- pytorch tensor에 담긴 loss 값은 값의 형태로 전달되도록 tensor_name.item() 멤버를 이용하여 리턴받음
from tensorboardX import SummaryWriter
summary = SummaryWriter()
for iteration in range(start_iter, max_iter):
out = net(input)
loss_a, loss_b = criterion(out)
loss = loss_a, loss_b
loss.backward()
optimizer.step()
if iteration % 10 == 0:
summary.add_scalar('loss/loss_a', loss_a.item(), iteration)
summary.add_scalar('loss/loss_b', loss_b.item(), iteration)
summary.add_scalar('learning_rate', lr, iteration)
summary.add_scalar('loss/loss', {"loss_a" : loss_a.item(),
"loss_b" : loss_b.item(),
"loss" : lsss.item()}, iteration)
Tensorboard 실행
- "tensorboard --logdir=directory_to_log_file"
: 보통 log 파일은 별도의 설정이 없다면 해당 코드를 실행시킨 폴더에 "runs" 폴더가 생성되고, 그 안에 해당 시점 이름의 폴더에 저장된다.
: 특정 위치로 log가 저장되게 하고 싶다면 "summary = SummaryWriter(dir_to_log_file)" 의 dir_to_log_file에 저장되게 할 수 있음
- 한 번에 두 개의 학습이 돌아가고 있는 경우, 별도 port를 설정해야 함
: "tensorboard --logdir=directory_to_log_file --port=8008" 또는 "--port=6006"
: tensorboard의 기본 port 번호는 6006
- 실행 후 생성되는 인터넷 주소를 복사하여 웹 브라우저에 넣으면 그래프를 확인할 수 있음
: 형식은 username:port으로 주소가 생성됨
- 종료의 경우 tensorboard를 실행시킨 터미널에서 ctrl+c로 종료
*학습을 끊었다가 이어서 하게 되는 경우
- 메인 코드에서 summary = SummaryWriter(dir_to_log_file) 에서 dir_to_log_file 의 주소를 이전 log가 존재하던 위치로 설정해주면 알아서 이어서 그래프를 plot 해준다.
'스타트업 > AI' 카테고리의 다른 글
[AI] Tensorboard 해석하기 (0) | 2020.07.09 |
---|---|
[AI] jupyter notebook tensorboard, proxy (0) | 2020.07.09 |
[AI] TF-IDF (0) | 2020.07.08 |
[AI] TensorBoard (0) | 2020.07.07 |
[AI] mmdetection transfer learning (0) | 2020.07.06 |