본문 바로가기

AI/Pytorch

Pytorch visualization #2. TensorboardX 사용법

파이토치를 이용하다가 실시간 visualization을 하기 위해여 visdom을 사용하였다.

하지만......쓰다쓰다 도저히 엉성하고 어설퍼서 tensorboard를 사용하기로 했다.

 그리고 내린 결론은 역시!!!! Tensorboard를 써야겠다!! 는 것이다.

사실 실시간으로 visualize 해야될 필요는 크게 없다. 어차피 그래프 plot 시키게 짜놨으니까.

근데 왜 쓸데없이 계속 이작업을 하고있는지 모르겠다.

본 글에서는 TensorboardX의 설치와 수행방법, 그리고 변수, 이미지, text, pr_curve, json export 등을 다룬다.


Pytorch TensorboardX Tutorial

- 본 블로그 실습코드 : https://github.com/keep-steady/etc_code/blob/master/TensorboardX_with_Pytorch.ipynb

- 공식 사이트 : https://github.com/lanpa/tensorboardX

 

1. 설

- tensorflow가 설치되어 있어야 한다.


pip install tensorboardX



2. 코드 run



3. 서버 사용시 터미널창에 아래 명령어 입력

Tensorboard를 사용하면 코드를 돌리는 폴더에 runs 폴더가 생성되고, 그 안에 log들이 저장된다.

그러므로 해당 코드의 path에 들어가서 아래 명령어를 입력한다

tensorboard --logdir runs


4. local에서 3번의 결과에 나오는 주소로 접근(default port : 6006)


> http://서버주소:defaul_port/ 로 접근 가능
> http://192.168.10.227:6006/


5. Tensorboard에 출력할 변수 코드에 삽입


from tensorboardX import SummaryWriter
writer = SummaryWriter()


5.1. add_scalars

- Tensorboard에 scalar 탭에서 확인할 수 있는 변수를 꽂아 넛는 명령어이다.


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


writer = SummaryWriter()


5.2.1. torch tensor 이미지 tensorboard/testt/torch_image로 보내기

torch tensor는 (channel, 가로, 세로) 차원의 형식이어야 한다


x = torch.rand(3, 64, 64) # output from network

writer.add_image('testt/bulk_image', x, n_iter)


5.2.2. numpy 행렬도 이미지로 보낼 수 있다.


x = np.zeros((3, 64, 64))   # output from network

writer.add_image('testt/numpy_image', x, n_iter)


5.2.3. 여러 이미지를 하나로 합쳐서 보내기


vutils.make_grid를 이용한다. tensor는 (10, 3, 64, 64) 형식도 되는데

numpy는 안된다. (3, 64, 64)가 list 형식으로 되어있어야 되서 그렇다.

그냥 torch 로 바꿔서 보내면 된다.


x = torch.rand(10, 3, 64, 64)  # output from network

x = vutils.make_grid(x, normalize=True, scale_each=True)
writer.add_image('testt/bulk_image', x, n_iter)


아래 그림은 add_image의 실습 결과이다.


5.3. add_text

아래 명령어로 입력하면, Text 탭에 그림과 같이 저장된다.


writer.add_text('Text', 'text logged at step:' + str(n_iter), n_iter)


 


5.4. add_audio

아래 명령어를 이용하여  numpy 형태의 audio를 출력 할 수 있다.


writer.add_audio('myAudio', dummy_audio, n_iter, sample_rate=sample_rate)





5.5 학습 파라미터 체크

아래 명령어를 이용하여 epoch에 따른 각 파라미터들이 어떻게 학습되는지를 확인 할 수 있다.



if epoch % 10 == 0:


for name, param in resnet18.named_parameters():

writer.add_histogram(name, param.clone().cpu().data.numpy(), n_iter)



위 코드에서 resnet18은 예시 모델이다. 사용하고자 하는 모델을 입력하고, 그 인자인 named_parameters()를 name과 param 변수로 불러와서

add_histogram의 입력으로 너어준다. 이 때 주의할 점은 param을 cpu로 가져온 후 data만 추출하여  numpy로 변환해야 한다.

매 epoch 마다 저장할 필요는 없으므로 몇 epoch에 한번씩 저장할지 판단하면 된다.

그럼 아래와 같은 그림을 얻을 수 있다. 텐서보드의 histogram 란에서 각 layer별 weight들을 확인 할 수 있다.



5.6 add_embedding


아래 코드를 이용하여 이미지를 임베딩 할 수 있다.

images는 MNIST 데이타로 100개의 이미지 (100, 28, 28) 이다.

이를 unsqueeze(1) 하여 (100, 1, 28, 28)로 만들어서 label_imag에 넛는다.

metadata는 이 이미지의 label 이다.

28*28을 784로 펼쳐서 텐서보드에 넘겨주면 된다.




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를 입력할 수 있다.

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()를 이용하여 종료해 준다.

그럼 아래 그림과 같이 저장된다.



# export scalar data to JSON for external processing
writer.export_scalars_to_json("./all_scalars.json")
writer.close()





Conclusion


Pytorch의 visualization 도구인 visdom과 tensorboardX에 대해 알아보았다.

느낀점은 나는 tensorboardX를 쓰겠다.

visdom은 냅다 창에 뿌려주는 식이라면

tensorboard는 정리된 느낌으로 프로처럼 잘 정돈하여 뿌려준다.

이제 쓸데없는 visualization 그만 파고 연구를 해야하는데 참












'AI > Pytorch' 카테고리의 다른 글

Pytorch 사용법 정리  (0) 2019.05.08
Pytorch visualization #1. Visodom 사용법  (2) 2019.05.08