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

+ Recent posts