30_visdom可视化、TensorboardX及其案例、安装visdom、使用visdom的案例

本是古典 何须时尚 2022-10-29 10:25 430阅读 0赞

1.25.visdom可视化

1.25.1.TensorboardX

Pytorch也能用的tensorboard,此外Pytorch还有visdom可视化。

首先上项目地址:https://github.com/lanpa/tensorboardX

1.25.2.安装

  1. (base) C:\Users\toto>pip install tensorboardX
  2. Collecting tensorboardX
  3. Downloading tensorboardX-2.1-py2.py3-none-any.whl (308 kB)
  4. |████████████████████████████████| 308 kB 726 kB/s
  5. Requirement already satisfied: six in d:\installed\anaconda3\lib\site-packages (from tensorboardX) (1.12.0)
  6. Requirement already satisfied: protobuf>=3.8.0 in d:\installed\anaconda3\lib\site-packages (from tensorboardX) (3.12.1)
  7. Requirement already satisfied: numpy in d:\installed\anaconda3\lib\site-packages (from tensorboardX) (1.20.1)
  8. Requirement already satisfied: setuptools in d:\installed\anaconda3\lib\site-packages (from protobuf>=3.8.0->tensorboardX) (41.4.0)
  9. Installing collected packages: tensorboardX
  10. Successfully installed tensorboardX-2.1
  11. (base) C:\Users\toto>

或者从源码中build

  1. pip install 'git+https://github.com/lanpa/tensorboardX'

您可以选择安装crc32c来加速。

  1. (base) C:\Users\toto>pip install crc32c
  2. Collecting crc32c
  3. Downloading crc32c-2.2-cp37-cp37m-win_amd64.whl (31 kB)
  4. Installing collected packages: crc32c
  5. Successfully installed crc32c-2.2
  6. (base) C:\Users\toto>

从tensorboardX 2.1开始,你需要为add_audio()函数安装soundfile(200倍加速)。

  1. (base) C:\Users\toto>pip install soundfile
  2. Collecting soundfile
  3. Downloading SoundFile-0.10.3.post1-py2.py3.cp26.cp27.cp32.cp33.cp34.cp35.cp36.pp27.pp32.pp33-none-win_amd64.whl (689 kB)
  4. |████████████████████████████████| 689 kB 117 kB/s
  5. Requirement already satisfied: cffi>=1.0 in d:\installed\anaconda3\lib\site-packages (from soundfile) (1.12.3)
  6. Requirement already satisfied: pycparser in d:\installed\anaconda3\lib\site-packages (from cffi>=1.0->soundfile) (2.19)
  7. Installing collected packages: soundfile
  8. Successfully installed soundfile-0.10.3.post1
  9. (base) C:\Users\toto>

1.25.3.例子

克隆文件:https://github.com/lanpa/tensorboardX/tree/master/examples
运行demo脚本:python examples/demo.py
运行TensorBoard可以用:tensorboard —logdir runs

在下面可能运行:

  1. (base) C:\Users\toto>tensorboard --logdir runs
  2. 2021-02-12 13:35:13.345643: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cudart64_101.dll
  3. Traceback (most recent call last):
  4. ValueError: Duplicate plugins for name projector

