|
-
- <!DOCTYPE html>
-
- <html lang="zh">
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
-
- <title>7.3 使用TensorBoard可视化训练过程 — 深入浅出PyTorch</title>
-
- <!-- Loaded before other Sphinx assets -->
- <link href="../_static/styles/theme.css?digest=1999514e3f237ded88cf" rel="stylesheet">
- <link href="../_static/styles/pydata-sphinx-theme.css?digest=1999514e3f237ded88cf" rel="stylesheet">
-
-
- <link rel="stylesheet"
- href="../_static/vendor/fontawesome/5.13.0/css/all.min.css">
- <link rel="preload" as="font" type="font/woff2" crossorigin
- href="../_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
- <link rel="preload" as="font" type="font/woff2" crossorigin
- href="../_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">
-
- <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
- <link rel="stylesheet" href="../_static/styles/sphinx-book-theme.css?digest=62ba249389abaaa9ffc34bf36a076bdc1d65ee18" type="text/css" />
- <link rel="stylesheet" type="text/css" href="../_static/togglebutton.css" />
- <link rel="stylesheet" type="text/css" href="../_static/mystnb.css" />
- <link rel="stylesheet" type="text/css" href="../_static/plot_directive.css" />
-
- <!-- Pre-loaded scripts that we'll load fully later -->
- <link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=1999514e3f237ded88cf">
-
- <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
- <script src="../_static/jquery.js"></script>
- <script src="../_static/underscore.js"></script>
- <script src="../_static/doctools.js"></script>
- <script>let toggleHintShow = 'Click to show';</script>
- <script>let toggleHintHide = 'Click to hide';</script>
- <script>let toggleOpenOnPrint = 'true';</script>
- <script src="../_static/togglebutton.js"></script>
- <script src="../_static/scripts/sphinx-book-theme.js?digest=f31d14ad54b65d19161ba51d4ffff3a77ae00456"></script>
- <script>var togglebuttonSelector = '.toggle, .admonition.dropdown, .tag_hide_input div.cell_input, .tag_hide-input div.cell_input, .tag_hide_output div.cell_output, .tag_hide-output div.cell_output, .tag_hide_cell.cell, .tag_hide-cell.cell';</script>
- <link rel="index" title="索引" href="../genindex.html" />
- <link rel="search" title="搜索" href="../search.html" />
- <link rel="next" title="第八章:PyTorch生态简介" href="../%E7%AC%AC%E5%85%AB%E7%AB%A0/index.html" />
- <link rel="prev" title="7.2 CNN可视化" href="7.2%20CNN%E5%8D%B7%E7%A7%AF%E5%B1%82%E5%8F%AF%E8%A7%86%E5%8C%96.html" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <meta name="docsearch:language" content="zh">
-
-
- <!-- Google Analytics -->
-
- </head>
- <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="60">
- <!-- Checkboxes to toggle the left sidebar -->
- <input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle navigation sidebar">
- <label class="overlay overlay-navbar" for="__navigation">
- <div class="visually-hidden">Toggle navigation sidebar</div>
- </label>
- <!-- Checkboxes to toggle the in-page toc -->
- <input type="checkbox" class="sidebar-toggle" name="__page-toc" id="__page-toc" aria-label="Toggle in-page Table of Contents">
- <label class="overlay overlay-pagetoc" for="__page-toc">
- <div class="visually-hidden">Toggle in-page Table of Contents</div>
- </label>
- <!-- Headers at the top -->
- <div class="announcement header-item noprint"></div>
- <div class="header header-item noprint"></div>
-
-
- <div class="container-fluid" id="banner"></div>
-
-
-
- <div class="container-xl">
- <div class="row">
-
- <!-- Sidebar -->
- <div class="bd-sidebar noprint" id="site-navigation">
- <div class="bd-sidebar__content">
- <div class="bd-sidebar__top"><div class="navbar-brand-box">
- <a class="navbar-brand text-wrap" href="../index.html">
-
-
-
- <h1 class="site-logo" id="site-title">深入浅出PyTorch</h1>
-
- </a>
- </div><form class="bd-search d-flex align-items-center" action="../search.html" method="get">
- <i class="icon fas fa-search"></i>
- <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
- </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main">
- <div class="bd-toc-item active">
- <p aria-level="2" class="caption" role="heading">
- <span class="caption-text">
- 目录
- </span>
- </p>
- <ul class="current nav bd-sidenav">
- <li class="toctree-l1 has-children">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%80%E7%AB%A0/index.html">
- 第一章:PyTorch的简介和安装
- </a>
- <input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" type="checkbox"/>
- <label for="toctree-checkbox-1">
- <i class="fas fa-chevron-down">
- </i>
- </label>
- <ul>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%80%E7%AB%A0/1.1%20PyTorch%E7%AE%80%E4%BB%8B.html">
- 1.1 PyTorch简介
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%80%E7%AB%A0/1.2%20PyTorch%E7%9A%84%E5%AE%89%E8%A3%85.html">
- 1.2 PyTorch的安装
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%80%E7%AB%A0/1.3%20PyTorch%E7%9B%B8%E5%85%B3%E8%B5%84%E6%BA%90.html">
- 1.3 PyTorch相关资源
- </a>
- </li>
- </ul>
- </li>
- <li class="toctree-l1 has-children">
- <a class="reference internal" href="../%E7%AC%AC%E4%BA%8C%E7%AB%A0/index.html">
- 第二章:PyTorch基础知识
- </a>
- <input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" type="checkbox"/>
- <label for="toctree-checkbox-2">
- <i class="fas fa-chevron-down">
- </i>
- </label>
- <ul>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%BA%8C%E7%AB%A0/2.1%20%E5%BC%A0%E9%87%8F.html">
- 2.1 张量
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%BA%8C%E7%AB%A0/2.2%20%E8%87%AA%E5%8A%A8%E6%B1%82%E5%AF%BC.html">
- 2.2 自动求导
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%BA%8C%E7%AB%A0/2.3%20%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97%E7%AE%80%E4%BB%8B.html">
- 2.3 并行计算简介
- </a>
- </li>
- </ul>
- </li>
- <li class="toctree-l1 has-children">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%89%E7%AB%A0/index.html">
- 第三章:PyTorch的主要组成模块
- </a>
- <input class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" type="checkbox"/>
- <label for="toctree-checkbox-3">
- <i class="fas fa-chevron-down">
- </i>
- </label>
- <ul>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%89%E7%AB%A0/3.1%20%E6%80%9D%E8%80%83%EF%BC%9A%E5%AE%8C%E6%88%90%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%BF%85%E8%A6%81%E9%83%A8%E5%88%86.html">
- 3.1 思考:完成深度学习的必要部分
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%89%E7%AB%A0/3.2%20%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE.html">
- 3.2 基本配置
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%89%E7%AB%A0/3.3%20%E6%95%B0%E6%8D%AE%E8%AF%BB%E5%85%A5.html">
- 3.3 数据读入
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%89%E7%AB%A0/3.4%20%E6%A8%A1%E5%9E%8B%E6%9E%84%E5%BB%BA.html">
- 3.4 模型构建
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%89%E7%AB%A0/3.5%20%E6%A8%A1%E5%9E%8B%E5%88%9D%E5%A7%8B%E5%8C%96.html">
- 3.5 模型初始化
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%89%E7%AB%A0/3.6%20%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0.html">
- 3.6 损失函数
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%89%E7%AB%A0/3.7%20%E8%AE%AD%E7%BB%83%E4%B8%8E%E8%AF%84%E4%BC%B0.html">
- 3.7 训练和评估
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%89%E7%AB%A0/3.8%20%E5%8F%AF%E8%A7%86%E5%8C%96.html">
- 3.8 可视化
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B8%89%E7%AB%A0/3.9%20%E4%BC%98%E5%8C%96%E5%99%A8.html">
- 3.9 Pytorch优化器
- </a>
- </li>
- </ul>
- </li>
- <li class="toctree-l1 has-children">
- <a class="reference internal" href="../%E7%AC%AC%E5%9B%9B%E7%AB%A0/index.html">
- 第四章:PyTorch基础实战
- </a>
- <input class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" type="checkbox"/>
- <label for="toctree-checkbox-4">
- <i class="fas fa-chevron-down">
- </i>
- </label>
- <ul>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%9B%9B%E7%AB%A0/%E5%9F%BA%E7%A1%80%E5%AE%9E%E6%88%98%E2%80%94%E2%80%94FashionMNIST%E6%97%B6%E8%A3%85%E5%88%86%E7%B1%BB.html">
- 基础实战——FashionMNIST时装分类
- </a>
- </li>
- </ul>
- </li>
- <li class="toctree-l1 has-children">
- <a class="reference internal" href="../%E7%AC%AC%E4%BA%94%E7%AB%A0/index.html">
- 第五章:PyTorch模型定义
- </a>
- <input class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" type="checkbox"/>
- <label for="toctree-checkbox-5">
- <i class="fas fa-chevron-down">
- </i>
- </label>
- <ul>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%BA%94%E7%AB%A0/5.1%20PyTorch%E6%A8%A1%E5%9E%8B%E5%AE%9A%E4%B9%89%E7%9A%84%E6%96%B9%E5%BC%8F.html">
- 5.1 PyTorch模型定义的方式
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%BA%94%E7%AB%A0/5.2%20%E5%88%A9%E7%94%A8%E6%A8%A1%E5%9E%8B%E5%9D%97%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA%E5%A4%8D%E6%9D%82%E7%BD%91%E7%BB%9C.html">
- 5.2 利用模型块快速搭建复杂网络
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%BA%94%E7%AB%A0/5.3%20PyTorch%E4%BF%AE%E6%94%B9%E6%A8%A1%E5%9E%8B.html">
- 5.3 PyTorch修改模型
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%BA%94%E7%AB%A0/5.4%20PyTorh%E6%A8%A1%E5%9E%8B%E4%BF%9D%E5%AD%98%E4%B8%8E%E8%AF%BB%E5%8F%96.html">
- 5.4 PyTorch模型保存与读取
- </a>
- </li>
- </ul>
- </li>
- <li class="toctree-l1 has-children">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AD%E7%AB%A0/index.html">
- 第六章:PyTorch进阶训练技巧
- </a>
- <input class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" type="checkbox"/>
- <label for="toctree-checkbox-6">
- <i class="fas fa-chevron-down">
- </i>
- </label>
- <ul>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AD%E7%AB%A0/6.1%20%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0.html">
- 6.1 自定义损失函数
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AD%E7%AB%A0/6.2%20%E5%8A%A8%E6%80%81%E8%B0%83%E6%95%B4%E5%AD%A6%E4%B9%A0%E7%8E%87.html">
- 6.2 动态调整学习率
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AD%E7%AB%A0/6.3%20%E6%A8%A1%E5%9E%8B%E5%BE%AE%E8%B0%83-torchvision.html">
- 6.3 模型微调-torchvision
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AD%E7%AB%A0/6.3%20%E6%A8%A1%E5%9E%8B%E5%BE%AE%E8%B0%83-timm.html">
- 6.3 模型微调 - timm
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AD%E7%AB%A0/6.4%20%E5%8D%8A%E7%B2%BE%E5%BA%A6%E8%AE%AD%E7%BB%83.html">
- 6.4 半精度训练
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AD%E7%AB%A0/6.5%20%E6%95%B0%E6%8D%AE%E5%A2%9E%E5%BC%BA-imgaug.html">
- 6.5 数据增强-imgaug
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AD%E7%AB%A0/6.6%20%E4%BD%BF%E7%94%A8argparse%E8%BF%9B%E8%A1%8C%E8%B0%83%E5%8F%82.html">
- 6.6 使用argparse进行调参
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AD%E7%AB%A0/6.7%20PyTorch%E6%A8%A1%E5%9E%8B%E5%AE%9A%E4%B9%89%E4%B8%8E%E8%BF%9B%E9%98%B6%E8%AE%AD%E7%BB%83%E6%8A%80%E5%B7%A7.html">
- PyTorch模型定义与进阶训练技巧
- </a>
- </li>
- </ul>
- </li>
- <li class="toctree-l1 current active has-children">
- <a class="reference internal" href="index.html">
- 第七章:PyTorch可视化
- </a>
- <input checked="" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" type="checkbox"/>
- <label for="toctree-checkbox-7">
- <i class="fas fa-chevron-down">
- </i>
- </label>
- <ul class="current">
- <li class="toctree-l2">
- <a class="reference internal" href="7.1%20%E5%8F%AF%E8%A7%86%E5%8C%96%E7%BD%91%E7%BB%9C%E7%BB%93%E6%9E%84.html">
- 7.1 可视化网络结构
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="7.2%20CNN%E5%8D%B7%E7%A7%AF%E5%B1%82%E5%8F%AF%E8%A7%86%E5%8C%96.html">
- 7.2 CNN可视化
- </a>
- </li>
- <li class="toctree-l2 current active">
- <a class="current reference internal" href="#">
- 7.3 使用TensorBoard可视化训练过程
- </a>
- </li>
- </ul>
- </li>
- <li class="toctree-l1 has-children">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AB%E7%AB%A0/index.html">
- 第八章:PyTorch生态简介
- </a>
- <input class="toctree-checkbox" id="toctree-checkbox-8" name="toctree-checkbox-8" type="checkbox"/>
- <label for="toctree-checkbox-8">
- <i class="fas fa-chevron-down">
- </i>
- </label>
- <ul>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AB%E7%AB%A0/8.1%20%E6%9C%AC%E7%AB%A0%E7%AE%80%E4%BB%8B.html">
- 8.1 本章简介
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AB%E7%AB%A0/8.2%20%E5%9B%BE%E5%83%8F%20-%20torchvision.html">
- 8.2 torchvision
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AB%E7%AB%A0/8.3%20%E8%A7%86%E9%A2%91%20-%20PyTorchVideo.html">
- 8.3 PyTorchVideo简介
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AB%E7%AB%A0/8.4%20%E6%96%87%E6%9C%AC%20-%20torchtext.html">
- 8.4 torchtext简介
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%85%AB%E7%AB%A0/transforms%E5%AE%9E%E6%93%8D.html">
- transforms实战
- </a>
- </li>
- </ul>
- </li>
- <li class="toctree-l1 has-children">
- <a class="reference internal" href="../%E7%AC%AC%E4%B9%9D%E7%AB%A0/index.html">
- 第九章:PyTorch的模型部署
- </a>
- <input class="toctree-checkbox" id="toctree-checkbox-9" name="toctree-checkbox-9" type="checkbox"/>
- <label for="toctree-checkbox-9">
- <i class="fas fa-chevron-down">
- </i>
- </label>
- <ul>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E4%B9%9D%E7%AB%A0/9.1%20%E4%BD%BF%E7%94%A8ONNX%E8%BF%9B%E8%A1%8C%E9%83%A8%E7%BD%B2%E5%B9%B6%E6%8E%A8%E7%90%86.html">
- 9.1 使用ONNX进行部署并推理
- </a>
- </li>
- </ul>
- </li>
- <li class="toctree-l1 has-children">
- <a class="reference internal" href="../%E7%AC%AC%E5%8D%81%E7%AB%A0/index.html">
- 第十章:常见代码解读
- </a>
- <input class="toctree-checkbox" id="toctree-checkbox-10" name="toctree-checkbox-10" type="checkbox"/>
- <label for="toctree-checkbox-10">
- <i class="fas fa-chevron-down">
- </i>
- </label>
- <ul>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%8D%81%E7%AB%A0/10.1%20%E5%9B%BE%E5%83%8F%E5%88%86%E7%B1%BB.html">
- 9.1 图像分类(补充中)
- </a>
- </li>
- <li class="toctree-l2">
- <a class="reference internal" href="../%E7%AC%AC%E5%8D%81%E7%AB%A0/10.2%20%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B.html">
- 目标检测
- </a>
- </li>
- </ul>
- </li>
- </ul>
-
- </div>
- </nav></div>
- <div class="bd-sidebar__bottom">
- <!-- To handle the deprecated key -->
-
- <div class="navbar_extra_footer">
- Theme by the <a href="https://ebp.jupyterbook.org">Executable Book Project</a>
- </div>
-
- </div>
- </div>
- <div id="rtd-footer-container"></div>
- </div>
-
-
-
-
-
-
- <!-- A tiny helper pixel to detect if we've scrolled -->
- <div class="sbt-scroll-pixel-helper"></div>
- <!-- Main content -->
- <div class="col py-0 content-container">
-
- <div class="header-article row sticky-top noprint">
-
-
-
-
- <div class="col py-1 d-flex header-article-main">
- <div class="header-article__left">
-
- <label for="__navigation"
- class="headerbtn"
- data-toggle="tooltip"
- data-placement="right"
- title="Toggle navigation"
- >
-
-
- <span class="headerbtn__icon-container">
- <i class="fas fa-bars"></i>
- </span>
-
- </label>
-
-
- </div>
- <div class="header-article__right">
- <button onclick="toggleFullScreen()"
- class="headerbtn"
- data-toggle="tooltip"
- data-placement="bottom"
- title="Fullscreen mode"
- >
-
-
- <span class="headerbtn__icon-container">
- <i class="fas fa-expand"></i>
- </span>
-
- </button>
-
- <div class="menu-dropdown menu-dropdown-repository-buttons">
- <button class="headerbtn menu-dropdown__trigger"
- aria-label="Source repositories">
- <i class="fab fa-github"></i>
- </button>
- <div class="menu-dropdown__content">
- <ul>
- <li>
- <a href="https://github.com/datawhalechina/thorough-pytorch"
- class="headerbtn"
- data-toggle="tooltip"
- data-placement="left"
- title="Source repository"
- >
-
-
- <span class="headerbtn__icon-container">
- <i class="fab fa-github"></i>
- </span>
- <span class="headerbtn__text-container">repository</span>
- </a>
-
- </li>
-
- <li>
- <a href="https://github.com/datawhalechina/thorough-pytorch/issues/new?title=Issue%20on%20page%20%2F第七章/7.3 使用TensorBoard可视化训练过程.html&body=Your%20issue%20content%20here."
- class="headerbtn"
- data-toggle="tooltip"
- data-placement="left"
- title="Open an issue"
- >
-
-
- <span class="headerbtn__icon-container">
- <i class="fas fa-lightbulb"></i>
- </span>
- <span class="headerbtn__text-container">open issue</span>
- </a>
-
- </li>
-
- <li>
- <a href="https://github.com/datawhalechina/thorough-pytorch/edit/master/第七章/7.3 使用TensorBoard可视化训练过程.md"
- class="headerbtn"
- data-toggle="tooltip"
- data-placement="left"
- title="Edit this page"
- >
-
-
- <span class="headerbtn__icon-container">
- <i class="fas fa-pencil-alt"></i>
- </span>
- <span class="headerbtn__text-container">suggest edit</span>
- </a>
-
- </li>
-
- </ul>
- </div>
- </div>
-
- <div class="menu-dropdown menu-dropdown-download-buttons">
- <button class="headerbtn menu-dropdown__trigger"
- aria-label="Download this page">
- <i class="fas fa-download"></i>
- </button>
- <div class="menu-dropdown__content">
- <ul>
- <li>
- <a href="../_sources/第七章/7.3 使用TensorBoard可视化训练过程.md.txt"
- class="headerbtn"
- data-toggle="tooltip"
- data-placement="left"
- title="Download source file"
- >
-
-
- <span class="headerbtn__icon-container">
- <i class="fas fa-file"></i>
- </span>
- <span class="headerbtn__text-container">.md</span>
- </a>
-
- </li>
-
- <li>
-
- <button onclick="printPdf(this)"
- class="headerbtn"
- data-toggle="tooltip"
- data-placement="left"
- title="Print to PDF"
- >
-
-
- <span class="headerbtn__icon-container">
- <i class="fas fa-file-pdf"></i>
- </span>
- <span class="headerbtn__text-container">.pdf</span>
- </button>
-
- </li>
-
- </ul>
- </div>
- </div>
- <label for="__page-toc"
- class="headerbtn headerbtn-page-toc"
-
- >
-
-
- <span class="headerbtn__icon-container">
- <i class="fas fa-list"></i>
- </span>
-
- </label>
-
- </div>
- </div>
-
- <!-- Table of contents -->
- <div class="col-md-3 bd-toc show noprint">
- <div class="tocsection onthispage pt-5 pb-3">
- <i class="fas fa-list"></i> Contents
- </div>
- <nav id="bd-toc-nav" aria-label="Page">
- <ul class="visible nav section-nav flex-column">
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id1">
- 7.3.1 TensorBoard安装
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id2">
- 7.3.2 TensorBoard可视化的基本逻辑
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id3">
- 7.3.3 TensorBoard的配置与启动
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id4">
- 7.3.4 TensorBoard模型结构可视化
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id5">
- 7.3.5 TensorBoard图像可视化
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id6">
- 7.3.6 TensorBoard连续变量可视化
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id7">
- 7.3.7 TensorBoard参数分布可视化
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id8">
- 7.3.8 服务器端使用TensorBoard
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id9">
- 7.3.9 总结
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id10">
- 本节参考
- </a>
- </li>
- </ul>
-
- </nav>
- </div>
- </div>
- <div class="article row">
- <div class="col pl-md-3 pl-lg-5 content-container">
- <!-- Table of contents that is only displayed when printing the page -->
- <div id="jb-print-docs-body" class="onlyprint">
- <h1>7.3 使用TensorBoard可视化训练过程</h1>
- <!-- Table of contents -->
- <div id="print-main-content">
- <div id="jb-print-toc">
-
- <div>
- <h2> Contents </h2>
- </div>
- <nav aria-label="Page">
- <ul class="visible nav section-nav flex-column">
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id1">
- 7.3.1 TensorBoard安装
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id2">
- 7.3.2 TensorBoard可视化的基本逻辑
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id3">
- 7.3.3 TensorBoard的配置与启动
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id4">
- 7.3.4 TensorBoard模型结构可视化
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id5">
- 7.3.5 TensorBoard图像可视化
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id6">
- 7.3.6 TensorBoard连续变量可视化
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id7">
- 7.3.7 TensorBoard参数分布可视化
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id8">
- 7.3.8 服务器端使用TensorBoard
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id9">
- 7.3.9 总结
- </a>
- </li>
- <li class="toc-h2 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id10">
- 本节参考
- </a>
- </li>
- </ul>
-
- </nav>
- </div>
- </div>
- </div>
- <main id="main-content" role="main">
-
- <div>
-
- <section class="tex2jax_ignore mathjax_ignore" id="tensorboard">
- <h1>7.3 使用TensorBoard可视化训练过程<a class="headerlink" href="#tensorboard" title="永久链接至标题">#</a></h1>
- <p>训练过程的可视化在深度学习模型训练中扮演着重要的角色。学习的过程是一个优化的过程,我们需要找到最优的点作为训练过程的输出产物。一般来说,我们会结合训练集的损失函数和验证集的损失函数,绘制两条损失函数的曲线来确定训练的终点,找到对应的模型用于测试。那么除了记录训练中每个epoch的loss值,能否实时观察损失函数曲线的变化,及时捕捉模型的变化呢?</p>
- <p>此外,我们也希望可视化其他内容,如输入数据(尤其是图片)、模型结构、参数分布等,这些对于我们在debug中查找问题来源非常重要(比如输入数据和我们想象的是否一致)。</p>
- <p>TensorBoard作为一款可视化工具能够满足上面提到的各种需求。TensorBoard由TensorFlow团队开发,最早和TensorFlow配合使用,后来广泛应用于各种深度学习框架的可视化中来。本节我们探索TensorBoard的强大功能,希望帮助读者“从入门到精通”。</p>
- <p>经过本节的学习,你将收获:</p>
- <ul class="simple">
- <li><p>安装TensorBoard工具</p></li>
- <li><p>了解TensorBoard可视化的基本逻辑</p></li>
- <li><p>掌握利用TensorBoard实现训练过程可视化</p></li>
- <li><p>掌握利用TensorBoard完成其他内容的可视化</p></li>
- </ul>
- <section id="id1">
- <h2>7.3.1 TensorBoard安装<a class="headerlink" href="#id1" title="永久链接至标题">#</a></h2>
- <p>在已安装PyTorch的环境下使用pip安装即可:</p>
- <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>pip install tensorboardX
- </pre></div>
- </div>
- <p>也可以使用PyTorch自带的tensorboard工具,此时不需要额外安装tensorboard。</p>
- </section>
- <section id="id2">
- <h2>7.3.2 TensorBoard可视化的基本逻辑<a class="headerlink" href="#id2" title="永久链接至标题">#</a></h2>
- <p>我们可以将TensorBoard看做一个记录员,它可以记录我们指定的数据,包括模型每一层的feature map,权重,以及训练loss等等。TensorBoard将记录下来的内容保存在一个用户指定的文件夹里,程序不断运行中TensorBoard会不断记录。记录下的内容可以通过网页的形式加以可视化。</p>
- </section>
- <section id="id3">
- <h2>7.3.3 TensorBoard的配置与启动<a class="headerlink" href="#id3" title="永久链接至标题">#</a></h2>
- <p>在使用TensorBoard前,我们需要先指定一个文件夹供TensorBoard保存记录下来的数据。然后调用tensorboard中的SummaryWriter作为上述“记录员”</p>
- <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">tensorboardX</span> <span class="kn">import</span> <span class="n">SummaryWriter</span>
-
- <span class="n">writer</span> <span class="o">=</span> <span class="n">SummaryWriter</span><span class="p">(</span><span class="s1">'./runs'</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>上面的操作实例化SummaryWritter为变量writer,并指定writer的输出目录为当前目录下的"runs"目录。也就是说,之后tensorboard记录下来的内容都会保存在runs。</p>
- <p>如果使用PyTorch自带的tensorboard,则采用如下方式import:</p>
- <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">torch.utils.tensorboard</span> <span class="kn">import</span> <span class="n">SummaryWriter</span>
- </pre></div>
- </div>
- <p>这里聪明的你可能发现了,是否可以手动往runs文件夹里添加数据用于可视化,或者把runs文件夹里的数据放到其他机器上可视化呢?答案是可以的。只要数据被记录,你可以将这个数据分享给其他人,其他人在安装了tensorboard的情况下就会看到你分享的数据。</p>
- <p>启动tensorboard也很简单,在命令行中输入</p>
- <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>tensorboard --logdir<span class="o">=</span>/path/to/logs/ --port<span class="o">=</span>xxxx
- </pre></div>
- </div>
- <p>其中“path/to/logs/"是指定的保存tensorboard记录结果的文件路径(等价于上面的“./runs",port是外部访问TensorBoard的端口号,可以通过访问ip:port访问tensorboard,这一操作和jupyter notebook的使用类似。如果不是在服务器远程使用的话则不需要配置port。</p>
- <p>有时,为了tensorboard能够不断地在后台运行,也可以使用nohup命令或者tmux工具来运行tensorboard。大家可以自行搜索,这里不展开讨论了。</p>
- <p>下面,我们将模拟深度学习模型训练过程,来介绍如何利用TensorBoard可视化其中的各个部分。</p>
- </section>
- <section id="id4">
- <h2>7.3.4 TensorBoard模型结构可视化<a class="headerlink" href="#id4" title="永久链接至标题">#</a></h2>
- <p>首先定义模型:</p>
- <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">torch.nn</span> <span class="k">as</span> <span class="nn">nn</span>
-
- <span class="k">class</span> <span class="nc">Net</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span><span class="p">):</span>
- <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="nb">super</span><span class="p">(</span><span class="n">Net</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">conv1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="n">in_channels</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="n">out_channels</span><span class="o">=</span><span class="mi">32</span><span class="p">,</span><span class="n">kernel_size</span> <span class="o">=</span> <span class="mi">3</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">pool</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span><span class="n">stride</span> <span class="o">=</span> <span class="mi">2</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">conv2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="n">in_channels</span><span class="o">=</span><span class="mi">32</span><span class="p">,</span><span class="n">out_channels</span><span class="o">=</span><span class="mi">64</span><span class="p">,</span><span class="n">kernel_size</span> <span class="o">=</span> <span class="mi">5</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">adaptive_pool</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">AdaptiveMaxPool2d</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Flatten</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">linear1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Linear</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span><span class="mi">32</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">relu</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">ReLU</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">linear2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Linear</span><span class="p">(</span><span class="mi">32</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">sigmoid</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Sigmoid</span><span class="p">()</span>
-
- <span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">):</span>
- <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv1</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv2</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">adaptive_pool</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">linear1</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">linear2</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sigmoid</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">y</span>
-
- <span class="n">model</span> <span class="o">=</span> <span class="n">Net</span><span class="p">()</span>
- <span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>输出如下:</p>
- <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Net</span><span class="p">(</span>
- <span class="p">(</span><span class="n">conv1</span><span class="p">):</span> <span class="n">Conv2d</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="n">stride</span><span class="o">=</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
- <span class="p">(</span><span class="n">pool</span><span class="p">):</span> <span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">dilation</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">ceil_mode</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
- <span class="p">(</span><span class="n">conv2</span><span class="p">):</span> <span class="n">Conv2d</span><span class="p">(</span><span class="mi">32</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="n">stride</span><span class="o">=</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
- <span class="p">(</span><span class="n">adaptive_pool</span><span class="p">):</span> <span class="n">AdaptiveMaxPool2d</span><span class="p">(</span><span class="n">output_size</span><span class="o">=</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
- <span class="p">(</span><span class="n">flatten</span><span class="p">):</span> <span class="n">Flatten</span><span class="p">(</span><span class="n">start_dim</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">end_dim</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
- <span class="p">(</span><span class="n">linear1</span><span class="p">):</span> <span class="n">Linear</span><span class="p">(</span><span class="n">in_features</span><span class="o">=</span><span class="mi">64</span><span class="p">,</span> <span class="n">out_features</span><span class="o">=</span><span class="mi">32</span><span class="p">,</span> <span class="n">bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- <span class="p">(</span><span class="n">relu</span><span class="p">):</span> <span class="n">ReLU</span><span class="p">()</span>
- <span class="p">(</span><span class="n">linear2</span><span class="p">):</span> <span class="n">Linear</span><span class="p">(</span><span class="n">in_features</span><span class="o">=</span><span class="mi">32</span><span class="p">,</span> <span class="n">out_features</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- <span class="p">(</span><span class="n">sigmoid</span><span class="p">):</span> <span class="n">Sigmoid</span><span class="p">()</span>
- <span class="p">)</span>
- </pre></div>
- </div>
- <p>可视化模型的思路和7.1中介绍的方法一样,都是给定一个输入数据,前向传播后得到模型的结构,再通过TensorBoard进行可视化,使用add_graph:</p>
- <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">writer</span><span class="o">.</span><span class="n">add_graph</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">input_to_model</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">rand</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">224</span><span class="p">))</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- </pre></div>
- </div>
- <p>展示结果如下(其中框内部分初始会显示为“Net",需要双击后才会展开):</p>
- <p><img alt="tb_model" src="../_images/tb_model.png" /></p>
- </section>
- <section id="id5">
- <h2>7.3.5 TensorBoard图像可视化<a class="headerlink" href="#id5" title="永久链接至标题">#</a></h2>
- <p>当我们做图像相关的任务时,可以方便地将所处理的图片在tensorboard中进行可视化展示。</p>
- <ul class="simple">
- <li><p>对于单张图片的显示使用add_image</p></li>
- <li><p>对于多张图片的显示使用add_images</p></li>
- <li><p>有时需要使用torchvision.utils.make_grid将多张图片拼成一张图片后,用writer.add_image显示</p></li>
- </ul>
- <p>这里我们使用torchvision的CIFAR10数据集为例:</p>
- <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">torchvision</span>
- <span class="kn">from</span> <span class="nn">torchvision</span> <span class="kn">import</span> <span class="n">datasets</span><span class="p">,</span> <span class="n">transforms</span>
- <span class="kn">from</span> <span class="nn">torch.utils.data</span> <span class="kn">import</span> <span class="n">DataLoader</span>
-
- <span class="n">transform_train</span> <span class="o">=</span> <span class="n">transforms</span><span class="o">.</span><span class="n">Compose</span><span class="p">(</span>
- <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">ToTensor</span><span class="p">()])</span>
- <span class="n">transform_test</span> <span class="o">=</span> <span class="n">transforms</span><span class="o">.</span><span class="n">Compose</span><span class="p">(</span>
- <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">ToTensor</span><span class="p">()])</span>
-
- <span class="n">train_data</span> <span class="o">=</span> <span class="n">datasets</span><span class="o">.</span><span class="n">CIFAR10</span><span class="p">(</span><span class="s2">"."</span><span class="p">,</span> <span class="n">train</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">download</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">transform</span><span class="o">=</span><span class="n">transform_train</span><span class="p">)</span>
- <span class="n">test_data</span> <span class="o">=</span> <span class="n">datasets</span><span class="o">.</span><span class="n">CIFAR10</span><span class="p">(</span><span class="s2">"."</span><span class="p">,</span> <span class="n">train</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">download</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">transform</span><span class="o">=</span><span class="n">transform_test</span><span class="p">)</span>
- <span class="n">train_loader</span> <span class="o">=</span> <span class="n">DataLoader</span><span class="p">(</span><span class="n">train_data</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">64</span><span class="p">,</span> <span class="n">shuffle</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- <span class="n">test_loader</span> <span class="o">=</span> <span class="n">DataLoader</span><span class="p">(</span><span class="n">test_data</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">64</span><span class="p">)</span>
-
- <span class="n">images</span><span class="p">,</span> <span class="n">labels</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="n">train_loader</span><span class="p">))</span>
-
- <span class="c1"># 仅查看一张图片</span>
- <span class="n">writer</span> <span class="o">=</span> <span class="n">SummaryWriter</span><span class="p">(</span><span class="s1">'./pytorch_tb'</span><span class="p">)</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">add_image</span><span class="p">(</span><span class="s1">'images[0]'</span><span class="p">,</span> <span class="n">images</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-
- <span class="c1"># 将多张图片拼接成一张图片,中间用黑色网格分割</span>
- <span class="c1"># create grid of images</span>
- <span class="n">writer</span> <span class="o">=</span> <span class="n">SummaryWriter</span><span class="p">(</span><span class="s1">'./pytorch_tb'</span><span class="p">)</span>
- <span class="n">img_grid</span> <span class="o">=</span> <span class="n">torchvision</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">make_grid</span><span class="p">(</span><span class="n">images</span><span class="p">)</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">add_image</span><span class="p">(</span><span class="s1">'image_grid'</span><span class="p">,</span> <span class="n">img_grid</span><span class="p">)</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-
- <span class="c1"># 将多张图片直接写入</span>
- <span class="n">writer</span> <span class="o">=</span> <span class="n">SummaryWriter</span><span class="p">(</span><span class="s1">'./pytorch_tb'</span><span class="p">)</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">add_images</span><span class="p">(</span><span class="s2">"images"</span><span class="p">,</span><span class="n">images</span><span class="p">,</span><span class="n">global_step</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- </pre></div>
- </div>
- <p>依次运行上面三组可视化(注意不要同时在notebook的一个单元格内运行),得到的可视化结果如下(最后运行的结果在最上面):</p>
- <p><img alt="tb_images" src="../_images/tb_images.png" /></p>
- <p><img alt="tb_image_gird" src="../_images/tb_image_grid.png" /></p>
- <p><img alt="tb_image" src="../_images/tb_image.png" /></p>
- <p>另外注意上方menu部分,刚刚只有“GRAPHS"栏对应模型的可视化,现在则多出了”IMAGES“栏对应图像的可视化。左侧的滑动按钮可以调整图像的亮度和对比度。</p>
- <p>此外,除了可视化原始图像,TensorBoard提供的可视化方案自然也适用于我们在Python中用matplotlib等工具绘制的其他图像,用于展示分析结果等内容。</p>
- </section>
- <section id="id6">
- <h2>7.3.6 TensorBoard连续变量可视化<a class="headerlink" href="#id6" title="永久链接至标题">#</a></h2>
- <p>TensorBoard可以用来可视化连续变量(或时序变量)的变化过程,通过add_scalar实现:</p>
- <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">writer</span> <span class="o">=</span> <span class="n">SummaryWriter</span><span class="p">(</span><span class="s1">'./pytorch_tb'</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">500</span><span class="p">):</span>
- <span class="n">x</span> <span class="o">=</span> <span class="n">i</span>
- <span class="n">y</span> <span class="o">=</span> <span class="n">x</span><span class="o">**</span><span class="mi">2</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">add_scalar</span><span class="p">(</span><span class="s2">"x"</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="c1">#日志中记录x在第step i 的值</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">add_scalar</span><span class="p">(</span><span class="s2">"y"</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="c1">#日志中记录y在第step i 的值</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- </pre></div>
- </div>
- <p>可视化结果如下:</p>
- <p><img alt="tb_scalar" src="../_images/tb_scalar.png" /></p>
- <p>如果想在同一张图中显示多个曲线,则需要分别建立存放子路径(使用SummaryWriter指定路径即可自动创建,但需要在tensorboard运行目录下),同时在add_scalar中修改曲线的标签使其一致即可:</p>
- <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">writer1</span> <span class="o">=</span> <span class="n">SummaryWriter</span><span class="p">(</span><span class="s1">'./pytorch_tb/x'</span><span class="p">)</span>
- <span class="n">writer2</span> <span class="o">=</span> <span class="n">SummaryWriter</span><span class="p">(</span><span class="s1">'./pytorch_tb/y'</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">500</span><span class="p">):</span>
- <span class="n">x</span> <span class="o">=</span> <span class="n">i</span>
- <span class="n">y</span> <span class="o">=</span> <span class="n">x</span><span class="o">*</span><span class="mi">2</span>
- <span class="n">writer1</span><span class="o">.</span><span class="n">add_scalar</span><span class="p">(</span><span class="s2">"same"</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="c1">#日志中记录x在第step i 的值</span>
- <span class="n">writer2</span><span class="o">.</span><span class="n">add_scalar</span><span class="p">(</span><span class="s2">"same"</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="c1">#日志中记录y在第step i 的值</span>
- <span class="n">writer1</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- <span class="n">writer2</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- </pre></div>
- </div>
- <p><img alt="tb_scalar_twolines" src="../_images/tb_twolines.png" /></p>
- <p>这里也可以用一个writer,但for循环中不断创建SummaryWriter不是一个好选项。此时左下角的Runs部分出现了勾选项,我们可以选择我们想要可视化的曲线。曲线名称对应存放子路径的名称(这里是x和y)。</p>
- <p>这部分功能非常适合损失函数的可视化,可以帮助我们更加直观地了解模型的训练情况,从而确定最佳的checkpoint。左侧的Smoothing滑动按钮可以调整曲线的平滑度,当损失函数震荡较大时,将Smoothing调大有助于观察loss的整体变化趋势。</p>
- </section>
- <section id="id7">
- <h2>7.3.7 TensorBoard参数分布可视化<a class="headerlink" href="#id7" title="永久链接至标题">#</a></h2>
- <p>当我们需要对参数(或向量)的变化,或者对其分布进行研究时,可以方便地用TensorBoard来进行可视化,通过add_histogram实现。下面给出一个例子:</p>
- <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">torch</span>
- <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
-
- <span class="c1"># 创建正态分布的张量模拟参数矩阵</span>
- <span class="k">def</span> <span class="nf">norm</span><span class="p">(</span><span class="n">mean</span><span class="p">,</span> <span class="n">std</span><span class="p">):</span>
- <span class="n">t</span> <span class="o">=</span> <span class="n">std</span> <span class="o">*</span> <span class="n">torch</span><span class="o">.</span><span class="n">randn</span><span class="p">((</span><span class="mi">100</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> <span class="o">+</span> <span class="n">mean</span>
- <span class="k">return</span> <span class="n">t</span>
-
- <span class="n">writer</span> <span class="o">=</span> <span class="n">SummaryWriter</span><span class="p">(</span><span class="s1">'./pytorch_tb/'</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">step</span><span class="p">,</span> <span class="n">mean</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">1</span><span class="p">)):</span>
- <span class="n">w</span> <span class="o">=</span> <span class="n">norm</span><span class="p">(</span><span class="n">mean</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">add_histogram</span><span class="p">(</span><span class="s2">"w"</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
- <span class="n">writer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- </pre></div>
- </div>
- <p>结果如下:</p>
- <p><img alt="tb_hist" src="../_images/tb_hist.png" /></p>
- </section>
- <section id="id8">
- <h2>7.3.8 服务器端使用TensorBoard<a class="headerlink" href="#id8" title="永久链接至标题">#</a></h2>
- <p>一般情况下,我们会连接远程的服务器来对模型进行训练,但由于服务器端是没有浏览器的(纯命令模式),因此,我们需要进行相应的配置,才可以在本地浏览器,使用tensorboard查看服务器运行的训练过程。
- 本文提供以下几种方式进行,其中前两种方法都是建立SSH隧道,实现远程端口到本机端口的转发,最后一种方法适用于没有下载Xshell等SSH连接工具的用户</p>
- <ul>
- <li><p>MobaXterm</p>
- <ol class="simple">
- <li><p>在MobaXterm点击Tunneling</p></li>
- <li><p>选择New SSH tunnel,我们会出现以下界面。</p></li>
- </ol>
- <p><img alt="ssh_tunnel" src="../_images/ssh_tunnel_UI.png" /></p>
- <ol class="simple">
- <li><p>对新建的SSH通道做以下设置,第一栏我们选择<code class="docutils literal notranslate"><span class="pre">Local</span> <span class="pre">port</span> <span class="pre">forwarding</span></code>,<code class="docutils literal notranslate"><span class="pre"><</span> <span class="pre">Remote</span> <span class="pre">Server></span></code>我们填写<strong>localhost</strong>,<code class="docutils literal notranslate"><span class="pre"><</span> <span class="pre">Remote</span> <span class="pre">port></span></code>填写6006,tensorboard默认会在6006端口进行显示,我们也可以根据 <strong>tensorboard --logdir=/path/to/logs/ --port=xxxx</strong>的命令中的port进行修改,<code class="docutils literal notranslate"><span class="pre"><</span> <span class="pre">SSH</span> <span class="pre">server></span></code> 填写我们连接服务器的ip地址,<code class="docutils literal notranslate"><span class="pre"><SSH</span> <span class="pre">login></span></code>填写我们连接的服务器的用户名,<code class="docutils literal notranslate"><span class="pre"><SSH</span> <span class="pre">port></span></code>填写端口号(通常为22),<code class="docutils literal notranslate"><span class="pre"><</span> <span class="pre">forwarded</span> <span class="pre">port></span></code>填写的是本地的一个端口号,以便我们后面可以对其进行访问。</p></li>
- <li><p>设定好之后,点击Save,然后Start。在启动tensorboard,这样我们就可以在本地的浏览器输入<code class="docutils literal notranslate"><span class="pre">http://localhost:6006/</span></code>对其进行访问了</p></li>
- </ol>
- </li>
- <li><p>Xshell</p>
- <ol class="simple">
- <li><p>Xshell的连接方法与MobaXterm的连接方式本质上是一样的,具体操作如下:</p></li>
- <li><p>连接上服务器后,打开当前会话属性,会出现下图,我们选择隧道,点击添加
- <img alt="xhell_ui" src="../_images/xshell_ui.png" /></p></li>
- <li><p>按照下方图进行选择,其中目标主机代表的是服务器,源主机代表的是本地,端口的选择根据实际情况而定。
- <img alt="xhell_set" src="../_images/xshell_set.png" /></p></li>
- <li><p>启动tensorboard,在本地127.0.0.1:6006 或者 localhost:6006进行访问。</p></li>
- </ol>
- </li>
- <li><p>SSL</p>
- <ol class="simple">
- <li><p>该方法是将服务器的6006端口重定向到自己机器上来,我们可以在本地的终端里输入以下代码:其中16006代表映射到本地的端口,6006代表的是服务器上的端口。</p></li>
- </ol>
- <div class="highlight-shell notranslate"><div class="highlight"><pre><span></span> ssh -L <span class="m">16006</span>:127.0.0.1:6006 username@remote_server_ip
- </pre></div>
- </div>
- <ol class="simple">
- <li><p>在服务上使用默认的6006端口正常启动tensorboard</p></li>
- </ol>
- <div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>tensorboard --logdir<span class="o">=</span>xxx --port<span class="o">=</span><span class="m">6006</span>
- </pre></div>
- </div>
- <ol class="simple">
- <li><p>在本地的浏览器输入地址</p></li>
- </ol>
- <div class="highlight-shell notranslate"><div class="highlight"><pre><span></span><span class="m">127</span>.0.0.1:16006 或者 localhost:16006
- </pre></div>
- </div>
- </li>
- </ul>
- </section>
- <section id="id9">
- <h2>7.3.9 总结<a class="headerlink" href="#id9" title="永久链接至标题">#</a></h2>
- <p>对于TensorBoard来说,它的功能是很强大的,可以记录的东西不只限于本节所介绍的范围。</p>
- <p>主要的实现方案是构建一个SummaryWriter,然后通过<code class="docutils literal notranslate"><span class="pre">add_XXX()</span></code>函数来实现。</p>
- <p>其实TensorBoard的逻辑还是很简单的,它的<strong>基本逻辑就是文件的读写逻辑</strong>,写入想要可视化的数据,然后TensorBoard自己会读出来。</p>
- </section>
- <section id="id10">
- <h2>本节参考<a class="headerlink" href="#id10" title="永久链接至标题">#</a></h2>
- <p>【1】https://blog.csdn.net/Python_Ai_Road/article/details/107704530</p>
- </section>
- </section>
-
-
- </div>
-
- </main>
- <footer class="footer-article noprint">
-
- <!-- Previous / next buttons -->
- <div class='prev-next-area'>
- <a class='left-prev' id="prev-link" href="7.2%20CNN%E5%8D%B7%E7%A7%AF%E5%B1%82%E5%8F%AF%E8%A7%86%E5%8C%96.html" title="上一页 页">
- <i class="fas fa-angle-left"></i>
- <div class="prev-next-info">
- <p class="prev-next-subtitle">上一页</p>
- <p class="prev-next-title">7.2 CNN可视化</p>
- </div>
- </a>
- <a class='right-next' id="next-link" href="../%E7%AC%AC%E5%85%AB%E7%AB%A0/index.html" title="下一页 页">
- <div class="prev-next-info">
- <p class="prev-next-subtitle">下一页</p>
- <p class="prev-next-title">第八章:PyTorch生态简介</p>
- </div>
- <i class="fas fa-angle-right"></i>
- </a>
- </div>
- </footer>
- </div>
- </div>
- <div class="footer-content row">
- <footer class="col footer"><p>
-
- By ZhikangNiu<br/>
-
- © Copyright 2022, ZhikangNiu.<br/>
- </p>
- </footer>
- </div>
-
- </div>
-
-
- </div>
- </div>
-
- <!-- Scripts loaded after <body> so the DOM is not blocked -->
- <script src="../_static/scripts/pydata-sphinx-theme.js?digest=1999514e3f237ded88cf"></script>
-
-
- </body>
- </html>
|