파이토치를 이용하다가 실시간 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
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 |