例子:

  1. # -*- coding: UTF-8 -*-
  2. import torch
  3. import torchvision.utils as vutils
  4. import numpy as np
  5. import torchvision.models as models
  6. from torchvision import datasets
  7. from tensorboardX import SummaryWriter
  8. resnet18 = models.resnet18(False)
  9. writer = SummaryWriter()
  10. sample_rate = 44100
  11. freqs = [262, 294, 330, 349, 392, 440, 440, 440, 440, 440, 440]
  12. for n_iter in range(100):
  13. dummy_s1 = torch.rand(1)
  14. dummy_s2 = torch.rand(1)
  15. # data grouping by `slash`
  16. writer.add_scalar('data/scalar1', dummy_s1[0], n_iter)
  17. writer.add_scalar('data/scalar2', dummy_s2[0], n_iter)
  18. writer.add_scalars('data/scalar_group', { 'xsinx': n_iter * np.sin(n_iter),
  19. 'xcosx': n_iter * np.cos(n_iter),
  20. 'arctanx': np.arctan(n_iter)}, n_iter)
  21. dummy_img = torch.rand(32, 3, 64, 64) # output from network
  22. if n_iter % 10 == 0:
  23. x = vutils.make_grid(dummy_img, normalize=True, scale_each=True)
  24. writer.add_image('Image', x, n_iter)
  25. dummy_audio = torch.zeros(sample_rate * 2)
  26. for i in range(x.size(0)):
  27. # amplitude of sound should in [-1, 1]
  28. dummy_audio[i] = np.cos(freqs[n_iter // 10] * np.pi * float(i) / float(sample_rate))
  29. writer.add_audio('myAudio', dummy_audio, n_iter, sample_rate=sample_rate)
  30. writer.add_text('Text', 'text logged at step:' + str(n_iter), n_iter)
  31. for name, param in resnet18.named_parameters():
  32. writer.add_histogram(name, param.clone().cpu().data.numpy(), n_iter)
  33. # needs tensorboard 0.4RC or later
  34. writer.add_pr_curve('xoxo', np.random.randint(2, size=100), np.random.rand(100), n_iter)
  35. dataset = datasets.MNIST('mnist', train=False, download=True)
  36. images = dataset.test_data[:100].float()
  37. label = dataset.test_labels[:100]
  38. features = images.view(100, 784)
  39. writer.add_embedding(features, metadata=label, label_img=images.unsqueeze(1))
  40. # export scalar data to JSON for external processing
  41. writer.export_scalars_to_json("./all_scalars.json")
  42. writer.close()

1.25.4.安装visdom

  1. (base) C:\Users\toto>pip install visdom
  2. Collecting visdom
  3. Downloading visdom-0.1.8.9.tar.gz (676 kB)
  4. |████████████████████████████████| 676 kB 27 kB/s
  5. Requirement already satisfied: numpy>=1.8 in d:\installed\anaconda3\lib\site-packages (from visdom) (1.18.5)
  6. Requirement already satisfied: scipy in d:\installed\anaconda3\lib\site-packages (from visdom) (1.4.1)
  7. Requirement already satisfied: requests in d:\installed\anaconda3\lib\site-packages (from visdom) (2.22.0)
  8. Requirement already satisfied: tornado in d:\installed\anaconda3\lib\site-packages (from visdom) (6.0.3)
  9. Requirement already satisfied: pyzmq in d:\installed\anaconda3\lib\site-packages (from visdom) (18.1.0)
  10. Requirement already satisfied: six in d:\installed\anaconda3\lib\site-packages (from visdom) (1.15.0)
  11. Collecting jsonpatch
  12. Downloading jsonpatch-1.28-py2.py3-none-any.whl (12 kB)
  13. Collecting torchfile
  14. Downloading torchfile-0.1.0.tar.gz (5.2 kB)
  15. Collecting websocket-client
  16. Downloading websocket_client-0.57.0-py2.py3-none-any.whl (200 kB)
  17. |████████████████████████████████| 200 kB 20 kB/s
  18. Requirement already satisfied: pillow in d:\installed\anaconda3\lib\site-packages (from visdom) (6.2.0)
  19. Requirement already satisfied: chardet<3.1.0,>=3.0.2 in d:\installed\anaconda3\lib\site-packages (from requests->visdom) (3.0.4)
  20. Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in d:\installed\anaconda3\lib\site-packages (from requests->visdom) (1.24.2)
  21. Requirement already satisfied: idna<2.9,>=2.5 in d:\installed\anaconda3\lib\site-packages (from requests->visdom) (2.8)
  22. Requirement already satisfied: certifi>=2017.4.17 in d:\installed\anaconda3\lib\site-packages (from requests->visdom) (2019.9.11)
  23. Collecting jsonpointer>=1.9
  24. Downloading jsonpointer-2.0-py2.py3-none-any.whl (7.6 kB)
  25. Building wheels for collected packages: visdom, torchfile
  26. Building wheel for visdom (setup.py) ... done
  27. Created wheel for visdom: filename=visdom-0.1.8.9-py3-none-any.whl size=655249 sha256=aa110012ea279783c86dcbc7778c90e8d4c021e5d9ac1a98f68c3134b7c52627
  28. Stored in directory: c:\users\toto\appdata\local\pip\cache\wheels\2d\d1\9b\cde923274eac9cbb6ff0d8c7c72fe30a3da9095a38fd50bbf1
  29. Building wheel for torchfile (setup.py) ... done
  30. Created wheel for torchfile: filename=torchfile-0.1.0-py3-none-any.whl size=5711 sha256=ac722c7bbb17ae1c36bef8db4b20cd6978462f240d76c5b6b0a4dfc6719db2b4
  31. Stored in directory: c:\users\toto\appdata\local\pip\cache\wheels\ac\5c\3a\a80e1c65880945c71fd833408cd1e9a8cb7e2f8f37620bb75b
  32. Successfully built visdom torchfile
  33. Installing collected packages: jsonpointer, jsonpatch, torchfile, websocket-client, visdom
  34. Successfully installed jsonpatch-1.28 jsonpointer-2.0 torchfile-0.1.0 visdom-0.1.8.9 websocket-client-0.57.0
  35. (base) C:\Users\toto>

1.25.5.后台运行visdom.server

  1. (base) C:\Users\toto>pip install visdom -i https://pypi.tuna.tsinghua.edu.cn/simple
  2. Collecting visdom
  3. Downloading visdom-0.1.8.9.tar.gz (676 kB)
  4. |████████████████████████████████| 676 kB 27 kB/s
  5. Requirement already satisfied: numpy>=1.8 in d:\installed\anaconda3\lib\site-packages (from visdom) (1.18.5)
  6. Requirement already satisfied: scipy in d:\installed\anaconda3\lib\site-packages (from visdom) (1.4.1)
  7. Requirement already satisfied: requests in d:\installed\anaconda3\lib\site-packages (from visdom) (2.22.0)
  8. Requirement already satisfied: tornado in d:\installed\anaconda3\lib\site-packages (from visdom) (6.0.3)
  9. Requirement already satisfied: pyzmq in d:\installed\anaconda3\lib\site-packages (from visdom) (18.1.0)
  10. Requirement already satisfied: six in d:\installed\anaconda3\lib\site-packages (from visdom) (1.15.0)
  11. Collecting jsonpatch
  12. Downloading jsonpatch-1.28-py2.py3-none-any.whl (12 kB)
  13. Collecting torchfile
  14. Downloading torchfile-0.1.0.tar.gz (5.2 kB)
  15. Collecting websocket-client
  16. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  17. Installing collected packages: jsonpointer, jsonpatch, torchfile, websocket-client, visdom
  18. Successfully installed jsonpatch-1.28 jsonpointer-2.0 torchfile-0.1.0 visdom-0.1.8.9 websocket-client-0.57.0
  19. 安装并更新,不更新不能正常使用,会卡在download script
  20. (base) C:\Users\toto> pip install --upgrade visdom
  21. (base) C:\Users\toto>python -m visdom.server
  22. D:\installed\Anaconda3\lib\site-packages\visdom\server.py:39: DeprecationWarning: zmq.eventloop.ioloop is deprecated in pyzmq 17. pyzmq now works with default tornado and asyncio eventloops.
  23. ioloop.install() # Needs to happen before any tornado imports!
  24. Checking for scripts.

如果在启动过程中一直报:Downloading scripts, this may take a little while
一直卡着不动,解决办法是:

  • 找到visdom安装位置,我的路径为D:\Anaconda3\Lib\site-packages\visdom,打开sever.py。
  • 修改server.py文件,在函数download_scripts_and_run下注释掉download_scripts(),第1917行。
    在这里插入图片描述
    然后再执行,出现如下错误:

    (base) C:\Users\toto>python -m visdom.server
    D:\installed\anaconda3\lib\site-packages\visdom\server.py:39: DeprecationWarning: zmq.eventloop.ioloop is deprecated in pyzmq 17. pyzmq now works with default tornado and asyncio eventloops.
    ioloop.install() # Needs to happen before any tornado imports!
    It’s Alive!
    Traceback (most recent call last):
    File “D:\installed\anaconda3\lib\runpy.py”, line 194, in _run_module_as_main

    1. return _run_code(code, main_globals, None,

    File “D:\installed\anaconda3\lib\runpy.py”, line 87, in _run_code

    1. exec(code, run_globals)

    File “D:\installed\anaconda3\lib\site-packages\visdom\server.py”, line 1922, in

    1. download_scripts_and_run()

    File “D:\installed\anaconda3\lib\site-packages\visdom\server.py”, line 1918, in download_scripts_and_run

    1. main()

    File “D:\installed\anaconda3\lib\site-packages\visdom\server.py”, line 1910, in main

    1. start_server(port=FLAGS.port, hostname=FLAGS.hostname, base_url=base_url,

    File “D:\installed\anaconda3\lib\site-packages\visdom\server.py”, line 1791, in start_server

    1. app.listen(port, max_buffer_size=1024 ** 3)

    File “D:\installed\anaconda3\lib\site-packages\tornado\web.py”, line 2116, in listen

    1. server.listen(port, address)

    File “D:\installed\anaconda3\lib\site-packages\tornado\tcpserver.py”, line 152, in listen

    1. self.add_sockets(sockets)

    File “D:\installed\anaconda3\lib\site-packages\tornado\tcpserver.py”, line 165, in add_sockets

    1. self._handlers[sock.fileno()] = add_accept_handler(

    File “D:\installed\anaconda3\lib\site-packages\tornado\netutil.py”, line 279, in add_accept_handler

    1. io_loop.add_handler(sock, accept_handler, IOLoop.READ)

    File “D:\installed\anaconda3\lib\site-packages\tornado\platform\asyncio.py”, line 100, in add_handler

    1. self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ)

    File “D:\installed\anaconda3\lib\asyncio\events.py”, line 501, in add_reader

    1. raise NotImplementedError

    NotImplementedError

    (base) C:\Users\toto>

大概的意思Python3.8的asyncio改变了循环方式,因为这种方式在windows上不支持相应的add_reader APIs,就会抛NotImplementedError。

解决办法是: 找到这个项目使用的python环境的lib\site-packages,做下面的修改,在\Lib\site-packages\tornado\platform\asyncio.py开头添加代码:

  1. import sys #此处如果已经引入过了,不用再引入了。
  2. if sys.platform == 'win32':
  3. asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

在这里插入图片描述
然后在执行命令:
在这里插入图片描述
如果期间出现:

  1. Visdom python client failed to establish socket to get messages from the server. This feature is optional
  2. and can be disabled by initializing Visdom with `use_incoming_socket=False`, which will prevent waiting for this request to timeout.

解决办法:

  1. vis = visdom.Visdom(use_incoming_socket=False)

示例:

  1. 在这里插入代码片

lines: single trace

  1. from visdom import Visdom
  2. viz = Visdom()
  3. viz.line([0.],[0.], win='train_loss', opts=dict(title='train loss'))
  4. viz.line([loss.item()], [global_step], win='train_loss', update='append')

在这里插入图片描述

lines: multi-traces

  1. from visdom import Visdom
  2. viz = Visdom()
  3. viz.line([[0.0, 0.0]], [0.], win='test', opts=dict(title='test loss&acc.',
  4. legend=['loss', 'acc.']))
  5. viz.line([[test_loss, correct / len(test_loader.dataset)]],
  6. [global_step], win='test', update='append')

在这里插入图片描述

visual X

  1. from visdom import Visdom
  2. viz = Visdom()
  3. viz.images(data.view(-1, 1, 28, 28), win='x')
  4. viz.text(str(pred.detach().cpu().numpy()), win='pred', opts=dict(title='pred'))

在这里插入图片描述

1.25.6.使用visdom的案例

  1. import torch
  2. import torch.nn as nn
  3. import torch.nn.functional as F
  4. import torch.optim as optim
  5. from torchvision import datasets, transforms
  6. from visdom import Visdom
  7. batch_size=200
  8. learning_rate=0.01
  9. epochs=10
  10. train_loader = torch.utils.data.DataLoader(
  11. datasets.MNIST('../data', train=True, download=True,
  12. transform=transforms.Compose([
  13. transforms.ToTensor(),
  14. # transforms.Normalize((0.1307,), (0.3081,))
  15. ])),
  16. batch_size=batch_size, shuffle=True)
  17. test_loader = torch.utils.data.DataLoader(
  18. datasets.MNIST('../data', train=False, transform=transforms.Compose([
  19. transforms.ToTensor(),
  20. # transforms.Normalize((0.1307,), (0.3081,))
  21. ])),
  22. batch_size=batch_size, shuffle=True)
  23. class MLP(nn.Module):
  24. def __init__(self):
  25. super(MLP, self).__init__()
  26. self.model = nn.Sequential(
  27. nn.Linear(784, 200),
  28. nn.LeakyReLU(inplace=True),
  29. nn.Linear(200, 200),
  30. nn.LeakyReLU(inplace=True),
  31. nn.Linear(200, 10),
  32. nn.LeakyReLU(inplace=True),
  33. )
  34. def forward(self, x):
  35. x = self.model(x)
  36. return x
  37. device = torch.device('cuda:0')
  38. net = MLP().to(device)
  39. optimizer = optim.SGD(net.parameters(), lr=learning_rate)
  40. criteon = nn.CrossEntropyLoss().to(device)
  41. viz = Visdom()
  42. viz.line([0.], [0.], win='train_loss', opts=dict(title='train loss'))
  43. viz.line([[0.0, 0.0]], [0.], win='test', opts=dict(title='test loss&acc.',
  44. legend=['loss', 'acc.']))
  45. global_step = 0
  46. for epoch in range(epochs):
  47. for batch_idx, (data, target) in enumerate(train_loader):
  48. data = data.view(-1, 28*28)
  49. data, target = data.to(device), target.cuda()
  50. logits = net(data)
  51. loss = criteon(logits, target)
  52. optimizer.zero_grad()
  53. loss.backward()
  54. # print(w1.grad.norm(), w2.grad.norm())
  55. optimizer.step()
  56. global_step += 1
  57. viz.line([loss.item()], [global_step], win='train_loss', update='append')
  58. if batch_idx % 100 == 0:
  59. print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
  60. epoch, batch_idx * len(data), len(train_loader.dataset),
  61. 100. * batch_idx / len(train_loader), loss.item()))
  62. test_loss = 0
  63. correct = 0
  64. for data, target in test_loader:
  65. data = data.view(-1, 28 * 28)
  66. data, target = data.to(device), target.cuda()
  67. logits = net(data)
  68. test_loss += criteon(logits, target).item()
  69. pred = logits.argmax(dim=1)
  70. correct += pred.eq(target).float().sum().item()
  71. viz.line([[test_loss, correct / len(test_loader.dataset)]],
  72. [global_step], win='test', update='append')
  73. viz.images(data.view(-1, 1, 28, 28), win='x')
  74. viz.text(str(pred.detach().cpu().numpy()), win='pred',
  75. opts=dict(title='pred'))
  76. test_loss /= len(test_loader.dataset)
  77. print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
  78. test_loss, correct, len(test_loader.dataset),
  79. 100. * correct / len(test_loader.dataset)))

发表评论

表情:
评论列表 (有 0 条评论,430人围观)

还没有评论,来说两句吧...

相关阅读