提交 cf4e366c 编写于 作者: B baiyfbupt

Deployed 09f99c9e with MkDocs version: 1.0.4

上级 159a6f30
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<link rel="shortcut icon" href="/img/favicon.ico"> <link rel="shortcut icon" href="/img/favicon.ico">
<title>PaddleSlim</title> <title>PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/css/theme.css" type="text/css" /> <link rel="stylesheet" href="/css/theme.css" type="text/css" />
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search"> <div class="wy-side-nav-search">
<a href="/." class="icon icon-home"> PaddleSlim</a> <a href="/." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search"> <div role="search">
<form id ="rtd-search-form" class="wy-form" action="//search.html" method="get"> <form id ="rtd-search-form" class="wy-form" action="//search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" /> <input type="text" name="q" placeholder="Search docs" title="Type search term here" />
...@@ -43,80 +43,59 @@ ...@@ -43,80 +43,59 @@
<li class="toctree-l1"> <li class="toctree-l1">
<a class="" href="/.">Welcome to MkDocs</a> <a class="" href="/.">Home</a>
</li> </li>
<li class="toctree-l1"> <li class="toctree-l1">
<span class="caption-text">Docs</span> <span class="caption-text">教程</span>
<ul class="subnav"> <ul class="subnav">
<li class=""> <li class="">
<a class="" href="/docs/">PaddleSlim</a> <a class="" href="/tutorials/quant_post_demo/">离线量化</a>
</li> </li>
<li class=""> <li class="">
<a class="" href="/docs/table_latency/">硬件延时评估表</a> <a class="" href="/tutorials/quant_aware_demo/">量化训练</a>
</li> </li>
<li class=""> <li class="">
<span class="caption-text">Api</span> <a class="" href="/tutorials/quant_embedding_demo/">Embedding量化</a>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="/docs/api/analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="/docs/api/api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="/docs/api/nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="/docs/api/prune_api/">卷积通道剪裁API文档</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="/docs/api/quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="/docs/api/search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="/docs/api/single_distiller_api/">paddleslim.dist API文档</a> <a class="" href="/tutorials/nas_demo/">SA搜索</a>
</li> </li>
</ul> </ul>
</li> </li>
<li class="">
<li class="toctree-l1">
<span class="caption-text">Tutorials</span>
<span class="caption-text">API</span>
<ul class="subnav"> <ul class="subnav">
<li class="toctree-l3"> <li class="">
<a class="" href="/docs/tutorials/demo_guide/">Demo guide</a> <a class="" href="/api/quantization_api/">量化</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="/docs/tutorials/nas_demo/">网络结构搜索示例</a> <a class="" href="/api/prune_api/">剪枝</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="/docs/tutorials/quant_aware_demo/">在线量化示例</a> <a class="" href="/api/analysis_api/">敏感度分析</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="/docs/tutorials/quant_embedding_demo/">Embedding量化示例</a> <a class="" href="/api/single_distiller_api/">蒸馏</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="/docs/tutorials/quant_post_demo/">离线量化示例</a> <a class="" href="/api/nas_api/">SA搜索</a>
</li> </li>
</ul> <li class="">
<a class="" href="/api/search_space/">搜索空间</a>
</li> </li>
</ul> </ul>
</li> </li>
...@@ -131,7 +110,7 @@ ...@@ -131,7 +110,7 @@
<nav class="wy-nav-top" role="navigation" aria-label="top navigation"> <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="/.">PaddleSlim</a> <a href="/.">PaddleSlim Docs</a>
</nav> </nav>
...@@ -182,12 +161,16 @@ ...@@ -182,12 +161,16 @@
<div class="rst-versions" role="note" style="cursor: pointer"> <div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version"> <span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
</span> </span>
</div> </div>
<script>var base_url = '/';</script> <script>var base_url = '/';</script>
<script src="/js/theme.js" defer></script> <script src="/js/theme.js" defer></script>
<script src="/mathjax-config.js" defer></script>
<script src="/MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="/search/main.js" defer></script> <script src="/search/main.js" defer></script>
</body> </body>
......
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>敏感度分析 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "\u654f\u611f\u5ea6\u5206\u6790";
var mkdocs_page_input_path = "api/analysis_api.md";
var mkdocs_page_url = null;
</script>
<script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../..">Home</a>
</li>
<li class="toctree-l1">
<span class="caption-text">教程</span>
<ul class="subnav">
<li class="">
<a class="" href="../../tutorials/quant_post_demo/">离线量化</a>
</li>
<li class="">
<a class="" href="../../tutorials/quant_aware_demo/">量化训练</a>
</li>
<li class="">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化</a>
</li>
<li class="">
<a class="" href="../../tutorials/nas_demo/">SA搜索</a>
</li>
</ul>
</li>
<li class="toctree-l1">
<span class="caption-text">API</span>
<ul class="subnav">
<li class="">
<a class="" href="../quantization_api/">量化</a>
</li>
<li class="">
<a class="" href="../prune_api/">剪枝</a>
</li>
<li class=" current">
<a class="current" href="./">敏感度分析</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#api">模型分析API文档</a></li>
<ul>
<li><a class="toctree-l4" href="#flops">flops</a></li>
<li><a class="toctree-l4" href="#model_size">model_size</a></li>
<li><a class="toctree-l4" href="#tablelatencyevaluator">TableLatencyEvaluator</a></li>
</ul>
</ul>
</li>
<li class="">
<a class="" href="../single_distiller_api/">蒸馏</a>
</li>
<li class="">
<a class="" href="../nas_api/">SA搜索</a>
</li>
<li class="">
<a class="" href="../search_space/">搜索空间</a>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../..">PaddleSlim Docs</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../..">Docs</a> &raquo;</li>
<li>API &raquo;</li>
<li>敏感度分析</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/api/analysis_api.md"
class="icon icon-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="api">模型分析API文档<a class="headerlink" href="#api" title="Permanent link">#</a></h1>
<h2 id="flops">flops<a class="headerlink" href="#flops" title="Permanent link">#</a></h2>
<blockquote>
<p>paddleslim.analysis.flops(program, detail=False) <a href="">源代码</a></p>
</blockquote>
<p>获得指定网络的每秒浮点运算次数(FLOPS)。</p>
<p><strong>参数:</strong></p>
<ul>
<li>
<p><strong>program(paddle.fluid.Program):</strong> 待分析的目标网络。更多关于Program的介绍请参考:<a href="https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/Program_cn.html#program">Program概念介绍</a></p>
</li>
<li>
<p><strong>detail(bool):</strong> 是否返回每个卷积层的FLOPS。默认为False。</p>
</li>
</ul>
<p><strong>返回值:</strong></p>
<ul>
<li>
<p><strong>flops(float):</strong> 整个网络的FLOPS。</p>
</li>
<li>
<p><strong>params2flops(dict):</strong> 每层卷积对应的FLOPS,其中key为卷积层参数名称,value为FLOPS值。</p>
</li>
</ul>
<p><strong>示例:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="kn">from</span> <span class="nn">paddle.fluid.param_attr</span> <span class="kn">import</span> <span class="n">ParamAttr</span>
<span class="kn">from</span> <span class="nn">paddleslim.analysis</span> <span class="kn">import</span> <span class="n">flops</span>
<span class="k">def</span> <span class="nf">conv_bn_layer</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span>
<span class="n">num_filters</span><span class="p">,</span>
<span class="n">filter_size</span><span class="p">,</span>
<span class="n">name</span><span class="p">,</span>
<span class="n">stride</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">groups</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span>
<span class="nb">input</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span>
<span class="n">num_filters</span><span class="o">=</span><span class="n">num_filters</span><span class="p">,</span>
<span class="n">filter_size</span><span class="o">=</span><span class="n">filter_size</span><span class="p">,</span>
<span class="n">stride</span><span class="o">=</span><span class="n">stride</span><span class="p">,</span>
<span class="n">padding</span><span class="o">=</span><span class="p">(</span><span class="n">filter_size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span><span class="p">,</span>
<span class="n">groups</span><span class="o">=</span><span class="n">groups</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
<span class="n">param_attr</span><span class="o">=</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_weights&quot;</span><span class="p">),</span>
<span class="n">bias_attr</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_out&quot;</span><span class="p">)</span>
<span class="n">bn_name</span> <span class="o">=</span> <span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_bn&quot;</span>
<span class="k">return</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">batch_norm</span><span class="p">(</span>
<span class="nb">input</span><span class="o">=</span><span class="n">conv</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="n">act</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_output&#39;</span><span class="p">,</span>
<span class="n">param_attr</span><span class="o">=</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_scale&#39;</span><span class="p">),</span>
<span class="n">bias_attr</span><span class="o">=</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_offset&#39;</span><span class="p">),</span>
<span class="n">moving_mean_name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_mean&#39;</span><span class="p">,</span>
<span class="n">moving_variance_name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_variance&#39;</span><span class="p">,</span> <span class="p">)</span>
<span class="n">main_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="n">startup_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="c1"># X X O X O</span>
<span class="c1"># conv1--&gt;conv2--&gt;sum1--&gt;conv3--&gt;conv4--&gt;sum2--&gt;conv5--&gt;conv6</span>
<span class="c1"># | ^ | ^</span>
<span class="c1"># |____________| |____________________|</span>
<span class="c1">#</span>
<span class="c1"># X: prune output channels</span>
<span class="c1"># O: prune input channels</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">main_program</span><span class="p">,</span> <span class="n">startup_program</span><span class="p">):</span>
<span class="nb">input</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;image&quot;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">])</span>
<span class="n">conv1</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv1&quot;</span><span class="p">)</span>
<span class="n">conv2</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">conv1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv2&quot;</span><span class="p">)</span>
<span class="n">sum1</span> <span class="o">=</span> <span class="n">conv1</span> <span class="o">+</span> <span class="n">conv2</span>
<span class="n">conv3</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">sum1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv3&quot;</span><span class="p">)</span>
<span class="n">conv4</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">conv3</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv4&quot;</span><span class="p">)</span>
<span class="n">sum2</span> <span class="o">=</span> <span class="n">conv4</span> <span class="o">+</span> <span class="n">sum1</span>
<span class="n">conv5</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">sum2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv5&quot;</span><span class="p">)</span>
<span class="n">conv6</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">conv5</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv6&quot;</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s2">&quot;FLOPS: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">flops</span><span class="p">(</span><span class="n">main_program</span><span class="p">)))</span>
</pre></div>
<h2 id="model_size">model_size<a class="headerlink" href="#model_size" title="Permanent link">#</a></h2>
<blockquote>
<p>paddleslim.analysis.model_size(program) <a href="">源代码</a></p>
</blockquote>
<p>获得指定网络的参数数量。</p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>program(paddle.fluid.Program):</strong> 待分析的目标网络。更多关于Program的介绍请参考:<a href="https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/Program_cn.html#program">Program概念介绍</a></li>
</ul>
<p><strong>返回值:</strong></p>
<ul>
<li><strong>model_size(int):</strong> 整个网络的参数数量。</li>
</ul>
<p><strong>示例:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="kn">from</span> <span class="nn">paddle.fluid.param_attr</span> <span class="kn">import</span> <span class="n">ParamAttr</span>
<span class="kn">from</span> <span class="nn">paddleslim.analysis</span> <span class="kn">import</span> <span class="n">model_size</span>
<span class="k">def</span> <span class="nf">conv_layer</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span>
<span class="n">num_filters</span><span class="p">,</span>
<span class="n">filter_size</span><span class="p">,</span>
<span class="n">name</span><span class="p">,</span>
<span class="n">stride</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">groups</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span>
<span class="nb">input</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span>
<span class="n">num_filters</span><span class="o">=</span><span class="n">num_filters</span><span class="p">,</span>
<span class="n">filter_size</span><span class="o">=</span><span class="n">filter_size</span><span class="p">,</span>
<span class="n">stride</span><span class="o">=</span><span class="n">stride</span><span class="p">,</span>
<span class="n">padding</span><span class="o">=</span><span class="p">(</span><span class="n">filter_size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span><span class="p">,</span>
<span class="n">groups</span><span class="o">=</span><span class="n">groups</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
<span class="n">param_attr</span><span class="o">=</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_weights&quot;</span><span class="p">),</span>
<span class="n">bias_attr</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_out&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">conv</span>
<span class="n">main_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="n">startup_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="c1"># X X O X O</span>
<span class="c1"># conv1--&gt;conv2--&gt;sum1--&gt;conv3--&gt;conv4--&gt;sum2--&gt;conv5--&gt;conv6</span>
<span class="c1"># | ^ | ^</span>
<span class="c1"># |____________| |____________________|</span>
<span class="c1">#</span>
<span class="c1"># X: prune output channels</span>
<span class="c1"># O: prune input channels</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">main_program</span><span class="p">,</span> <span class="n">startup_program</span><span class="p">):</span>
<span class="nb">input</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;image&quot;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">])</span>
<span class="n">conv1</span> <span class="o">=</span> <span class="n">conv_layer</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv1&quot;</span><span class="p">)</span>
<span class="n">conv2</span> <span class="o">=</span> <span class="n">conv_layer</span><span class="p">(</span><span class="n">conv1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv2&quot;</span><span class="p">)</span>
<span class="n">sum1</span> <span class="o">=</span> <span class="n">conv1</span> <span class="o">+</span> <span class="n">conv2</span>
<span class="n">conv3</span> <span class="o">=</span> <span class="n">conv_layer</span><span class="p">(</span><span class="n">sum1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv3&quot;</span><span class="p">)</span>
<span class="n">conv4</span> <span class="o">=</span> <span class="n">conv_layer</span><span class="p">(</span><span class="n">conv3</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv4&quot;</span><span class="p">)</span>
<span class="n">sum2</span> <span class="o">=</span> <span class="n">conv4</span> <span class="o">+</span> <span class="n">sum1</span>
<span class="n">conv5</span> <span class="o">=</span> <span class="n">conv_layer</span><span class="p">(</span><span class="n">sum2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv5&quot;</span><span class="p">)</span>
<span class="n">conv6</span> <span class="o">=</span> <span class="n">conv_layer</span><span class="p">(</span><span class="n">conv5</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv6&quot;</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s2">&quot;FLOPS: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">model_size</span><span class="p">(</span><span class="n">main_program</span><span class="p">)))</span>
</pre></div>
<h2 id="tablelatencyevaluator">TableLatencyEvaluator<a class="headerlink" href="#tablelatencyevaluator" title="Permanent link">#</a></h2>
<blockquote>
<p>paddleslim.analysis.TableLatencyEvaluator(table_file, delimiter=",") <a href="">源代码</a></p>
</blockquote>
<p>基于硬件延时表的模型延时评估器。</p>
<p><strong>参数:</strong></p>
<ul>
<li>
<p><strong>table_file(str):</strong> 所使用的延时评估表的绝对路径。关于演示评估表格式请参考:<a href="../paddleslim/analysis/table_latency.md">PaddleSlim硬件延时评估表格式</a></p>
</li>
<li>
<p><strong>delimiter(str):</strong> 硬件延时评估表中,操作信息之前所使用的分割符,默认为英文字符逗号。</p>
</li>
</ul>
<p><strong>返回值:</strong></p>
<ul>
<li><strong>Evaluator:</strong> 硬件延时评估器的实例。</li>
</ul>
<blockquote>
<p>paddleslim.analysis.TableLatencyEvaluator.latency(graph) <a href="">源代码</a></p>
</blockquote>
<p>获得指定网络的预估延时。</p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>graph(Program):</strong> 待预估的目标网络。</li>
</ul>
<p><strong>返回值:</strong></p>
<ul>
<li><strong>latency:</strong> 目标网络的预估延时。</li>
</ul>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../single_distiller_api/" class="btn btn-neutral float-right" title="蒸馏">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../prune_api/" class="btn btn-neutral" title="剪枝"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../prune_api/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../single_distiller_api/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../..';</script>
<script src="../../js/theme.js" defer></script>
<script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body>
</html>
...@@ -7,23 +7,23 @@ ...@@ -7,23 +7,23 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico"> <link rel="shortcut icon" href="../../img/favicon.ico">
<title>PaddleSlim API文档导航 - PaddleSlim</title> <title>PaddleSlim API文档导航 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" /> <link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css"> <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script> <script>
// Current page data // Current page data
var mkdocs_page_name = "PaddleSlim API\u6587\u6863\u5bfc\u822a"; var mkdocs_page_name = "PaddleSlim API\u6587\u6863\u5bfc\u822a";
var mkdocs_page_input_path = "docs/api/api_guide.md"; var mkdocs_page_input_path = "api/api_guide.md";
var mkdocs_page_url = null; var mkdocs_page_url = null;
</script> </script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script> <script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script> <script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script> <script>hljs.initHighlightingOnLoad();</script>
...@@ -36,9 +36,9 @@ ...@@ -36,9 +36,9 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search"> <div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a> <a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search"> <div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get"> <form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" /> <input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form> </form>
</div> </div>
...@@ -50,98 +50,59 @@ ...@@ -50,98 +50,59 @@
<li class="toctree-l1"> <li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a> <a class="" href="../..">Home</a>
</li> </li>
<li class="toctree-l1"> <li class="toctree-l1">
<span class="caption-text">Docs</span> <span class="caption-text">教程</span>
<ul class="subnav"> <ul class="subnav">
<li class=""> <li class="">
<a class="" href="../../">PaddleSlim</a> <a class="" href="../../tutorials/quant_post_demo/">离线量化</a>
</li> </li>
<li class=""> <li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a> <a class="" href="../../tutorials/quant_aware_demo/">量化训练</a>
</li> </li>
<li class=" current"> <li class="">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3 current">
<a class="current" href="./">PaddleSlim API文档导航</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#paddleslim-api">PaddleSlim API文档导航</a></li>
<ul>
<li><a class="toctree-l5" href="#_1">模型分析</a></li>
<li><a class="toctree-l5" href="#_2">卷积通道剪裁</a></li>
<li><a class="toctree-l5" href="#_3">蒸馏</a></li>
<li><a class="toctree-l5" href="#_5">小模型结构搜索</a></li>
</ul>
</ul>
</li>
<li class="toctree-l3">
<a class="" href="../nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../search_space/">paddleslim.nas 提供的搜索空间:</a> <a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../single_distiller_api/">paddleslim.dist API文档</a> <a class="" href="../../tutorials/nas_demo/">SA搜索</a>
</li> </li>
</ul> </ul>
</li> </li>
<li class="">
<li class="toctree-l1">
<span class="caption-text">Tutorials</span>
<span class="caption-text">API</span>
<ul class="subnav"> <ul class="subnav">
<li class="toctree-l3"> <li class="">
<a class="" href="../../tutorials/demo_guide/">Demo guide</a> <a class="" href="../quantization_api/">量化</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../../tutorials/nas_demo/">网络结构搜索示例</a> <a class="" href="../prune_api/">剪枝</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../../tutorials/quant_aware_demo/">在线量化示例</a> <a class="" href="../analysis_api/">敏感度分析</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化示例</a> <a class="" href="../single_distiller_api/">蒸馏</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../../tutorials/quant_post_demo/">离线量化示例</a> <a class="" href="../nas_api/">SA搜索</a>
</li> </li>
</ul> <li class="">
<a class="" href="../search_space/">搜索空间</a>
</li> </li>
</ul> </ul>
</li> </li>
...@@ -156,7 +117,7 @@ ...@@ -156,7 +117,7 @@
<nav class="wy-nav-top" role="navigation" aria-label="top navigation"> <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a> <a href="../..">PaddleSlim Docs</a>
</nav> </nav>
...@@ -164,21 +125,16 @@ ...@@ -164,21 +125,16 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li> <li><a href="../..">Docs</a> &raquo;</li>
<li>Api &raquo;</li>
<li>Docs &raquo;</li>
<li>PaddleSlim API文档导航</li> <li>PaddleSlim API文档导航</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/api/api_guide.md"
class="icon icon-github"> Edit on GitHub</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
...@@ -186,10 +142,10 @@ ...@@ -186,10 +142,10 @@
<div role="main"> <div role="main">
<div class="section"> <div class="section">
<h1 id="paddleslim-api">PaddleSlim API文档导航</h1> <h1 id="paddleslim-api">PaddleSlim API文档导航<a class="headerlink" href="#paddleslim-api" title="Permanent link">#</a></h1>
<h2 id="_1"><a href="../analysis_api/">模型分析</a></h2> <h2 id="_1"><a href="../analysis_api/">模型分析</a><a class="headerlink" href="#_1" title="Permanent link">#</a></h2>
<h2 id="_2"><a href="../prune_api/">卷积通道剪裁</a></h2> <h2 id="_2"><a href="../prune_api/">卷积通道剪裁</a><a class="headerlink" href="#_2" title="Permanent link">#</a></h2>
<h2 id="_3"><a href="">蒸馏</a></h2> <h2 id="_3"><a href="">蒸馏</a><a class="headerlink" href="#_3" title="Permanent link">#</a></h2>
<ul> <ul>
<li> <li>
<p><a href="../single_distiller_api/">单进程蒸馏</a></p> <p><a href="../single_distiller_api/">单进程蒸馏</a></p>
...@@ -198,7 +154,7 @@ ...@@ -198,7 +154,7 @@
<p><a href="../prune_api/">通道剪裁</a></p> <p><a href="../prune_api/">通道剪裁</a></p>
</li> </li>
</ul> </ul>
<h3 id="_4"><a href="../quantization_api/">量化</a></h3> <h3 id="_4"><a href="../quantization_api/">量化</a><a class="headerlink" href="#_4" title="Permanent link">#</a></h3>
<ul> <ul>
<li> <li>
<p><a href="../quantization_api/#量化训练API">量化训练</a></p> <p><a href="../quantization_api/#量化训练API">量化训练</a></p>
...@@ -210,7 +166,7 @@ ...@@ -210,7 +166,7 @@
<p><a href="../quantization_api/#Embedding量化API">embedding量化</a></p> <p><a href="../quantization_api/#Embedding量化API">embedding量化</a></p>
</li> </li>
</ul> </ul>
<h2 id="_5"><a href="">小模型结构搜索</a></h2> <h2 id="_5"><a href="">小模型结构搜索</a><a class="headerlink" href="#_5" title="Permanent link">#</a></h2>
<ul> <ul>
<li><a href="../nas_api/">nas API</a></li> <li><a href="../nas_api/">nas API</a></li>
<li><a href="../search_space/">SearchSpace</a></li> <li><a href="../search_space/">SearchSpace</a></li>
...@@ -220,15 +176,6 @@ ...@@ -220,15 +176,6 @@
</div> </div>
<footer> <footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../nas_api/" class="btn btn-neutral float-right" title="paddleslim.nas API文档">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../analysis_api/" class="btn btn-neutral" title="模型分析API文档"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/> <hr/>
...@@ -250,17 +197,17 @@ ...@@ -250,17 +197,17 @@
<div class="rst-versions" role="note" style="cursor: pointer"> <div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version"> <span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../analysis_api/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../nas_api/" style="color: #fcfcfc">Next &raquo;</a></span>
</span> </span>
</div> </div>
<script>var base_url = '../../..';</script> <script>var base_url = '../..';</script>
<script src="../../../js/theme.js" defer></script> <script src="../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script> <script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body> </body>
</html> </html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>SA搜索 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "SA\u641c\u7d22";
var mkdocs_page_input_path = "api/nas_api.md";
var mkdocs_page_url = null;
</script>
<script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../..">Home</a>
</li>
<li class="toctree-l1">
<span class="caption-text">教程</span>
<ul class="subnav">
<li class="">
<a class="" href="../../tutorials/quant_post_demo/">离线量化</a>
</li>
<li class="">
<a class="" href="../../tutorials/quant_aware_demo/">量化训练</a>
</li>
<li class="">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化</a>
</li>
<li class="">
<a class="" href="../../tutorials/nas_demo/">SA搜索</a>
</li>
</ul>
</li>
<li class="toctree-l1">
<span class="caption-text">API</span>
<ul class="subnav">
<li class="">
<a class="" href="../quantization_api/">量化</a>
</li>
<li class="">
<a class="" href="../prune_api/">剪枝</a>
</li>
<li class="">
<a class="" href="../analysis_api/">敏感度分析</a>
</li>
<li class="">
<a class="" href="../single_distiller_api/">蒸馏</a>
</li>
<li class=" current">
<a class="current" href="./">SA搜索</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#paddleslimnas-api">paddleslim.nas API文档</a></li>
<ul>
<li><a class="toctree-l4" href="#sanas-api">SANAS API文档</a></li>
<li><a class="toctree-l4" href="#class-sanas">class SANAS</a></li>
</ul>
</ul>
</li>
<li class="">
<a class="" href="../search_space/">搜索空间</a>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../..">PaddleSlim Docs</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../..">Docs</a> &raquo;</li>
<li>API &raquo;</li>
<li>SA搜索</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/api/nas_api.md"
class="icon icon-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="paddleslimnas-api">paddleslim.nas API文档<a class="headerlink" href="#paddleslimnas-api" title="Permanent link">#</a></h1>
<h2 id="sanas-api">SANAS API文档<a class="headerlink" href="#sanas-api" title="Permanent link">#</a></h2>
<h2 id="class-sanas">class SANAS<a class="headerlink" href="#class-sanas" title="Permanent link">#</a></h2>
<p>SANAS(Simulated Annealing Neural Architecture Search)是基于模拟退火算法进行模型结构搜索的算法,一般用于离散搜索任务。</p>
<hr />
<blockquote>
<p>paddleslim.nas.SANAS(configs, server_addr, init_temperature, reduce_rate, search_steps, save_checkpoint, load_checkpoint, is_server)</p>
</blockquote>
<p><strong>参数:</strong>
- <strong>configs(list<tuple>):</strong> 搜索空间配置列表,格式是<code>[(key, {input_size, output_size, block_num, block_mask})]</code>或者<code>[(key)]</code>(MobileNetV2、MobilenetV1和ResNet的搜索空间使用和原本网络结构相同的搜索空间,所以仅需指定<code>key</code>即可), <code>input_size</code><code>output_size</code>表示输入和输出的特征图的大小,<code>block_num</code>是指搜索网络中的block数量,<code>block_mask</code>是一组由0和1组成的列表,0代表不进行下采样的block,1代表下采样的block。 更多paddleslim提供的搜索空间配置可以参考。
- <strong>server_addr(tuple):</strong> SANAS的地址,包括server的ip地址和端口号,如果ip地址为None或者为""的话则默认使用本机ip。默认:("", 8881)。
- <strong>init_temperature(float):</strong> 基于模拟退火进行搜索的初始温度。默认:100。
- <strong>reduce_rate(float):</strong> 基于模拟退火进行搜索的衰减率。默认:0.85。
- <strong>search_steps(int):</strong> 搜索过程迭代的次数。默认:300。
- <strong>save_checkpoint(str|None):</strong> 保存checkpoint的文件目录,如果设置为None的话则不保存checkpoint。默认:<code>./nas_checkpoint</code>
- <strong>load_checkpoint(str|None):</strong> 加载checkpoint的文件目录,如果设置为None的话则不加载checkpoint。默认:None。
- <strong>is_server(bool):</strong> 当前实例是否要启动一个server。默认:True。</p>
<p><strong>返回:</strong>
一个SANAS类的实例</p>
<p><strong>示例代码:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">from</span> <span class="nn">paddleslim.nas</span> <span class="kn">import</span> <span class="n">SANAS</span>
<span class="n">config</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">&#39;MobileNetV2Space&#39;</span><span class="p">)]</span>
<span class="n">sanas</span> <span class="o">=</span> <span class="n">SANAS</span><span class="p">(</span><span class="n">config</span><span class="o">=</span><span class="n">config</span><span class="p">)</span>
</pre></div>
<hr />
<blockquote>
<p>tokens2arch(tokens)
通过一组token得到实际的模型结构,一般用来把搜索到最优的token转换为模型结构用来做最后的训练。</p>
</blockquote>
<p><strong>参数:</strong>
- <strong>tokens(list):</strong> 一组token。</p>
<p><strong>返回</strong>
返回一个模型结构实例。</p>
<p><strong>示例代码:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="nb">input</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;input&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</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="mi">32</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="s1">&#39;float32&#39;</span><span class="p">)</span>
<span class="n">archs</span> <span class="o">=</span> <span class="n">sanas</span><span class="o">.</span><span class="n">token2arch</span><span class="p">(</span><span class="n">tokens</span><span class="p">)</span>
<span class="k">for</span> <span class="n">arch</span> <span class="ow">in</span> <span class="n">archs</span><span class="p">:</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">arch</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
<span class="nb">input</span> <span class="o">=</span> <span class="n">output</span>
</pre></div>
<hr />
<blockquote>
<p>next_archs():
获取下一组模型结构。</p>
</blockquote>
<p><strong>返回</strong>
返回模型结构实例的列表,形式为list。</p>
<p><strong>示例代码:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="nb">input</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;input&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</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="mi">32</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="s1">&#39;float32&#39;</span><span class="p">)</span>
<span class="n">archs</span> <span class="o">=</span> <span class="n">sanas</span><span class="o">.</span><span class="n">next_archs</span><span class="p">()</span>
<span class="k">for</span> <span class="n">arch</span> <span class="ow">in</span> <span class="n">archs</span><span class="p">:</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">arch</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
<span class="nb">input</span> <span class="o">=</span> <span class="n">output</span>
</pre></div>
<hr />
<blockquote>
<p>reward(score):
把当前模型结构的得分情况回传。</p>
</blockquote>
<p><strong>参数:</strong>
<strong>score<float>:</strong> 当前模型的得分,分数越大越好。</p>
<p><strong>返回</strong>
模型结构更新成功或者失败,成功则返回<code>True</code>,失败则返回<code>False</code></p>
<p><strong>代码示例</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">paddle</span>
<span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="kn">from</span> <span class="nn">paddleslim.nas</span> <span class="kn">import</span> <span class="n">SANAS</span>
<span class="kn">from</span> <span class="nn">paddleslim.analysis</span> <span class="kn">import</span> <span class="n">flops</span>
<span class="n">max_flops</span> <span class="o">=</span> <span class="mi">321208544</span>
<span class="n">batch_size</span> <span class="o">=</span> <span class="mi">256</span>
<span class="c1"># 搜索空间配置</span>
<span class="n">config</span><span class="o">=</span><span class="p">[(</span><span class="s1">&#39;MobileNetV2Space&#39;</span><span class="p">)]</span>
<span class="c1"># 实例化SANAS</span>
<span class="n">sa_nas</span> <span class="o">=</span> <span class="n">SANAS</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">server_addr</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="mi">8887</span><span class="p">),</span> <span class="n">init_temperature</span><span class="o">=</span><span class="mf">10.24</span><span class="p">,</span> <span class="n">reduce_rate</span><span class="o">=</span><span class="mf">0.85</span><span class="p">,</span> <span class="n">search_steps</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">is_server</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">archs</span> <span class="o">=</span> <span class="n">sa_nas</span><span class="o">.</span><span class="n">next_archs</span><span class="p">()</span>
<span class="n">train_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="n">test_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="n">startup_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="c1">### 构造训练program</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">train_program</span><span class="p">,</span> <span class="n">startup_program</span><span class="p">):</span>
<span class="n">image</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;image&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</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="mi">32</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="s1">&#39;float32&#39;</span><span class="p">)</span>
<span class="n">label</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;label&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="s1">&#39;int64&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">arch</span> <span class="ow">in</span> <span class="n">archs</span><span class="p">:</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">arch</span><span class="p">(</span><span class="n">image</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">fc</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">act</span><span class="o">=</span><span class="s2">&quot;softmax&quot;</span><span class="p">)</span>
<span class="n">softmax_out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">softmax</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="n">out</span><span class="p">,</span> <span class="n">use_cudnn</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">cost</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">cross_entropy</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="n">softmax_out</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">)</span>
<span class="n">avg_cost</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">cost</span><span class="p">)</span>
<span class="n">acc_top1</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">accuracy</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="n">softmax_out</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="c1">### 构造测试program</span>
<span class="n">test_program</span> <span class="o">=</span> <span class="n">train_program</span><span class="o">.</span><span class="n">clone</span><span class="p">(</span><span class="n">for_test</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c1">### 定义优化器</span>
<span class="n">sgd</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">optimizer</span><span class="o">.</span><span class="n">SGD</span><span class="p">(</span><span class="n">learning_rate</span><span class="o">=</span><span class="mf">1e-3</span><span class="p">)</span>
<span class="n">sgd</span><span class="o">.</span><span class="n">minimize</span><span class="p">(</span><span class="n">avg_cost</span><span class="p">)</span>
<span class="c1">### 增加限制条件,如果没有则进行无限制搜索</span>
<span class="k">if</span> <span class="n">flops</span><span class="p">(</span><span class="n">train_program</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">max_flops</span><span class="p">:</span>
<span class="k">continue</span>
<span class="c1">### 定义代码是在cpu上运行</span>
<span class="n">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
<span class="n">exe</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Executor</span><span class="p">(</span><span class="n">place</span><span class="p">)</span>
<span class="n">exe</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">startup_program</span><span class="p">)</span>
<span class="c1">### 定义训练输入数据</span>
<span class="n">train_reader</span> <span class="o">=</span> <span class="n">paddle</span><span class="o">.</span><span class="n">batch</span><span class="p">(</span>
<span class="n">paddle</span><span class="o">.</span><span class="n">reader</span><span class="o">.</span><span class="n">shuffle</span><span class="p">(</span>
<span class="n">paddle</span><span class="o">.</span><span class="n">dataset</span><span class="o">.</span><span class="n">cifar</span><span class="o">.</span><span class="n">train10</span><span class="p">(</span><span class="n">cycle</span><span class="o">=</span><span class="bp">False</span><span class="p">),</span> <span class="n">buf_size</span><span class="o">=</span><span class="mi">1024</span><span class="p">),</span>
<span class="n">batch_size</span><span class="o">=</span><span class="n">batch_size</span><span class="p">,</span>
<span class="n">drop_last</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c1">### 定义预测输入数据</span>
<span class="n">test_reader</span> <span class="o">=</span> <span class="n">paddle</span><span class="o">.</span><span class="n">batch</span><span class="p">(</span>
<span class="n">paddle</span><span class="o">.</span><span class="n">dataset</span><span class="o">.</span><span class="n">cifar</span><span class="o">.</span><span class="n">test10</span><span class="p">(</span><span class="n">cycle</span><span class="o">=</span><span class="bp">False</span><span class="p">),</span>
<span class="n">batch_size</span><span class="o">=</span><span class="n">batch_size</span><span class="p">,</span>
<span class="n">drop_last</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">train_feeder</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">DataFeeder</span><span class="p">([</span><span class="n">image</span><span class="p">,</span> <span class="n">label</span><span class="p">],</span> <span class="n">place</span><span class="p">,</span> <span class="n">program</span><span class="o">=</span><span class="n">train_program</span><span class="p">)</span>
<span class="n">test_feeder</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">DataFeeder</span><span class="p">([</span><span class="n">image</span><span class="p">,</span> <span class="n">label</span><span class="p">],</span> <span class="n">place</span><span class="p">,</span> <span class="n">program</span><span class="o">=</span><span class="n">test_program</span><span class="p">)</span>
<span class="c1">### 开始训练,每个搜索结果训练5个epoch</span>
<span class="k">for</span> <span class="n">epoch_id</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
<span class="k">for</span> <span class="n">batch_id</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">train_reader</span><span class="p">()):</span>
<span class="n">fetches</span> <span class="o">=</span> <span class="p">[</span><span class="n">avg_cost</span><span class="o">.</span><span class="n">name</span><span class="p">]</span>
<span class="n">outs</span> <span class="o">=</span> <span class="n">exe</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">train_program</span><span class="p">,</span>
<span class="n">feed</span><span class="o">=</span><span class="n">train_feeder</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="n">data</span><span class="p">),</span>
<span class="n">fetch_list</span><span class="o">=</span><span class="n">fetches</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">batch_id</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s1">&#39;TRAIN: steps: {}, epoch: {}, batch: {}, cost: {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="n">epoch_id</span><span class="p">,</span> <span class="n">batch_id</span><span class="p">,</span> <span class="n">outs</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="c1">### 开始预测,得到最终的测试结果作为score回传给sa_nas</span>
<span class="n">reward</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">batch_id</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">test_reader</span><span class="p">()):</span>
<span class="n">test_fetches</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">avg_cost</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">acc_top1</span><span class="o">.</span><span class="n">name</span>
<span class="p">]</span>
<span class="n">batch_reward</span> <span class="o">=</span> <span class="n">exe</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">test_program</span><span class="p">,</span>
<span class="n">feed</span><span class="o">=</span><span class="n">test_feeder</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="n">data</span><span class="p">),</span>
<span class="n">fetch_list</span><span class="o">=</span><span class="n">test_fetches</span><span class="p">)</span>
<span class="n">reward_avg</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">batch_reward</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">reward</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">reward_avg</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s1">&#39;TEST: step: {}, batch: {}, avg_cost: {}, acc_top1: {}&#39;</span><span class="o">.</span>
<span class="n">format</span><span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="n">batch_id</span><span class="p">,</span> <span class="n">batch_reward</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">batch_reward</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
<span class="n">finally_reward</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">reward</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span>
<span class="s1">&#39;FINAL TEST: avg_cost: {}, acc_top1: {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">finally_reward</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">finally_reward</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
<span class="c1">### 回传score</span>
<span class="n">sa_nas</span><span class="o">.</span><span class="n">reward</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">finally_reward</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
</pre></div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../search_space/" class="btn btn-neutral float-right" title="搜索空间">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../single_distiller_api/" class="btn btn-neutral" title="蒸馏"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../single_distiller_api/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../search_space/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../..';</script>
<script src="../../js/theme.js" defer></script>
<script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>剪枝 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "\u526a\u679d";
var mkdocs_page_input_path = "api/prune_api.md";
var mkdocs_page_url = null;
</script>
<script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../..">Home</a>
</li>
<li class="toctree-l1">
<span class="caption-text">教程</span>
<ul class="subnav">
<li class="">
<a class="" href="../../tutorials/quant_post_demo/">离线量化</a>
</li>
<li class="">
<a class="" href="../../tutorials/quant_aware_demo/">量化训练</a>
</li>
<li class="">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化</a>
</li>
<li class="">
<a class="" href="../../tutorials/nas_demo/">SA搜索</a>
</li>
</ul>
</li>
<li class="toctree-l1">
<span class="caption-text">API</span>
<ul class="subnav">
<li class="">
<a class="" href="../quantization_api/">量化</a>
</li>
<li class=" current">
<a class="current" href="./">剪枝</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#api">卷积通道剪裁API文档</a></li>
<ul>
<li><a class="toctree-l4" href="#class-pruner">class Pruner</a></li>
<li><a class="toctree-l4" href="#sensitivity">sensitivity</a></li>
<li><a class="toctree-l4" href="#merge_sensitive">merge_sensitive</a></li>
<li><a class="toctree-l4" href="#load_sensitivities">load_sensitivities</a></li>
<li><a class="toctree-l4" href="#get_ratios_by_losssensitivities-loss">get_ratios_by_loss(sensitivities, loss)</a></li>
</ul>
</ul>
</li>
<li class="">
<a class="" href="../analysis_api/">敏感度分析</a>
</li>
<li class="">
<a class="" href="../single_distiller_api/">蒸馏</a>
</li>
<li class="">
<a class="" href="../nas_api/">SA搜索</a>
</li>
<li class="">
<a class="" href="../search_space/">搜索空间</a>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../..">PaddleSlim Docs</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../..">Docs</a> &raquo;</li>
<li>API &raquo;</li>
<li>剪枝</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/api/prune_api.md"
class="icon icon-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="api">卷积通道剪裁API文档<a class="headerlink" href="#api" title="Permanent link">#</a></h1>
<h2 id="class-pruner">class Pruner<a class="headerlink" href="#class-pruner" title="Permanent link">#</a></h2>
<hr />
<blockquote>
<p>paddleslim.prune.Pruner(criterion="l1_norm")<a href="">源代码</a></p>
</blockquote>
<p>对卷积网络的通道进行一次剪裁。剪裁一个卷积层的通道,是指剪裁该卷积层输出的通道。卷积层的权重形状为<code>[output_channel, input_channel, kernel_size, kernel_size]</code>,通过剪裁该权重的第一纬度达到剪裁输出通道数的目的。</p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>criterion:</strong> 评估一个卷积层内通道重要性所参考的指标。目前仅支持<code>l1_norm</code>。默认为<code>l1_norm</code></li>
</ul>
<p><strong>返回:</strong> 一个Pruner类的实例</p>
<p><strong>示例代码:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">from</span> <span class="nn">paddleslim.prune</span> <span class="kn">import</span> <span class="n">Pruner</span>
<span class="n">pruner</span> <span class="o">=</span> <span class="n">Pruner</span><span class="p">()</span>
</pre></div>
<hr />
<blockquote>
<p>prune(program, scope, params, ratios, place=None, lazy=False, only_graph=False, param_backup=False, param_shape_backup=False)</p>
</blockquote>
<p>对目标网络的一组卷积层的权重进行裁剪。</p>
<p><strong>参数:</strong></p>
<ul>
<li>
<p><strong>program(paddle.fluid.Program):</strong> 要裁剪的目标网络。更多关于Program的介绍请参考:<a href="https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/Program_cn.html#program">Program概念介绍</a></p>
</li>
<li>
<p><strong>scope(paddle.fluid.Scope):</strong> 要裁剪的权重所在的<code>scope</code>,Paddle中用<code>scope</code>实例存放模型参数和运行时变量的值。Scope中的参数值会被<code>inplace</code>的裁剪。更多介绍请参考<a href="">Scope概念介绍</a></p>
</li>
<li>
<p><strong>params(list<str>):</strong> 需要被裁剪的卷积层的参数的名称列表。可以通过以下方式查看模型中所有参数的名称:</p>
</li>
</ul>
<div class="codehilite"><pre><span></span><span class="k">for</span> <span class="nv">block</span> <span class="nv">in</span> <span class="nv">program</span>.<span class="nv">blocks</span>:
<span class="k">for</span> <span class="nv">param</span> <span class="nv">in</span> <span class="nv">block</span>.<span class="nv">all_parameters</span><span class="ss">()</span>:
<span class="nv">print</span><span class="ss">(</span><span class="s2">&quot;</span><span class="s">param: {}; shape: {}</span><span class="s2">&quot;</span>.<span class="nv">format</span><span class="ss">(</span><span class="nv">param</span>.<span class="nv">name</span>, <span class="nv">param</span>.<span class="nv">shape</span><span class="ss">))</span>
</pre></div>
<ul>
<li>
<p><strong>ratios(list<float>):</strong> 用于裁剪<code>params</code>的剪切率,类型为列表。该列表长度必须与<code>params</code>的长度一致。</p>
</li>
<li>
<p><strong>place(paddle.fluid.Place):</strong> 待裁剪参数所在的设备位置,可以是<code>CUDAPlace</code><code>CPUPlace</code><a href="">Place概念介绍</a></p>
</li>
<li>
<p><strong>lazy(bool):</strong> <code>lazy</code>为True时,通过将指定通道的参数置零达到裁剪的目的,参数的<code>shape保持不变</code><code>lazy</code>为False时,直接将要裁的通道的参数删除,参数的<code>shape</code>会发生变化。</p>
</li>
<li>
<p><strong>only_graph(bool):</strong> 是否只裁剪网络结构。在Paddle中,Program定义了网络结构,Scope存储参数的数值。一个Scope实例可以被多个Program使用,比如定义了训练网络的Program和定义了测试网络的Program是使用同一个Scope实例的。<code>only_graph</code>为True时,只对Program中定义的卷积的通道进行剪裁;<code>only_graph</code>为false时,Scope中卷积参数的数值也会被剪裁。默认为False。</p>
</li>
<li>
<p><strong>param_backup(bool):</strong> 是否返回对参数值的备份。默认为False。</p>
</li>
<li>
<p><strong>param_shape_backup(bool):</strong> 是否返回对参数<code>shape</code>的备份。默认为False。</p>
</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>
<p><strong>pruned_program(paddle.fluid.Program):</strong> 被裁剪后的Program。</p>
</li>
<li>
<p><strong>param_backup(dict):</strong> 对参数数值的备份,用于恢复Scope中的参数数值。</p>
</li>
<li>
<p><strong>param_shape_backup(dict):</strong> 对参数形状的备份。</p>
</li>
</ul>
<p><strong>示例:</strong></p>
<p>点击<a href="https://aistudio.baidu.com/aistudio/projectDetail/200786">AIStudio</a>执行以下示例代码。</p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="kn">from</span> <span class="nn">paddle.fluid.param_attr</span> <span class="kn">import</span> <span class="n">ParamAttr</span>
<span class="kn">from</span> <span class="nn">paddleslim.prune</span> <span class="kn">import</span> <span class="n">Pruner</span>
<span class="k">def</span> <span class="nf">conv_bn_layer</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span>
<span class="n">num_filters</span><span class="p">,</span>
<span class="n">filter_size</span><span class="p">,</span>
<span class="n">name</span><span class="p">,</span>
<span class="n">stride</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">groups</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span>
<span class="nb">input</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span>
<span class="n">num_filters</span><span class="o">=</span><span class="n">num_filters</span><span class="p">,</span>
<span class="n">filter_size</span><span class="o">=</span><span class="n">filter_size</span><span class="p">,</span>
<span class="n">stride</span><span class="o">=</span><span class="n">stride</span><span class="p">,</span>
<span class="n">padding</span><span class="o">=</span><span class="p">(</span><span class="n">filter_size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span><span class="p">,</span>
<span class="n">groups</span><span class="o">=</span><span class="n">groups</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
<span class="n">param_attr</span><span class="o">=</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_weights&quot;</span><span class="p">),</span>
<span class="n">bias_attr</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_out&quot;</span><span class="p">)</span>
<span class="n">bn_name</span> <span class="o">=</span> <span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_bn&quot;</span>
<span class="k">return</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">batch_norm</span><span class="p">(</span>
<span class="nb">input</span><span class="o">=</span><span class="n">conv</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="n">act</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_output&#39;</span><span class="p">,</span>
<span class="n">param_attr</span><span class="o">=</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_scale&#39;</span><span class="p">),</span>
<span class="n">bias_attr</span><span class="o">=</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_offset&#39;</span><span class="p">),</span>
<span class="n">moving_mean_name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_mean&#39;</span><span class="p">,</span>
<span class="n">moving_variance_name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_variance&#39;</span><span class="p">,</span> <span class="p">)</span>
<span class="n">main_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="n">startup_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="c1"># X X O X O</span>
<span class="c1"># conv1--&gt;conv2--&gt;sum1--&gt;conv3--&gt;conv4--&gt;sum2--&gt;conv5--&gt;conv6</span>
<span class="c1"># | ^ | ^</span>
<span class="c1"># |____________| |____________________|</span>
<span class="c1">#</span>
<span class="c1"># X: prune output channels</span>
<span class="c1"># O: prune input channels</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">main_program</span><span class="p">,</span> <span class="n">startup_program</span><span class="p">):</span>
<span class="nb">input</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;image&quot;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">])</span>
<span class="n">conv1</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv1&quot;</span><span class="p">)</span>
<span class="n">conv2</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">conv1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv2&quot;</span><span class="p">)</span>
<span class="n">sum1</span> <span class="o">=</span> <span class="n">conv1</span> <span class="o">+</span> <span class="n">conv2</span>
<span class="n">conv3</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">sum1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv3&quot;</span><span class="p">)</span>
<span class="n">conv4</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">conv3</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv4&quot;</span><span class="p">)</span>
<span class="n">sum2</span> <span class="o">=</span> <span class="n">conv4</span> <span class="o">+</span> <span class="n">sum1</span>
<span class="n">conv5</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">sum2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv5&quot;</span><span class="p">)</span>
<span class="n">conv6</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">conv5</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv6&quot;</span><span class="p">)</span>
<span class="n">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
<span class="n">exe</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Executor</span><span class="p">(</span><span class="n">place</span><span class="p">)</span>
<span class="n">scope</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Scope</span><span class="p">()</span>
<span class="n">exe</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">startup_program</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="n">scope</span><span class="p">)</span>
<span class="n">pruner</span> <span class="o">=</span> <span class="n">Pruner</span><span class="p">()</span>
<span class="n">main_program</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">pruner</span><span class="o">.</span><span class="n">prune</span><span class="p">(</span>
<span class="n">main_program</span><span class="p">,</span>
<span class="n">scope</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;conv4_weights&quot;</span><span class="p">],</span>
<span class="n">ratios</span><span class="o">=</span><span class="p">[</span><span class="mf">0.5</span><span class="p">],</span>
<span class="n">place</span><span class="o">=</span><span class="n">place</span><span class="p">,</span>
<span class="n">lazy</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
<span class="n">only_graph</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
<span class="n">param_backup</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
<span class="n">param_shape_backup</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">main_program</span><span class="o">.</span><span class="n">global_block</span><span class="p">()</span><span class="o">.</span><span class="n">all_parameters</span><span class="p">():</span>
<span class="k">if</span> <span class="s2">&quot;weights&quot;</span> <span class="ow">in</span> <span class="n">param</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">&quot;param name: {}; param shape: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">param</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="o">.</span><span class="n">shape</span><span class="p">))</span>
</pre></div>
<hr />
<h2 id="sensitivity">sensitivity<a class="headerlink" href="#sensitivity" title="Permanent link">#</a></h2>
<blockquote>
<p>paddleslim.prune.sensitivity(program, place, param_names, eval_func, sensitivities_file=None, pruned_ratios=None) <a href="">源代码</a></p>
</blockquote>
<p>计算网络中每个卷积层的敏感度。每个卷积层的敏感度信息统计方法为:依次剪掉当前卷积层不同比例的输出通道数,在测试集上计算剪裁后的精度损失。得到敏感度信息后,可以通过观察或其它方式确定每层卷积的剪裁率。</p>
<p><strong>参数:</strong></p>
<ul>
<li>
<p><strong>program(paddle.fluid.Program):</strong> 待评估的目标网络。更多关于Program的介绍请参考:<a href="https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/Program_cn.html#program">Program概念介绍</a></p>
</li>
<li>
<p><strong>place(paddle.fluid.Place):</strong> 待分析的参数所在的设备位置,可以是<code>CUDAPlace</code><code>CPUPlace</code><a href="">Place概念介绍</a></p>
</li>
<li>
<p><strong>param_names(list<str>):</strong> 待分析的卷积层的参数的名称列表。可以通过以下方式查看模型中所有参数的名称:</p>
</li>
</ul>
<div class="codehilite"><pre><span></span><span class="k">for</span> <span class="nv">block</span> <span class="nv">in</span> <span class="nv">program</span>.<span class="nv">blocks</span>:
<span class="k">for</span> <span class="nv">param</span> <span class="nv">in</span> <span class="nv">block</span>.<span class="nv">all_parameters</span><span class="ss">()</span>:
<span class="nv">print</span><span class="ss">(</span><span class="s2">&quot;</span><span class="s">param: {}; shape: {}</span><span class="s2">&quot;</span>.<span class="nv">format</span><span class="ss">(</span><span class="nv">param</span>.<span class="nv">name</span>, <span class="nv">param</span>.<span class="nv">shape</span><span class="ss">))</span>
</pre></div>
<ul>
<li>
<p><strong>eval_func(function):</strong> 用于评估裁剪后模型效果的回调函数。该回调函数接受被裁剪后的<code>program</code>为参数,返回一个表示当前program的精度,用以计算当前裁剪带来的精度损失。</p>
</li>
<li>
<p><strong>sensitivities_file(str):</strong> 保存敏感度信息的本地文件系统的文件。在敏感度计算过程中,会持续将新计算出的敏感度信息追加到该文件中。重启任务后,文件中已有敏感度信息不会被重复计算。该文件可以用<code>pickle</code>加载。</p>
</li>
<li>
<p><strong>pruned_ratios(list<float>):</strong> 计算卷积层敏感度信息时,依次剪掉的通道数比例。默认为[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]。</p>
</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li><strong>sensitivities(dict):</strong> 存放敏感度信息的dict,其格式为:</li>
</ul>
<div class="codehilite"><pre><span></span><span class="err">{</span><span class="ss">&quot;weight_0&quot;</span><span class="p">:</span>
<span class="err">{</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">:</span> <span class="mi">0</span><span class="p">.</span><span class="mi">22</span><span class="p">,</span>
<span class="mi">0</span><span class="p">.</span><span class="mi">2</span><span class="p">:</span> <span class="mi">0</span><span class="p">.</span><span class="mi">33</span>
<span class="err">}</span><span class="p">,</span>
<span class="ss">&quot;weight_1&quot;</span><span class="p">:</span>
<span class="err">{</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">:</span> <span class="mi">0</span><span class="p">.</span><span class="mi">21</span><span class="p">,</span>
<span class="mi">0</span><span class="p">.</span><span class="mi">2</span><span class="p">:</span> <span class="mi">0</span><span class="p">.</span><span class="mi">4</span>
<span class="err">}</span>
<span class="err">}</span>
</pre></div>
<p>其中,<code>weight_0</code>是卷积层参数的名称,sensitivities['weight_0']的<code>value</code>为剪裁比例,<code>value</code>为精度损失的比例。</p>
<p><strong>示例:</strong></p>
<p>点击<a href="https://aistudio.baidu.com/aistudio/projectdetail/201401">AIStudio</a>运行以下示例代码。</p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="kn">from</span> <span class="nn">paddle.fluid.param_attr</span> <span class="kn">import</span> <span class="n">ParamAttr</span>
<span class="kn">from</span> <span class="nn">paddleslim.prune</span> <span class="kn">import</span> <span class="n">sensitivity</span>
<span class="kn">import</span> <span class="nn">paddle.dataset.mnist</span> <span class="kn">as</span> <span class="nn">reader</span>
<span class="k">def</span> <span class="nf">conv_bn_layer</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span>
<span class="n">num_filters</span><span class="p">,</span>
<span class="n">filter_size</span><span class="p">,</span>
<span class="n">name</span><span class="p">,</span>
<span class="n">stride</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">groups</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span>
<span class="nb">input</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span>
<span class="n">num_filters</span><span class="o">=</span><span class="n">num_filters</span><span class="p">,</span>
<span class="n">filter_size</span><span class="o">=</span><span class="n">filter_size</span><span class="p">,</span>
<span class="n">stride</span><span class="o">=</span><span class="n">stride</span><span class="p">,</span>
<span class="n">padding</span><span class="o">=</span><span class="p">(</span><span class="n">filter_size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span><span class="p">,</span>
<span class="n">groups</span><span class="o">=</span><span class="n">groups</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
<span class="n">param_attr</span><span class="o">=</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_weights&quot;</span><span class="p">),</span>
<span class="n">bias_attr</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_out&quot;</span><span class="p">)</span>
<span class="n">bn_name</span> <span class="o">=</span> <span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_bn&quot;</span>
<span class="k">return</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">batch_norm</span><span class="p">(</span>
<span class="nb">input</span><span class="o">=</span><span class="n">conv</span><span class="p">,</span>
<span class="n">act</span><span class="o">=</span><span class="n">act</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_output&#39;</span><span class="p">,</span>
<span class="n">param_attr</span><span class="o">=</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_scale&#39;</span><span class="p">),</span>
<span class="n">bias_attr</span><span class="o">=</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_offset&#39;</span><span class="p">),</span>
<span class="n">moving_mean_name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_mean&#39;</span><span class="p">,</span>
<span class="n">moving_variance_name</span><span class="o">=</span><span class="n">bn_name</span> <span class="o">+</span> <span class="s1">&#39;_variance&#39;</span><span class="p">,</span> <span class="p">)</span>
<span class="n">main_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="n">startup_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="c1"># X X O X O</span>
<span class="c1"># conv1--&gt;conv2--&gt;sum1--&gt;conv3--&gt;conv4--&gt;sum2--&gt;conv5--&gt;conv6</span>
<span class="c1"># | ^ | ^</span>
<span class="c1"># |____________| |____________________|</span>
<span class="c1">#</span>
<span class="c1"># X: prune output channels</span>
<span class="c1"># O: prune input channels</span>
<span class="n">image_shape</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">28</span><span class="p">,</span><span class="mi">28</span><span class="p">]</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">main_program</span><span class="p">,</span> <span class="n">startup_program</span><span class="p">):</span>
<span class="n">image</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;image&#39;</span><span class="p">,</span> <span class="kp">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</span><span class="p">]</span><span class="o">+</span><span class="n">image_shape</span><span class="p">,</span> <span class="kp">dtype</span><span class="o">=</span><span class="s1">&#39;float32&#39;</span><span class="p">)</span>
<span class="n">label</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;label&#39;</span><span class="p">,</span> <span class="kp">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="kp">dtype</span><span class="o">=</span><span class="s1">&#39;int64&#39;</span><span class="p">)</span>
<span class="n">conv1</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv1&quot;</span><span class="p">)</span>
<span class="n">conv2</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">conv1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv2&quot;</span><span class="p">)</span>
<span class="n">sum1</span> <span class="o">=</span> <span class="n">conv1</span> <span class="o">+</span> <span class="n">conv2</span>
<span class="n">conv3</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">sum1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv3&quot;</span><span class="p">)</span>
<span class="n">conv4</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">conv3</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv4&quot;</span><span class="p">)</span>
<span class="n">sum2</span> <span class="o">=</span> <span class="n">conv4</span> <span class="o">+</span> <span class="n">sum1</span>
<span class="n">conv5</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">sum2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv5&quot;</span><span class="p">)</span>
<span class="n">conv6</span> <span class="o">=</span> <span class="n">conv_bn_layer</span><span class="p">(</span><span class="n">conv5</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;conv6&quot;</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">fc</span><span class="p">(</span><span class="n">conv6</span><span class="p">,</span> <span class="kp">size</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">act</span><span class="o">=</span><span class="s2">&quot;softmax&quot;</span><span class="p">)</span>
<span class="c1"># cost = fluid.layers.cross_entropy(input=out, label=label)</span>
<span class="c1"># avg_cost = fluid.layers.mean(x=cost)</span>
<span class="n">acc_top1</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">accuracy</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="n">out</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="c1"># acc_top5 = fluid.layers.accuracy(input=out, label=label, k=5)</span>
<span class="kp">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
<span class="n">exe</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Executor</span><span class="p">(</span><span class="kp">place</span><span class="p">)</span>
<span class="n">exe</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">startup_program</span><span class="p">)</span>
<span class="n">val_reader</span> <span class="o">=</span> <span class="n">paddle</span><span class="o">.</span><span class="n">batch</span><span class="p">(</span><span class="n">reader</span><span class="o">.</span><span class="kp">test</span><span class="p">(),</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">128</span><span class="p">)</span>
<span class="n">val_feeder</span> <span class="o">=</span> <span class="n">feeder</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">DataFeeder</span><span class="p">(</span>
<span class="p">[</span><span class="n">image</span><span class="p">,</span> <span class="n">label</span><span class="p">],</span> <span class="kp">place</span><span class="p">,</span> <span class="n">program</span><span class="o">=</span><span class="n">main_program</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">eval_func</span><span class="p">(</span><span class="n">program</span><span class="p">):</span>
<span class="n">acc_top1_ns</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">val_reader</span><span class="p">():</span>
<span class="n">acc_top1_n</span> <span class="o">=</span> <span class="n">exe</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">program</span><span class="p">,</span>
<span class="n">feed</span><span class="o">=</span><span class="n">val_feeder</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="n">data</span><span class="p">),</span>
<span class="n">fetch_list</span><span class="o">=</span><span class="p">[</span><span class="n">acc_top1</span><span class="o">.</span><span class="n">name</span><span class="p">])</span>
<span class="n">acc_top1_ns</span><span class="o">.</span><span class="kp">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="kp">mean</span><span class="p">(</span><span class="n">acc_top1_n</span><span class="p">))</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="kp">mean</span><span class="p">(</span><span class="n">acc_top1_ns</span><span class="p">)</span>
<span class="n">param_names</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">main_program</span><span class="o">.</span><span class="n">global_block</span><span class="p">()</span><span class="o">.</span><span class="n">all_parameters</span><span class="p">():</span>
<span class="k">if</span> <span class="s2">&quot;weights&quot;</span> <span class="ow">in</span> <span class="n">param</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
<span class="n">param_names</span><span class="o">.</span><span class="kp">append</span><span class="p">(</span><span class="n">param</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="n">sensitivities</span> <span class="o">=</span> <span class="n">sensitivity</span><span class="p">(</span><span class="n">main_program</span><span class="p">,</span>
<span class="kp">place</span><span class="p">,</span>
<span class="n">param_names</span><span class="p">,</span>
<span class="n">eval_func</span><span class="p">,</span>
<span class="n">sensitivities_file</span><span class="o">=</span><span class="s2">&quot;./sensitive.data&quot;</span><span class="p">,</span>
<span class="n">pruned_ratios</span><span class="o">=</span><span class="p">[</span><span class="mf">0.1</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">,</span> <span class="mf">0.3</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="n">sensitivities</span><span class="p">)</span>
</pre></div>
<h2 id="merge_sensitive">merge_sensitive<a class="headerlink" href="#merge_sensitive" title="Permanent link">#</a></h2>
<blockquote>
<p>merge_sensitive(sensitivities)</p>
</blockquote>
<p>合并多个敏感度信息。</p>
<p>参数:</p>
<ul>
<li><strong>sensitivities(list<dict> | list<str>):</strong> 待合并的敏感度信息,可以是字典的列表,或者是存放敏感度信息的文件的路径列表。</li>
</ul>
<p>返回:</p>
<ul>
<li><strong>sensitivities(dict):</strong> 合并后的敏感度信息。其格式为:</li>
</ul>
<div class="codehilite"><pre><span></span><span class="err">{</span><span class="ss">&quot;weight_0&quot;</span><span class="p">:</span>
<span class="err">{</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">:</span> <span class="mi">0</span><span class="p">.</span><span class="mi">22</span><span class="p">,</span>
<span class="mi">0</span><span class="p">.</span><span class="mi">2</span><span class="p">:</span> <span class="mi">0</span><span class="p">.</span><span class="mi">33</span>
<span class="err">}</span><span class="p">,</span>
<span class="ss">&quot;weight_1&quot;</span><span class="p">:</span>
<span class="err">{</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">:</span> <span class="mi">0</span><span class="p">.</span><span class="mi">21</span><span class="p">,</span>
<span class="mi">0</span><span class="p">.</span><span class="mi">2</span><span class="p">:</span> <span class="mi">0</span><span class="p">.</span><span class="mi">4</span>
<span class="err">}</span>
<span class="err">}</span>
</pre></div>
<p>其中,<code>weight_0</code>是卷积层参数的名称,sensitivities['weight_0']的<code>value</code>为剪裁比例,<code>value</code>为精度损失的比例。</p>
<p>示例:</p>
<h2 id="load_sensitivities">load_sensitivities<a class="headerlink" href="#load_sensitivities" title="Permanent link">#</a></h2>
<blockquote>
<p>load_sensitivities(sensitivities_file)</p>
</blockquote>
<p>从文件中加载敏感度信息。</p>
<p>参数:</p>
<ul>
<li><strong>sensitivities_file(str):</strong> 存放敏感度信息的本地文件.</li>
</ul>
<p>返回:</p>
<ul>
<li><strong>sensitivities(dict)</strong>敏感度信息。</li>
</ul>
<p>示例:</p>
<h2 id="get_ratios_by_losssensitivities-loss">get_ratios_by_loss(sensitivities, loss)<a class="headerlink" href="#get_ratios_by_losssensitivities-loss" title="Permanent link">#</a></h2>
<p>根据敏感度和精度损失阈值计算出一组剪切率。对于参数<code>w</code>, 其剪裁率为使精度损失低于<code>loss</code>的最大剪裁率。</p>
<p>参数:</p>
<ul>
<li>
<p><strong>sensitivities(dict):</strong> 敏感度信息。</p>
</li>
<li>
<p><strong>loss:</strong> 精度损失阈值。</p>
</li>
</ul>
<p>返回:</p>
<ul>
<li>ratios(dict): 一组剪切率。<code>key</code>是待剪裁参数的名称。<code>value</code>是对应参数的剪裁率。</li>
</ul>
<p>示例:</p>
<div class="codehilite"><pre><span></span>
</pre></div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../analysis_api/" class="btn btn-neutral float-right" title="敏感度分析">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../quantization_api/" class="btn btn-neutral" title="量化"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../quantization_api/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../analysis_api/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../..';</script>
<script src="../../js/theme.js" defer></script>
<script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body>
</html>
...@@ -7,23 +7,23 @@ ...@@ -7,23 +7,23 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico"> <link rel="shortcut icon" href="../../img/favicon.ico">
<title>paddleslim.quant API文档 - PaddleSlim</title> <title>量化 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" /> <link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css"> <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script> <script>
// Current page data // Current page data
var mkdocs_page_name = "paddleslim.quant API\u6587\u6863"; var mkdocs_page_name = "\u91cf\u5316";
var mkdocs_page_input_path = "docs/api/quantization_api.md"; var mkdocs_page_input_path = "api/quantization_api.md";
var mkdocs_page_url = null; var mkdocs_page_url = null;
</script> </script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script> <script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script> <script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script> <script>hljs.initHighlightingOnLoad();</script>
...@@ -36,9 +36,9 @@ ...@@ -36,9 +36,9 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search"> <div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a> <a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search"> <div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get"> <form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" /> <input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form> </form>
</div> </div>
...@@ -50,96 +50,75 @@ ...@@ -50,96 +50,75 @@
<li class="toctree-l1"> <li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a> <a class="" href="../..">Home</a>
</li> </li>
<li class="toctree-l1"> <li class="toctree-l1">
<span class="caption-text">Docs</span> <span class="caption-text">教程</span>
<ul class="subnav"> <ul class="subnav">
<li class=""> <li class="">
<a class="" href="../../">PaddleSlim</a> <a class="" href="../../tutorials/quant_post_demo/">离线量化</a>
</li> </li>
<li class=""> <li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a> <a class="" href="../../tutorials/quant_aware_demo/">量化训练</a>
</li> </li>
<li class=" current"> <li class="">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="../nas_api/">paddleslim.nas API文档</a> <a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../prune_api/">卷积通道剪裁API文档</a> <a class="" href="../../tutorials/nas_demo/">SA搜索</a>
</li> </li>
<li class="toctree-l3 current"> </ul>
</li>
<li class="toctree-l1">
<span class="caption-text">API</span>
<ul class="subnav">
<li class=" current">
<a class="current" href="./">paddleslim.quant API文档</a> <a class="current" href="./">量化</a>
<ul class="subnav"> <ul class="subnav">
<li class="toctree-l4"><a href="#paddleslimquant-api">paddleslim.quant API文档</a></li> <li class="toctree-l3"><a href="#paddleslimquant-api">paddleslim.quant API文档</a></li>
<ul> <ul>
<li><a class="toctree-l5" href="#api">量化训练API</a></li> <li><a class="toctree-l4" href="#api">量化训练API</a></li>
<li><a class="toctree-l5" href="#api_1">离线量化API</a></li> <li><a class="toctree-l4" href="#api_1">离线量化API</a></li>
<li><a class="toctree-l5" href="#embeddingapi">Embedding量化API</a></li> <li><a class="toctree-l4" href="#embeddingapi">Embedding量化API</a></li>
</ul> </ul>
</ul>
</li>
<li class="toctree-l3">
<a class="" href="../search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="../single_distiller_api/">paddleslim.dist API文档</a>
</li>
</ul> </ul>
</li> </li>
<li class=""> <li class="">
<span class="caption-text">Tutorials</span> <a class="" href="../prune_api/">剪枝</a>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../tutorials/demo_guide/">Demo guide</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../../tutorials/nas_demo/">网络结构搜索示例</a> <a class="" href="../analysis_api/">敏感度分析</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../../tutorials/quant_aware_demo/">在线量化示例</a> <a class="" href="../single_distiller_api/">蒸馏</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化示例</a> <a class="" href="../nas_api/">SA搜索</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../../tutorials/quant_post_demo/">离线量化示例</a> <a class="" href="../search_space/">搜索空间</a>
</li>
</ul>
</li> </li>
</ul> </ul>
</li> </li>
...@@ -154,7 +133,7 @@ ...@@ -154,7 +133,7 @@
<nav class="wy-nav-top" role="navigation" aria-label="top navigation"> <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a> <a href="../..">PaddleSlim Docs</a>
</nav> </nav>
...@@ -162,21 +141,20 @@ ...@@ -162,21 +141,20 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li> <li><a href="../..">Docs</a> &raquo;</li>
<li>Api &raquo;</li> <li>API &raquo;</li>
<li>Docs &raquo;</li>
<li>paddleslim.quant API文档</li> <li>量化</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/api/quantization_api.md"
class="icon icon-github"> Edit on GitHub</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
...@@ -184,30 +162,31 @@ ...@@ -184,30 +162,31 @@
<div role="main"> <div role="main">
<div class="section"> <div class="section">
<h1 id="paddleslimquant-api">paddleslim.quant API文档</h1> <h1 id="paddleslimquant-api">paddleslim.quant API文档<a class="headerlink" href="#paddleslimquant-api" title="Permanent link">#</a></h1>
<h2 id="api">量化训练API</h2> <h2 id="api">量化训练API<a class="headerlink" href="#api" title="Permanent link">#</a></h2>
<h3 id="_1">量化配置</h3> <h3 id="_1">量化配置<a class="headerlink" href="#_1" title="Permanent link">#</a></h3>
<pre><code>quant_config_default = { <div class="codehilite"><pre><span></span><span class="nv">quant_config_default</span> <span class="o">=</span> {
'weight_quantize_type': 'abs_max', <span class="s1">&#39;</span><span class="s">weight_quantize_type</span><span class="s1">&#39;</span>: <span class="s1">&#39;</span><span class="s">abs_max</span><span class="s1">&#39;</span>,
'activation_quantize_type': 'abs_max', <span class="s1">&#39;</span><span class="s">activation_quantize_type</span><span class="s1">&#39;</span>: <span class="s1">&#39;</span><span class="s">abs_max</span><span class="s1">&#39;</span>,
'weight_bits': 8, <span class="s1">&#39;</span><span class="s">weight_bits</span><span class="s1">&#39;</span>: <span class="mi">8</span>,
'activation_bits': 8, <span class="s1">&#39;</span><span class="s">activation_bits</span><span class="s1">&#39;</span>: <span class="mi">8</span>,
# ops of name_scope in not_quant_pattern list, will not be quantized # <span class="nv">ops</span> <span class="nv">of</span> <span class="nv">name_scope</span> <span class="nv">in</span> <span class="nv">not_quant_pattern</span> <span class="nv">list</span>, <span class="nv">will</span> <span class="nv">not</span> <span class="nv">be</span> <span class="nv">quantized</span>
'not_quant_pattern': ['skip_quant'], <span class="s1">&#39;</span><span class="s">not_quant_pattern</span><span class="s1">&#39;</span>: [<span class="s1">&#39;</span><span class="s">skip_quant</span><span class="s1">&#39;</span>],
# ops of type in quantize_op_types, will be quantized # <span class="nv">ops</span> <span class="nv">of</span> <span class="nv">type</span> <span class="nv">in</span> <span class="nv">quantize_op_types</span>, <span class="nv">will</span> <span class="nv">be</span> <span class="nv">quantized</span>
'quantize_op_types': <span class="s1">&#39;</span><span class="s">quantize_op_types</span><span class="s1">&#39;</span>:
['conv2d', 'depthwise_conv2d', 'mul', 'elementwise_add', 'pool2d'], [<span class="s1">&#39;</span><span class="s">conv2d</span><span class="s1">&#39;</span>, <span class="s1">&#39;</span><span class="s">depthwise_conv2d</span><span class="s1">&#39;</span>, <span class="s1">&#39;</span><span class="s">mul</span><span class="s1">&#39;</span>, <span class="s1">&#39;</span><span class="s">elementwise_add</span><span class="s1">&#39;</span>, <span class="s1">&#39;</span><span class="s">pool2d</span><span class="s1">&#39;</span>],
# data type after quantization, such as 'uint8', 'int8', etc. default is 'int8' # <span class="nv">data</span> <span class="nv">type</span> <span class="nv">after</span> <span class="nv">quantization</span>, <span class="nv">such</span> <span class="nv">as</span> <span class="s1">&#39;</span><span class="s">uint8</span><span class="s1">&#39;</span>, <span class="s1">&#39;</span><span class="s">int8</span><span class="s1">&#39;</span>, <span class="nv">etc</span>. <span class="nv">default</span> <span class="nv">is</span> <span class="s1">&#39;</span><span class="s">int8</span><span class="s1">&#39;</span>
'dtype': 'int8', <span class="s1">&#39;</span><span class="s">dtype</span><span class="s1">&#39;</span>: <span class="s1">&#39;</span><span class="s">int8</span><span class="s1">&#39;</span>,
# window size for 'range_abs_max' quantization. defaulf is 10000 # <span class="nv">window</span> <span class="nv">size</span> <span class="k">for</span> <span class="s1">&#39;</span><span class="s">range_abs_max</span><span class="s1">&#39;</span> <span class="nv">quantization</span>. <span class="nv">defaulf</span> <span class="nv">is</span> <span class="mi">10000</span>
'window_size': 10000, <span class="s1">&#39;</span><span class="s">window_size</span><span class="s1">&#39;</span>: <span class="mi">10000</span>,
# The decay coefficient of moving average, default is 0.9 # <span class="nv">The</span> <span class="nv">decay</span> <span class="nv">coefficient</span> <span class="nv">of</span> <span class="nv">moving</span> <span class="nv">average</span>, <span class="nv">default</span> <span class="nv">is</span> <span class="mi">0</span>.<span class="mi">9</span>
'moving_rate': 0.9, <span class="s1">&#39;</span><span class="s">moving_rate</span><span class="s1">&#39;</span>: <span class="mi">0</span>.<span class="mi">9</span>,
# if set quant_weight_only True, then only quantize parameters of layers which need to be quantized, # <span class="k">if</span> <span class="nv">set</span> <span class="nv">quant_weight_only</span> <span class="nv">True</span>, <span class="k">then</span> <span class="nv">only</span> <span class="nv">quantize</span> <span class="nv">parameters</span> <span class="nv">of</span> <span class="nv">layers</span> <span class="nv">which</span> <span class="nv">need</span> <span class="nv">to</span> <span class="nv">be</span> <span class="nv">quantized</span>,
# and activations will not be quantized. # <span class="nv">and</span> <span class="nv">activations</span> <span class="nv">will</span> <span class="nv">not</span> <span class="nv">be</span> <span class="nv">quantized</span>.
'quant_weight_only': False <span class="s1">&#39;</span><span class="s">quant_weight_only</span><span class="s1">&#39;</span>: <span class="nv">False</span>
} }
</code></pre> </pre></div>
<p>设置量化训练需要的配置。</p> <p>设置量化训练需要的配置。</p>
<p><strong>参数:</strong></p> <p><strong>参数:</strong></p>
...@@ -223,7 +202,7 @@ ...@@ -223,7 +202,7 @@
<li><strong>moving_rate(int)</strong> - <code>'moving_average_abs_max'</code>量化方式的衰减系数,默认 0.9。</li> <li><strong>moving_rate(int)</strong> - <code>'moving_average_abs_max'</code>量化方式的衰减系数,默认 0.9。</li>
<li><strong>quant_weight_only(bool)</strong> - 是否只量化参数,如果设为<code>True</code>,则激活不进行量化,默认<code>False</code>。目前暂不支持设置为<code>True</code>。 设置为<code>True</code>时,只量化参数,这种方式不能减少显存占用和加速,只能用来减少带宽。</li> <li><strong>quant_weight_only(bool)</strong> - 是否只量化参数,如果设为<code>True</code>,则激活不进行量化,默认<code>False</code>。目前暂不支持设置为<code>True</code>。 设置为<code>True</code>时,只量化参数,这种方式不能减少显存占用和加速,只能用来减少带宽。</li>
</ul> </ul>
<h3 id="paddleslimquantquant_awareprogram-place-config-scopenone-for_testfalse">paddleslim.quant.quant_aware(program, place, config, scope=None, for_test=False)</h3> <h3 id="paddleslimquantquant_awareprogram-place-config-scopenone-for_testfalse">paddleslim.quant.quant_aware(program, place, config, scope=None, for_test=False)<a class="headerlink" href="#paddleslimquantquant_awareprogram-place-config-scopenone-for_testfalse" title="Permanent link">#</a></h3>
<p><code>program</code>中加入量化和反量化<code>op</code>, 用于量化训练。</p> <p><code>program</code>中加入量化和反量化<code>op</code>, 用于量化训练。</p>
<p><strong>参数:</strong></p> <p><strong>参数:</strong></p>
<ul> <ul>
...@@ -247,7 +226,7 @@ ...@@ -247,7 +226,7 @@
<li>由于此接口会根据<code>program</code>的结构和量化配置来对<code>program</code>添加op,所以<code>Paddle</code>中一些通过<code>fuse op</code>来加速训练的策略不能使用。已知以下策略在使用量化时必须设为<code>False</code><code>fuse_all_reduce_ops, sync_batch_norm</code></li> <li>由于此接口会根据<code>program</code>的结构和量化配置来对<code>program</code>添加op,所以<code>Paddle</code>中一些通过<code>fuse op</code>来加速训练的策略不能使用。已知以下策略在使用量化时必须设为<code>False</code><code>fuse_all_reduce_ops, sync_batch_norm</code></li>
<li>如果传入的<code>program</code>中存在和任何op都没有连接的<code>Variable</code>,则会在量化的过程中被优化掉。</li> <li>如果传入的<code>program</code>中存在和任何op都没有连接的<code>Variable</code>,则会在量化的过程中被优化掉。</li>
</ul> </ul>
<h3 id="paddleslimquantconvertprogram-place-config-scopenone-save_int8false">paddleslim.quant.convert(program, place, config, scope=None, save_int8=False)</h3> <h3 id="paddleslimquantconvertprogram-place-config-scopenone-save_int8false">paddleslim.quant.convert(program, place, config, scope=None, save_int8=False)<a class="headerlink" href="#paddleslimquantconvertprogram-place-config-scopenone-save_int8false" title="Permanent link">#</a></h3>
<p>把训练好的量化<code>program</code>,转换为可用于保存<code>inference model</code><code>program</code></p> <p>把训练好的量化<code>program</code>,转换为可用于保存<code>inference model</code><code>program</code></p>
<p><strong>参数:</strong> <p><strong>参数:</strong>
- <strong>program (fluid.Program)</strong> - 传入测试<code>program</code> - <strong>program (fluid.Program)</strong> - 传入测试<code>program</code>
...@@ -263,60 +242,61 @@ ...@@ -263,60 +242,61 @@
<p><strong>注意事项</strong></p> <p><strong>注意事项</strong></p>
<p>因为该接口会对<code>op</code><code>Variable</code>做相应的删除和修改,所以此接口只能在训练完成之后调用。如果想转化训练的中间模型,可加载相应的参数之后再使用此接口。</p> <p>因为该接口会对<code>op</code><code>Variable</code>做相应的删除和修改,所以此接口只能在训练完成之后调用。如果想转化训练的中间模型,可加载相应的参数之后再使用此接口。</p>
<p><strong>代码示例</strong></p> <p><strong>代码示例</strong></p>
<pre><code class="python">#encoding=utf8 <div class="codehilite"><pre><span></span><span class="c1">#encoding=utf8</span>
import paddle.fluid as fluid <span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
import paddleslim.quant as quant <span class="kn">import</span> <span class="nn">paddleslim.quant</span> <span class="kn">as</span> <span class="nn">quant</span>
train_program = fluid.Program() <span class="n">train_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
with fluid.program_guard(train_program): <span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">train_program</span><span class="p">):</span>
image = fluid.data(name='x', shape=[None, 1, 28, 28]) <span class="n">image</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
label = fluid.data(name='label', shape=[None, 1], dtype='int64') <span class="n">label</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;label&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="s1">&#39;int64&#39;</span><span class="p">)</span>
conv = fluid.layers.conv2d(image, 32, 1) <span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
feat = fluid.layers.fc(conv, 10, act='softmax') <span class="n">feat</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">fc</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">act</span><span class="o">=</span><span class="s1">&#39;softmax&#39;</span><span class="p">)</span>
cost = fluid.layers.cross_entropy(input=feat, label=label) <span class="n">cost</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">cross_entropy</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="n">feat</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">)</span>
avg_cost = fluid.layers.mean(x=cost) <span class="n">avg_cost</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">cost</span><span class="p">)</span>
use_gpu = True <span class="n">use_gpu</span> <span class="o">=</span> <span class="bp">True</span>
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace() <span class="n">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CUDAPlace</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">if</span> <span class="n">use_gpu</span> <span class="k">else</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
exe = fluid.Executor(place) <span class="n">exe</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Executor</span><span class="p">(</span><span class="n">place</span><span class="p">)</span>
exe.run(fluid.default_startup_program()) <span class="n">exe</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">fluid</span><span class="o">.</span><span class="n">default_startup_program</span><span class="p">())</span>
eval_program = train_program.clone(for_test=True) <span class="n">eval_program</span> <span class="o">=</span> <span class="n">train_program</span><span class="o">.</span><span class="n">clone</span><span class="p">(</span><span class="n">for_test</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
#配置 <span class="c1">#配置</span>
config = {'weight_quantize_type': 'abs_max', <span class="n">config</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;weight_quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span>
'activation_quantize_type': 'moving_average_abs_max'} <span class="s1">&#39;activation_quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;moving_average_abs_max&#39;</span><span class="p">}</span>
build_strategy = fluid.BuildStrategy() <span class="n">build_strategy</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">BuildStrategy</span><span class="p">()</span>
exec_strategy = fluid.ExecutionStrategy() <span class="n">exec_strategy</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">ExecutionStrategy</span><span class="p">()</span>
#调用api <span class="c1">#调用api</span>
quant_train_program = quant.quant_aware(train_program, place, config, for_test=False) <span class="n">quant_train_program</span> <span class="o">=</span> <span class="n">quant</span><span class="o">.</span><span class="n">quant_aware</span><span class="p">(</span><span class="n">train_program</span><span class="p">,</span> <span class="n">place</span><span class="p">,</span> <span class="n">config</span><span class="p">,</span> <span class="n">for_test</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
quant_eval_program = quant.quant_aware(eval_program, place, config, for_test=True) <span class="n">quant_eval_program</span> <span class="o">=</span> <span class="n">quant</span><span class="o">.</span><span class="n">quant_aware</span><span class="p">(</span><span class="n">eval_program</span><span class="p">,</span> <span class="n">place</span><span class="p">,</span> <span class="n">config</span><span class="p">,</span> <span class="n">for_test</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
#关闭策略 <span class="c1">#关闭策略</span>
build_strategy.fuse_all_reduce_ops = False <span class="n">build_strategy</span><span class="o">.</span><span class="n">fuse_all_reduce_ops</span> <span class="o">=</span> <span class="bp">False</span>
build_strategy.sync_batch_norm = False <span class="n">build_strategy</span><span class="o">.</span><span class="n">sync_batch_norm</span> <span class="o">=</span> <span class="bp">False</span>
quant_train_program = quant_train_program.with_data_parallel( <span class="n">quant_train_program</span> <span class="o">=</span> <span class="n">quant_train_program</span><span class="o">.</span><span class="n">with_data_parallel</span><span class="p">(</span>
loss_name=avg_cost.name, <span class="n">loss_name</span><span class="o">=</span><span class="n">avg_cost</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
build_strategy=build_strategy, <span class="n">build_strategy</span><span class="o">=</span><span class="n">build_strategy</span><span class="p">,</span>
exec_strategy=exec_strategy) <span class="n">exec_strategy</span><span class="o">=</span><span class="n">exec_strategy</span><span class="p">)</span>
inference_prog = quant.convert(quant_eval_program, place, config) <span class="n">inference_prog</span> <span class="o">=</span> <span class="n">quant</span><span class="o">.</span><span class="n">convert</span><span class="p">(</span><span class="n">quant_eval_program</span><span class="p">,</span> <span class="n">place</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span>
</code></pre> </pre></div>
<p>更详细的用法请参考 <a href='../../demo/quant/quant_aware/README.md'>量化训练demo</a></p> <p>更详细的用法请参考 <a href='../../demo/quant/quant_aware/README.md'>量化训练demo</a></p>
<h2 id="api_1">离线量化API</h2> <h2 id="api_1">离线量化API<a class="headerlink" href="#api_1" title="Permanent link">#</a></h2>
<pre><code>paddleslim.quant.quant_post(executor, <div class="codehilite"><pre><span></span><span class="n">paddleslim</span><span class="p">.</span><span class="n">quant</span><span class="p">.</span><span class="n">quant_post</span><span class="p">(</span><span class="n">executor</span><span class="p">,</span>
model_dir, <span class="n">model_dir</span><span class="p">,</span>
quantize_model_path, <span class="n">quantize_model_path</span><span class="p">,</span>
sample_generator, <span class="n">sample_generator</span><span class="p">,</span>
model_filename=None, <span class="n">model_filename</span><span class="o">=</span><span class="k">None</span><span class="p">,</span>
params_filename=None, <span class="n">params_filename</span><span class="o">=</span><span class="k">None</span><span class="p">,</span>
batch_size=16, <span class="n">batch_size</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span>
batch_nums=None, <span class="n">batch_nums</span><span class="o">=</span><span class="k">None</span><span class="p">,</span>
scope=None, <span class="k">scope</span><span class="o">=</span><span class="k">None</span><span class="p">,</span>
algo='KL', <span class="n">algo</span><span class="o">=</span><span class="s1">&#39;KL&#39;</span><span class="p">,</span>
quantizable_op_type=[&quot;conv2d&quot;, &quot;depthwise_conv2d&quot;, &quot;mul&quot;]) <span class="n">quantizable_op_type</span><span class="o">=</span><span class="p">[</span><span class="ss">&quot;conv2d&quot;</span><span class="p">,</span> <span class="ss">&quot;depthwise_conv2d&quot;</span><span class="p">,</span> <span class="ss">&quot;mul&quot;</span><span class="p">])</span>
</pre></div>
</code></pre>
<p>对保存在<code>${model_dir}</code>下的模型进行量化,使用<code>sample_generator</code>的数据进行参数校正。</p> <p>对保存在<code>${model_dir}</code>下的模型进行量化,使用<code>sample_generator</code>的数据进行参数校正。</p>
<p><strong>参数:</strong> <p><strong>参数:</strong>
...@@ -339,29 +319,31 @@ inference_prog = quant.convert(quant_eval_program, place, config) ...@@ -339,29 +319,31 @@ inference_prog = quant.convert(quant_eval_program, place, config)
<blockquote> <blockquote>
<p>注: 此示例不能直接运行,因为需要加载<code>${model_dir}</code>下的模型,所以不能直接运行。</p> <p>注: 此示例不能直接运行,因为需要加载<code>${model_dir}</code>下的模型,所以不能直接运行。</p>
</blockquote> </blockquote>
<pre><code class="python">import paddle.fluid as fluid <div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
import paddle.dataset.mnist as reader <span class="kn">import</span> <span class="nn">paddle.dataset.mnist</span> <span class="kn">as</span> <span class="nn">reader</span>
from paddleslim.quant import quant_post <span class="kn">from</span> <span class="nn">paddleslim.quant</span> <span class="kn">import</span> <span class="n">quant_post</span>
val_reader = reader.train() <span class="n">val_reader</span> <span class="o">=</span> <span class="n">reader</span><span class="o">.</span><span class="n">train</span><span class="p">()</span>
use_gpu = True <span class="n">use_gpu</span> <span class="o">=</span> <span class="bp">True</span>
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace() <span class="n">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CUDAPlace</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">if</span> <span class="n">use_gpu</span> <span class="k">else</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
exe = fluid.Executor(place) <span class="n">exe</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Executor</span><span class="p">(</span><span class="n">place</span><span class="p">)</span>
quant_post( <span class="n">quant_post</span><span class="p">(</span>
executor=exe, <span class="n">executor</span><span class="o">=</span><span class="n">exe</span><span class="p">,</span>
model_dir='./model_path', <span class="n">model_dir</span><span class="o">=</span><span class="s1">&#39;./model_path&#39;</span><span class="p">,</span>
quantize_model_path='./save_path', <span class="n">quantize_model_path</span><span class="o">=</span><span class="s1">&#39;./save_path&#39;</span><span class="p">,</span>
sample_generator=val_reader, <span class="n">sample_generator</span><span class="o">=</span><span class="n">val_reader</span><span class="p">,</span>
model_filename='__model__', <span class="n">model_filename</span><span class="o">=</span><span class="s1">&#39;__model__&#39;</span><span class="p">,</span>
params_filename='__params__', <span class="n">params_filename</span><span class="o">=</span><span class="s1">&#39;__params__&#39;</span><span class="p">,</span>
batch_size=16, <span class="n">batch_size</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span>
batch_nums=10) <span class="n">batch_nums</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
</code></pre> </pre></div>
<p>更详细的用法请参考 <a href='../../demo/quant/quant_post/README.md'>离线量化demo</a></p> <p>更详细的用法请参考 <a href='../../demo/quant/quant_post/README.md'>离线量化demo</a></p>
<h2 id="embeddingapi">Embedding量化API</h2> <h2 id="embeddingapi">Embedding量化API<a class="headerlink" href="#embeddingapi" title="Permanent link">#</a></h2>
<pre><code>paddleslim.quant.quant_embedding(program, place, config, scope=None) <div class="codehilite"><pre><span></span><span class="n">paddleslim</span><span class="p">.</span><span class="n">quant</span><span class="p">.</span><span class="n">quant_embedding</span><span class="p">(</span><span class="n">program</span><span class="p">,</span> <span class="n">place</span><span class="p">,</span> <span class="n">config</span><span class="p">,</span> <span class="k">scope</span><span class="o">=</span><span class="k">None</span><span class="p">)</span>
</code></pre> </pre></div>
<p><code>Embedding</code>参数进行量化。</p> <p><code>Embedding</code>参数进行量化。</p>
<p><strong>参数:</strong> <p><strong>参数:</strong>
...@@ -379,29 +361,30 @@ quant_post( ...@@ -379,29 +361,30 @@ quant_post(
<p><strong>返回类型</strong></p> <p><strong>返回类型</strong></p>
<p><code>fluid.Program</code></p> <p><code>fluid.Program</code></p>
<p><strong>代码示例</strong></p> <p><strong>代码示例</strong></p>
<pre><code class="python">import paddle.fluid as fluid <div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
import paddleslim.quant as quant <span class="kn">import</span> <span class="nn">paddleslim.quant</span> <span class="kn">as</span> <span class="nn">quant</span>
train_program = fluid.Program() <span class="n">train_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
with fluid.program_guard(train_program): <span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">train_program</span><span class="p">):</span>
input_word = fluid.data(name=&quot;input_word&quot;, shape=[None, 1], dtype='int64') <span class="n">input_word</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;input_word&quot;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="s1">&#39;int64&#39;</span><span class="p">)</span>
input_emb = fluid.embedding( <span class="n">input_emb</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">embedding</span><span class="p">(</span>
input=input_word, <span class="nb">input</span><span class="o">=</span><span class="n">input_word</span><span class="p">,</span>
is_sparse=False, <span class="n">is_sparse</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
size=[100, 128], <span class="n">size</span><span class="o">=</span><span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">128</span><span class="p">],</span>
param_attr=fluid.ParamAttr(name='emb', <span class="n">param_attr</span><span class="o">=</span><span class="n">fluid</span><span class="o">.</span><span class="n">ParamAttr</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;emb&#39;</span><span class="p">,</span>
initializer=fluid.initializer.Uniform(-0.005, 0.005))) <span class="n">initializer</span><span class="o">=</span><span class="n">fluid</span><span class="o">.</span><span class="n">initializer</span><span class="o">.</span><span class="n">Uniform</span><span class="p">(</span><span class="o">-</span><span class="mf">0.005</span><span class="p">,</span> <span class="mf">0.005</span><span class="p">)))</span>
infer_program = train_program.clone(for_test=True) <span class="n">infer_program</span> <span class="o">=</span> <span class="n">train_program</span><span class="o">.</span><span class="n">clone</span><span class="p">(</span><span class="n">for_test</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
use_gpu = True <span class="n">use_gpu</span> <span class="o">=</span> <span class="bp">True</span>
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace() <span class="n">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CUDAPlace</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">if</span> <span class="n">use_gpu</span> <span class="k">else</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
exe = fluid.Executor(place) <span class="n">exe</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Executor</span><span class="p">(</span><span class="n">place</span><span class="p">)</span>
exe.run(fluid.default_startup_program()) <span class="n">exe</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">fluid</span><span class="o">.</span><span class="n">default_startup_program</span><span class="p">())</span>
config = {'params_name': 'emb', 'quantize_type': 'abs_max'} <span class="n">config</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">}</span>
quant_program = quant.quant_embedding(infer_program, place, config) <span class="n">quant_program</span> <span class="o">=</span> <span class="n">quant</span><span class="o">.</span><span class="n">quant_embedding</span><span class="p">(</span><span class="n">infer_program</span><span class="p">,</span> <span class="n">place</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span>
</code></pre> </pre></div>
<p>更详细的用法请参考 <a href='../../demo/quant/quant_embedding/README.md'>Embedding量化demo</a></p> <p>更详细的用法请参考 <a href='../../demo/quant/quant_embedding/README.md'>Embedding量化demo</a></p>
...@@ -411,10 +394,10 @@ quant_program = quant.quant_embedding(infer_program, place, config) ...@@ -411,10 +394,10 @@ quant_program = quant.quant_embedding(infer_program, place, config)
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../search_space/" class="btn btn-neutral float-right" title="paddleslim.nas 提供的搜索空间:">Next <span class="icon icon-circle-arrow-right"></span></a> <a href="../prune_api/" class="btn btn-neutral float-right" title="剪枝">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../prune_api/" class="btn btn-neutral" title="卷积通道剪裁API文档"><span class="icon icon-circle-arrow-left"></span> Previous</a> <a href="../../tutorials/nas_demo/" class="btn btn-neutral" title="SA搜索"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div> </div>
...@@ -439,17 +422,21 @@ quant_program = quant.quant_embedding(infer_program, place, config) ...@@ -439,17 +422,21 @@ quant_program = quant.quant_embedding(infer_program, place, config)
<div class="rst-versions" role="note" style="cursor: pointer"> <div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version"> <span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../prune_api/" style="color: #fcfcfc;">&laquo; Previous</a></span> <span><a href="../../tutorials/nas_demo/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../search_space/" style="color: #fcfcfc">Next &raquo;</a></span> <span style="margin-left: 15px"><a href="../prune_api/" style="color: #fcfcfc">Next &raquo;</a></span>
</span> </span>
</div> </div>
<script>var base_url = '../../..';</script> <script>var base_url = '../..';</script>
<script src="../../../js/theme.js" defer></script> <script src="../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script> <script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body> </body>
</html> </html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>搜索空间 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "\u641c\u7d22\u7a7a\u95f4";
var mkdocs_page_input_path = "api/search_space.md";
var mkdocs_page_url = null;
</script>
<script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../..">Home</a>
</li>
<li class="toctree-l1">
<span class="caption-text">教程</span>
<ul class="subnav">
<li class="">
<a class="" href="../../tutorials/quant_post_demo/">离线量化</a>
</li>
<li class="">
<a class="" href="../../tutorials/quant_aware_demo/">量化训练</a>
</li>
<li class="">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化</a>
</li>
<li class="">
<a class="" href="../../tutorials/nas_demo/">SA搜索</a>
</li>
</ul>
</li>
<li class="toctree-l1">
<span class="caption-text">API</span>
<ul class="subnav">
<li class="">
<a class="" href="../quantization_api/">量化</a>
</li>
<li class="">
<a class="" href="../prune_api/">剪枝</a>
</li>
<li class="">
<a class="" href="../analysis_api/">敏感度分析</a>
</li>
<li class="">
<a class="" href="../single_distiller_api/">蒸馏</a>
</li>
<li class="">
<a class="" href="../nas_api/">SA搜索</a>
</li>
<li class=" current">
<a class="current" href="./">搜索空间</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#paddleslimnas">paddleslim.nas 提供的搜索空间:</a></li>
<ul>
<li><a class="toctree-l4" href="#_1">搜索空间的配置介绍:</a></li>
<li><a class="toctree-l4" href="#_2">搜索空间示例:</a></li>
</ul>
<li class="toctree-l3"><a href="#search-space">自定义搜索空间(search space)</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../..">PaddleSlim Docs</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../..">Docs</a> &raquo;</li>
<li>API &raquo;</li>
<li>搜索空间</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/api/search_space.md"
class="icon icon-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="paddleslimnas">paddleslim.nas 提供的搜索空间:<a class="headerlink" href="#paddleslimnas" title="Permanent link">#</a></h1>
<ol>
<li>根据原本模型结构构造搜索空间:</li>
</ol>
<p>1.1 MobileNetV2Space</p>
<p>1.2 MobileNetV1Space</p>
<p>1.3 ResNetSpace</p>
<ol>
<li>根据相应模型的block构造搜索空间</li>
</ol>
<p>2.1 MobileNetV1BlockSpace</p>
<p>2.2 MobileNetV2BlockSpace</p>
<p>2.3 ResNetBlockSpace</p>
<p>2.4 InceptionABlockSpace</p>
<p>2.5 InceptionCBlockSpace</p>
<h2 id="_1">搜索空间的配置介绍:<a class="headerlink" href="#_1" title="Permanent link">#</a></h2>
<p><strong>input_size(int|None)</strong><code>input_size</code>表示输入feature map的大小。
<strong>output_size(int|None)</strong><code>output_size</code>表示输出feature map的大小。
<strong>block_num(int|None)</strong><code>block_num</code>表示搜索空间中block的数量。
<strong>block_mask(list|None)</strong><code>block_mask</code>表示当前的block是一个reduction block还是一个normal block,是一组由0、1组成的列表,0表示当前block是normal block,1表示当前block是reduction block。如果设置了<code>block_mask</code>,则主要以<code>block_mask</code>为主要配置,<code>input_size</code><code>output_size</code><code>block_num</code>三种配置是无效的。</p>
<p><strong>Note:</strong>
1. reduction block表示经过这个block之后的feature map大小下降为之前的一半,normal block表示经过这个block之后feature map大小不变。
2. <code>input_size</code><code>output_size</code>用来计算整个模型结构中reduction block数量。</p>
<h2 id="_2">搜索空间示例:<a class="headerlink" href="#_2" title="Permanent link">#</a></h2>
<ol>
<li>使用paddleslim中提供用原本的模型结构来构造搜索空间的话,仅需要指定搜索空间名字即可。例如:如果使用原本的MobileNetV2的搜索空间进行搜索的话,传入SANAS中的config直接指定为[('MobileNetV2Space')]。</li>
<li>使用paddleslim中提供的block搜索空间构造搜索空间:
2.1 使用<code>input_size</code>, <code>output_size</code><code>block_num</code>来构造搜索空间。例如:传入SANAS的config可以指定为[('MobileNetV2BlockSpace', {'input_size': 224, 'output_size': 32, 'block_num': 10})]。
2.2 使用<code>block_mask</code>构造搜索空间。例如:传入SANAS的config可以指定为[('MobileNetV2BlockSpace', {'block_mask': [0, 1, 1, 1, 1, 0, 1, 0]})]。</li>
</ol>
<h1 id="search-space">自定义搜索空间(search space)<a class="headerlink" href="#search-space" title="Permanent link">#</a></h1>
<p>自定义搜索空间类需要继承搜索空间基类并重写以下几部分:
1. 初始化的tokens(<code>init_tokens</code>函数),可以设置为自己想要的tokens列表, tokens列表中的每个数字指的是当前数字在相应的搜索列表中的索引。例如本示例中若tokens=[0, 3, 5],则代表当前模型结构搜索到的通道数为[8, 40, 128]。
2. token中每个数字的搜索列表长度(<code>range_table</code>函数),tokens中每个token的索引范围。
3. 根据token产生模型结构(<code>token2arch</code>函数),根据搜索到的tokens列表产生模型结构。</p>
<p>以新增reset block为例说明如何构造自己的search space。自定义的search space不能和已有的search space同名。</p>
<div class="codehilite"><pre><span></span><span class="c1">### 引入搜索空间基类函数和search space的注册类函数</span>
<span class="kn">from</span> <span class="nn">.search_space_base</span> <span class="kn">import</span> <span class="n">SearchSpaceBase</span>
<span class="kn">from</span> <span class="nn">.search_space_registry</span> <span class="kn">import</span> <span class="n">SEARCHSPACE</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="c1">### 需要调用注册函数把自定义搜索空间注册到space space中</span>
<span class="nd">@SEARCHSPACE.register</span>
<span class="c1">### 定义一个继承SearchSpaceBase基类的搜索空间的类函数</span>
<span class="k">class</span> <span class="nc">ResNetBlockSpace2</span><span class="p">(</span><span class="n">SearchSpaceBase</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="n">input_size</span><span class="p">,</span> <span class="n">output_size</span><span class="p">,</span> <span class="n">block_num</span><span class="p">,</span> <span class="n">block_mask</span><span class="p">):</span>
<span class="c1">### 定义一些实际想要搜索的内容,例如:通道数、每个卷积的重复次数、卷积核大小等等</span>
<span class="c1">### self.filter_num 代表通道数的搜索列表</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filter_num</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">8</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">256</span><span class="p">,</span> <span class="mi">512</span><span class="p">])</span>
<span class="c1">### 定义初始化token,初始化token的长度根据传入的block_num或者block_mask的长度来得到的</span>
<span class="k">def</span> <span class="nf">init_tokens</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="mi">3</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">block_mask</span><span class="p">)</span>
<span class="c1">### 定义</span>
<span class="k">def</span> <span class="nf">range_table</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filter_num</span><span class="p">)]</span> <span class="o">*</span> <span class="mi">3</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">block_mask</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">token2arch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tokens</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">tokens</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">tokens</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">init_tokens</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bottleneck_params_list</span> <span class="o">=</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="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">block_mask</span><span class="p">)):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bottleneck_params_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filter_num</span><span class="p">[</span><span class="n">tokens</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">3</span> <span class="o">+</span> <span class="mi">0</span><span class="p">]],</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filter_num</span><span class="p">[</span><span class="n">tokens</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">3</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]],</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filter_num</span><span class="p">[</span><span class="n">tokens</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">3</span> <span class="o">+</span> <span class="mi">2</span><span class="p">]],</span>
<span class="mi">2</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">block_mask</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">net_arch</span><span class="p">(</span><span class="nb">input</span><span class="p">):</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">layer_setting</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bottleneck_params_list</span><span class="p">):</span>
<span class="n">channel_num</span><span class="p">,</span> <span class="n">stride</span> <span class="o">=</span> <span class="n">layer_setting</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">layer_setting</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="nb">input</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_resnet_block</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">channel_num</span><span class="p">,</span> <span class="n">stride</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;resnet_layer{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span>
<span class="k">return</span> <span class="nb">input</span>
<span class="k">return</span> <span class="n">net_arch</span>
<span class="c1">### 构造具体block的操作</span>
<span class="k">def</span> <span class="nf">_resnet_block</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">channel_num</span><span class="p">,</span> <span class="n">stride</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="n">shortcut_conv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_shortcut</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">channel_num</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">stride</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
<span class="nb">input</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_conv_bn_layer</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span> <span class="n">num_filters</span><span class="o">=</span><span class="n">channel_num</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">filter_size</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">act</span><span class="o">=</span><span class="s1">&#39;relu&#39;</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;_conv0&#39;</span><span class="p">)</span>
<span class="nb">input</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_conv_bn_layer</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span> <span class="n">num_filters</span><span class="o">=</span><span class="n">channel_num</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">filter_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="n">stride</span><span class="p">,</span> <span class="n">act</span><span class="o">=</span><span class="s1">&#39;relu&#39;</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;_conv1&#39;</span><span class="p">)</span>
<span class="nb">input</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_conv_bn_layer</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span> <span class="n">num_filters</span><span class="o">=</span><span class="n">channel_num</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">filter_size</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;_conv2&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">elementwise_add</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">shortcut_conv</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="o">+</span><span class="s1">&#39;_elementwise_add&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_shortcut</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">channel_num</span><span class="p">,</span> <span class="n">stride</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="n">channel_in</span> <span class="o">=</span> <span class="nb">input</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="n">channel_in</span> <span class="o">!=</span> <span class="n">channel_num</span> <span class="ow">or</span> <span class="n">stride</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv_bn_layer</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">num_filters</span><span class="o">=</span><span class="n">channel_num</span><span class="p">,</span> <span class="n">filter_size</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="n">stride</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="o">+</span><span class="s1">&#39;_shortcut&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">input</span>
<span class="k">def</span> <span class="nf">_conv_bn_layer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">num_filters</span><span class="p">,</span> <span class="n">filter_size</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="s1">&#39;SAME&#39;</span><span class="p">,</span> <span class="n">act</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">num_filters</span><span class="p">,</span> <span class="n">filter_size</span><span class="p">,</span> <span class="n">stride</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="o">+</span><span class="s1">&#39;_conv&#39;</span><span class="p">)</span>
<span class="n">bn</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">batch_norm</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="n">act</span><span class="o">=</span><span class="n">act</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="o">+</span><span class="s1">&#39;_bn&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">bn</span>
</pre></div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../nas_api/" class="btn btn-neutral" title="SA搜索"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../nas_api/" style="color: #fcfcfc;">&laquo; Previous</a></span>
</span>
</div>
<script>var base_url = '../..';</script>
<script src="../../js/theme.js" defer></script>
<script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>蒸馏 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "\u84b8\u998f";
var mkdocs_page_input_path = "api/single_distiller_api.md";
var mkdocs_page_url = null;
</script>
<script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../..">Home</a>
</li>
<li class="toctree-l1">
<span class="caption-text">教程</span>
<ul class="subnav">
<li class="">
<a class="" href="../../tutorials/quant_post_demo/">离线量化</a>
</li>
<li class="">
<a class="" href="../../tutorials/quant_aware_demo/">量化训练</a>
</li>
<li class="">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化</a>
</li>
<li class="">
<a class="" href="../../tutorials/nas_demo/">SA搜索</a>
</li>
</ul>
</li>
<li class="toctree-l1">
<span class="caption-text">API</span>
<ul class="subnav">
<li class="">
<a class="" href="../quantization_api/">量化</a>
</li>
<li class="">
<a class="" href="../prune_api/">剪枝</a>
</li>
<li class="">
<a class="" href="../analysis_api/">敏感度分析</a>
</li>
<li class=" current">
<a class="current" href="./">蒸馏</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#merge">merge</a></li>
<li class="toctree-l3"><a href="#fsp_loss">fsp_loss</a></li>
<li class="toctree-l3"><a href="#l2_loss">l2_loss</a></li>
<li class="toctree-l3"><a href="#soft_label_loss">soft_label_loss</a></li>
<li class="toctree-l3"><a href="#loss">loss</a></li>
<li class="toctree-l3"><a href="#_1">注意事项</a></li>
</ul>
</li>
<li class="">
<a class="" href="../nas_api/">SA搜索</a>
</li>
<li class="">
<a class="" href="../search_space/">搜索空间</a>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../..">PaddleSlim Docs</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../..">Docs</a> &raquo;</li>
<li>API &raquo;</li>
<li>蒸馏</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/api/single_distiller_api.md"
class="icon icon-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h2 id="merge">merge<a class="headerlink" href="#merge" title="Permanent link">#</a></h2>
<dl>
<dt>paddleslim.dist.merge(teacher_program, student_program, data_name_map, place, scope=fluid.global_scope(), name_prefix='teacher_'):</dt>
<dd>
<p>该方法将两个fluid program(teacher_program, student_program)融合为一个program,并将融合得到的program返回。在融合的program中,可以为其中合适的teacher特征图和student特征图添加蒸馏损失函数,从而达到用teacher模型的暗知识(Dark Knowledge)指导student模型学习的目的。</p>
</dd>
</dl>
<p><strong>参数:</strong></p>
<ul>
<li><strong>teacher_program</strong>(Program)-定义了teacher模型的paddle program</li>
<li><strong>student_program</strong>(Program)-定义了student模型的paddle program</li>
<li><strong>data_name_map</strong>(dict)-teacher输入接口名与student输入接口名的映射,key为teacher的输入名,value为student的输入名。merge函数将会把这两个模型的输入按对应关系合并在一起,保证teacher与student输入数据相同</li>
<li><strong>place</strong>(fluid.CPUPlace()|fluid.CUDAPlace(N))-该参数表示程序运行在何种设备上,这里的N为GPU对应的ID</li>
<li><strong>scope</strong>(Scope)-该参数表示teacher variables和student variables所使用的作用域,如果不指定将使用默认的全局作用域。默认值:fluid.global_scope()</li>
<li><strong>name_prefix</strong>(str)-为了避免teacher variables和student variables存在同名变量而引起命名冲突,merge函数将统一为teacher variables添加一个名称前缀name_prefix,merge后的program中所有teacher variables都将带有这一名称前缀。默认值:'teacher_'</li>
</ul>
<p><strong>返回:</strong> 由student_program和teacher_program merge得到的program</p>
<p><strong>使用示例:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="hll"><span class="kn">import</span> <span class="nn">paddleslim.dist</span> <span class="kn">as</span> <span class="nn">dist</span>
</span><span class="n">student_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="hll"><span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">student_program</span><span class="p">):</span>
</span> <span class="n">x</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">x</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="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">teacher_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">teacher_program</span><span class="p">):</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;y&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">y</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="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">data_name_map</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;y&#39;</span><span class="p">:</span><span class="s1">&#39;x&#39;</span><span class="p">}</span>
<span class="n">USE_GPU</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CUDAPlace</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">if</span> <span class="n">USE_GPU</span> <span class="k">else</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
<span class="n">main_program</span> <span class="o">=</span> <span class="n">dist</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="n">teacher_program</span><span class="p">,</span> <span class="n">student_program</span><span class="p">,</span>
<span class="n">data_name_map</span><span class="p">,</span> <span class="n">place</span><span class="p">)</span>
</pre></div>
<h2 id="fsp_loss">fsp_loss<a class="headerlink" href="#fsp_loss" title="Permanent link">#</a></h2>
<dl>
<dt>def fsp_loss(teacher_var1_name, teacher_var2_name, student_var1_name, student_var2_name, program=fluid.default_main_program()):</dt>
<dd>
<p>fsp_loss为program内的teacher var和student var添加fsp loss,出自论文<a href="http://openaccess.thecvf.com/content_cvpr_2017/papers/Yim_A_Gift_From_CVPR_2017_paper.pdf">A Gift from Knowledge Distillation: Fast Optimization, Network Minimization and Transfer Learning</a></p>
</dd>
</dl>
<p><strong>参数:</strong></p>
<ul>
<li><strong>teacher_var1_name</strong>(str): teacher_var1的名称. 对应的variable是一个形为<code>[batch_size, x_channel, height, width]</code>的4-D特征图Tensor,数据类型为float32或float64</li>
<li><strong>teacher_var2_name</strong>(str): teacher_var2的名称. 对应的variable是一个形为<code>[batch_size, y_channel, height, width]</code>的4-D特征图Tensor,数据类型为float32或float64。只有y_channel可以与teacher_var1的x_channel不同,其他维度必须与teacher_var1相同</li>
<li><strong>student_var1_name</strong>(str): student_var1的名称. 对应的variable需与teacher_var1尺寸保持一致,是一个形为<code>[batch_size, x_channel, height, width]</code>的4-D特征图Tensor,数据类型为float32或float64</li>
<li><strong>student_var2_name</strong>(str): student_var2的名称. 对应的variable需与teacher_var2尺寸保持一致,是一个形为<code>[batch_size, y_channel, height, width]</code>的4-D特征图Tensor,数据类型为float32或float64。只有y_channel可以与student_var1的x_channel不同,其他维度必须与student_var1相同</li>
<li><strong>program</strong>(Program): 用于蒸馏训练的fluid program。默认值:fluid.default_main_program()</li>
</ul>
<p><strong>返回:</strong>由teacher_var1, teacher_var2, student_var1, student_var2组合得到的fsp_loss</p>
<p><strong>使用示例:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="kn">import</span> <span class="nn">paddleslim.dist</span> <span class="kn">as</span> <span class="nn">dist</span>
<span class="n">student_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">student_program</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">x</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="n">name</span><span class="o">=</span><span class="s1">&#39;s1&#39;</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;s2&#39;</span><span class="p">)</span>
<span class="n">teacher_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">teacher_program</span><span class="p">):</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;y&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">y</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="n">name</span><span class="o">=</span><span class="s1">&#39;t1&#39;</span><span class="p">)</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;t2&#39;</span><span class="p">)</span>
<span class="n">data_name_map</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;y&#39;</span><span class="p">:</span><span class="s1">&#39;x&#39;</span><span class="p">}</span>
<span class="n">USE_GPU</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CUDAPlace</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">if</span> <span class="n">USE_GPU</span> <span class="k">else</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
<span class="n">main_program</span> <span class="o">=</span> <span class="n">merge</span><span class="p">(</span><span class="n">teacher_program</span><span class="p">,</span> <span class="n">student_program</span><span class="p">,</span> <span class="n">data_name_map</span><span class="p">,</span> <span class="n">place</span><span class="p">)</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">main_program</span><span class="p">):</span>
<span class="n">distillation_loss</span> <span class="o">=</span> <span class="n">dist</span><span class="o">.</span><span class="n">fsp_loss</span><span class="p">(</span><span class="s1">&#39;teacher_t1.tmp_1&#39;</span><span class="p">,</span> <span class="s1">&#39;teacher_t2.tmp_1&#39;</span><span class="p">,</span>
<span class="s1">&#39;s1.tmp_1&#39;</span><span class="p">,</span> <span class="s1">&#39;s2.tmp_1&#39;</span><span class="p">,</span> <span class="n">main_program</span><span class="p">)</span>
</pre></div>
<h2 id="l2_loss">l2_loss<a class="headerlink" href="#l2_loss" title="Permanent link">#</a></h2>
<dl>
<dt>def l2_loss(teacher_var_name, student_var_name, program=fluid.default_main_program()):</dt>
<dd>
<p>l2_loss为program内的teacher var和student var添加l2 loss</p>
</dd>
</dl>
<p><strong>参数:</strong></p>
<ul>
<li><strong>teacher_var_name</strong>(str): teacher_var的名称. </li>
<li><strong>student_var_name</strong>(str): student_var的名称.</li>
<li><strong>program</strong>(Program): 用于蒸馏训练的fluid program。默认值:fluid.default_main_program()</li>
</ul>
<p><strong>返回:</strong>由teacher_var, student_var组合得到的l2_loss</p>
<p><strong>使用示例:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="kn">import</span> <span class="nn">paddleslim.dist</span> <span class="kn">as</span> <span class="nn">dist</span>
<span class="n">student_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">student_program</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">x</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="n">name</span><span class="o">=</span><span class="s1">&#39;s1&#39;</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;s2&#39;</span><span class="p">)</span>
<span class="n">teacher_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">teacher_program</span><span class="p">):</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;y&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">y</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="n">name</span><span class="o">=</span><span class="s1">&#39;t1&#39;</span><span class="p">)</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;t2&#39;</span><span class="p">)</span>
<span class="n">data_name_map</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;y&#39;</span><span class="p">:</span><span class="s1">&#39;x&#39;</span><span class="p">}</span>
<span class="n">USE_GPU</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CUDAPlace</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">if</span> <span class="n">USE_GPU</span> <span class="k">else</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
<span class="n">main_program</span> <span class="o">=</span> <span class="n">merge</span><span class="p">(</span><span class="n">teacher_program</span><span class="p">,</span> <span class="n">student_program</span><span class="p">,</span> <span class="n">data_name_map</span><span class="p">,</span> <span class="n">place</span><span class="p">)</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">main_program</span><span class="p">):</span>
<span class="n">distillation_loss</span> <span class="o">=</span> <span class="n">dist</span><span class="o">.</span><span class="n">l2_loss</span><span class="p">(</span><span class="s1">&#39;teacher_t2.tmp_1&#39;</span><span class="p">,</span> <span class="s1">&#39;s2.tmp_1&#39;</span><span class="p">,</span>
<span class="n">main_program</span><span class="p">)</span>
</pre></div>
<h2 id="soft_label_loss">soft_label_loss<a class="headerlink" href="#soft_label_loss" title="Permanent link">#</a></h2>
<dl>
<dt>def soft_label_loss(teacher_var_name, student_var_name, program=fluid.default_main_program(), teacher_temperature=1., student_temperature=1.):</dt>
<dd>
<p>soft_label_loss为program内的teacher var和student var添加soft label loss,出自论文<a href="https://arxiv.org/pdf/1503.02531.pdf">Distilling the Knowledge in a Neural Network</a></p>
</dd>
</dl>
<p><strong>参数:</strong></p>
<ul>
<li><strong>teacher_var_name</strong>(str): teacher_var的名称. </li>
<li><strong>student_var_name</strong>(str): student_var的名称. </li>
<li><strong>program</strong>(Program): 用于蒸馏训练的fluid program。默认值:fluid.default_main_program()</li>
<li><strong>teacher_temperature</strong>(float): 对teacher_var进行soft操作的温度值,温度值越大得到的特征图越平滑 </li>
<li><strong>student_temperature</strong>(float): 对student_var进行soft操作的温度值,温度值越大得到的特征图越平滑 </li>
</ul>
<p><strong>返回:</strong>由teacher_var, student_var组合得到的soft_label_loss</p>
<p><strong>使用示例:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="kn">import</span> <span class="nn">paddleslim.dist</span> <span class="kn">as</span> <span class="nn">dist</span>
<span class="n">student_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">student_program</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">x</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="n">name</span><span class="o">=</span><span class="s1">&#39;s1&#39;</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;s2&#39;</span><span class="p">)</span>
<span class="n">teacher_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">teacher_program</span><span class="p">):</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;y&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">y</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="n">name</span><span class="o">=</span><span class="s1">&#39;t1&#39;</span><span class="p">)</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;t2&#39;</span><span class="p">)</span>
<span class="n">data_name_map</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;y&#39;</span><span class="p">:</span><span class="s1">&#39;x&#39;</span><span class="p">}</span>
<span class="n">USE_GPU</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CUDAPlace</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">if</span> <span class="n">USE_GPU</span> <span class="k">else</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
<span class="n">main_program</span> <span class="o">=</span> <span class="n">merge</span><span class="p">(</span><span class="n">teacher_program</span><span class="p">,</span> <span class="n">student_program</span><span class="p">,</span> <span class="n">data_name_map</span><span class="p">,</span> <span class="n">place</span><span class="p">)</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">main_program</span><span class="p">):</span>
<span class="n">distillation_loss</span> <span class="o">=</span> <span class="n">dist</span><span class="o">.</span><span class="n">soft_label_loss</span><span class="p">(</span><span class="s1">&#39;teacher_t2.tmp_1&#39;</span><span class="p">,</span>
<span class="s1">&#39;s2.tmp_1&#39;</span><span class="p">,</span> <span class="n">main_program</span><span class="p">,</span> <span class="mf">1.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">)</span>
</pre></div>
<h2 id="loss">loss<a class="headerlink" href="#loss" title="Permanent link">#</a></h2>
<dl>
<dt>def loss(loss_func, program=fluid.default_main_program(), **kwargs):</dt>
<dd>
<p>loss函数支持对任意多对teacher_var和student_var使用自定义损失函数</p>
</dd>
</dl>
<p><strong>参数:</strong></p>
<ul>
<li><strong>loss_func</strong>(python function): 自定义的损失函数,输入为teacher var和student var,输出为自定义的loss </li>
<li><strong>program</strong>(Program): 用于蒸馏训练的fluid program。默认值:fluid.default_main_program()</li>
<li><strong>**kwargs</strong>: loss_func输入名与对应variable名称</li>
</ul>
<p><strong>返回</strong>:自定义的损失函数loss</p>
<p><strong>使用示例:</strong></p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="kn">import</span> <span class="nn">paddleslim.dist</span> <span class="kn">as</span> <span class="nn">dist</span>
<span class="n">student_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">student_program</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">x</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="n">name</span><span class="o">=</span><span class="s1">&#39;s1&#39;</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;s2&#39;</span><span class="p">)</span>
<span class="n">teacher_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">teacher_program</span><span class="p">):</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;y&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">])</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">y</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="n">name</span><span class="o">=</span><span class="s1">&#39;t1&#39;</span><span class="p">)</span>
<span class="n">conv</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">conv</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;t2&#39;</span><span class="p">)</span>
<span class="n">data_name_map</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;y&#39;</span><span class="p">:</span><span class="s1">&#39;x&#39;</span><span class="p">}</span>
<span class="n">USE_GPU</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">place</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CUDAPlace</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">if</span> <span class="n">USE_GPU</span> <span class="k">else</span> <span class="n">fluid</span><span class="o">.</span><span class="n">CPUPlace</span><span class="p">()</span>
<span class="n">main_program</span> <span class="o">=</span> <span class="n">merge</span><span class="p">(</span><span class="n">teacher_program</span><span class="p">,</span> <span class="n">student_program</span><span class="p">,</span> <span class="n">data_name_map</span><span class="p">,</span> <span class="n">place</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">adaptation_loss</span><span class="p">(</span><span class="n">t_var</span><span class="p">,</span> <span class="n">s_var</span><span class="p">):</span>
<span class="n">teacher_channel</span> <span class="o">=</span> <span class="n">t_var</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">s_hint</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span><span class="n">s_var</span><span class="p">,</span> <span class="n">teacher_channel</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">hint_loss</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">reduce_mean</span><span class="p">(</span><span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">square</span><span class="p">(</span><span class="n">s_hint</span> <span class="o">-</span> <span class="n">t_var</span><span class="p">))</span>
<span class="k">return</span> <span class="n">hint_loss</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">main_program</span><span class="p">):</span>
<span class="n">distillation_loss</span> <span class="o">=</span> <span class="n">dist</span><span class="o">.</span><span class="n">loss</span><span class="p">(</span><span class="n">main_program</span><span class="p">,</span> <span class="n">adaptation_loss</span><span class="p">,</span>
<span class="n">t_var</span><span class="o">=</span><span class="s1">&#39;teacher_t2.tmp_1&#39;</span><span class="p">,</span> <span class="n">s_var</span><span class="o">=</span><span class="s1">&#39;s2.tmp_1&#39;</span><span class="p">)</span>
</pre></div>
<h2 id="_1">注意事项<a class="headerlink" href="#_1" title="Permanent link">#</a></h2>
<p>在添加蒸馏loss时会引入新的variable,需要注意新引入的variable不要与student variables命名冲突。这里建议两种用法:</p>
<ol>
<li>建议与student_program使用同一个命名空间,以避免一些未指定名称的variables(例如tmp_0, tmp_1...)多次定义为同一名称出现命名冲突</li>
<li>建议在添加蒸馏loss时指定一个命名空间前缀,具体用法请参考Paddle官方文档<a href="https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/name_scope_cn.html#name-scope">fluid.name_scope</a></li>
</ol>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../nas_api/" class="btn btn-neutral float-right" title="SA搜索">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../analysis_api/" class="btn btn-neutral" title="敏感度分析"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../analysis_api/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../nas_api/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../..';</script>
<script src="../../js/theme.js" defer></script>
<script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>模型分析API文档 - PaddleSlim</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "\u6a21\u578b\u5206\u6790API\u6587\u6863";
var mkdocs_page_input_path = "docs/api/analysis_api.md";
var mkdocs_page_url = null;
</script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a>
</li>
<li class="toctree-l1">
<span class="caption-text">Docs</span>
<ul class="subnav">
<li class="">
<a class="" href="../../">PaddleSlim</a>
</li>
<li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a>
</li>
<li class=" current">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3 current">
<a class="current" href="./">模型分析API文档</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#api">模型分析API文档</a></li>
<ul>
<li><a class="toctree-l5" href="#flops">flops</a></li>
<li><a class="toctree-l5" href="#model_size">model_size</a></li>
<li><a class="toctree-l5" href="#tablelatencyevaluator">TableLatencyEvaluator</a></li>
</ul>
</ul>
</li>
<li class="toctree-l3">
<a class="" href="../api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="../nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="../single_distiller_api/">paddleslim.dist API文档</a>
</li>
</ul>
</li>
<li class="">
<span class="caption-text">Tutorials</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../tutorials/demo_guide/">Demo guide</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/nas_demo/">网络结构搜索示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_aware_demo/">在线量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_post_demo/">离线量化示例</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li>
<li>Api &raquo;</li>
<li>Docs &raquo;</li>
<li>模型分析API文档</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="api">模型分析API文档</h1>
<h2 id="flops">flops</h2>
<blockquote>
<p>paddleslim.analysis.flops(program, detail=False) <a href="">源代码</a></p>
</blockquote>
<p>获得指定网络的每秒浮点运算次数(FLOPS)。</p>
<p><strong>参数:</strong></p>
<ul>
<li>
<p><strong>program(paddle.fluid.Program):</strong> 待分析的目标网络。更多关于Program的介绍请参考:<a href="https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/Program_cn.html#program">Program概念介绍</a></p>
</li>
<li>
<p><strong>detail(bool):</strong> 是否返回每个卷积层的FLOPS。默认为False。</p>
</li>
</ul>
<p><strong>返回值:</strong></p>
<ul>
<li>
<p><strong>flops(float):</strong> 整个网络的FLOPS。</p>
</li>
<li>
<p><strong>params2flops(dict):</strong> 每层卷积对应的FLOPS,其中key为卷积层参数名称,value为FLOPS值。</p>
</li>
</ul>
<p><strong>示例:</strong></p>
<pre><code>import paddle.fluid as fluid
from paddle.fluid.param_attr import ParamAttr
from paddleslim.analysis import flops
def conv_bn_layer(input,
num_filters,
filter_size,
name,
stride=1,
groups=1,
act=None):
conv = fluid.layers.conv2d(
input=input,
num_filters=num_filters,
filter_size=filter_size,
stride=stride,
padding=(filter_size - 1) // 2,
groups=groups,
act=None,
param_attr=ParamAttr(name=name + &quot;_weights&quot;),
bias_attr=False,
name=name + &quot;_out&quot;)
bn_name = name + &quot;_bn&quot;
return fluid.layers.batch_norm(
input=conv,
act=act,
name=bn_name + '_output',
param_attr=ParamAttr(name=bn_name + '_scale'),
bias_attr=ParamAttr(bn_name + '_offset'),
moving_mean_name=bn_name + '_mean',
moving_variance_name=bn_name + '_variance', )
main_program = fluid.Program()
startup_program = fluid.Program()
# X X O X O
# conv1--&gt;conv2--&gt;sum1--&gt;conv3--&gt;conv4--&gt;sum2--&gt;conv5--&gt;conv6
# | ^ | ^
# |____________| |____________________|
#
# X: prune output channels
# O: prune input channels
with fluid.program_guard(main_program, startup_program):
input = fluid.data(name=&quot;image&quot;, shape=[None, 3, 16, 16])
conv1 = conv_bn_layer(input, 8, 3, &quot;conv1&quot;)
conv2 = conv_bn_layer(conv1, 8, 3, &quot;conv2&quot;)
sum1 = conv1 + conv2
conv3 = conv_bn_layer(sum1, 8, 3, &quot;conv3&quot;)
conv4 = conv_bn_layer(conv3, 8, 3, &quot;conv4&quot;)
sum2 = conv4 + sum1
conv5 = conv_bn_layer(sum2, 8, 3, &quot;conv5&quot;)
conv6 = conv_bn_layer(conv5, 8, 3, &quot;conv6&quot;)
print(&quot;FLOPS: {}&quot;.format(flops(main_program)))
</code></pre>
<h2 id="model_size">model_size</h2>
<blockquote>
<p>paddleslim.analysis.model_size(program) <a href="">源代码</a></p>
</blockquote>
<p>获得指定网络的参数数量。</p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>program(paddle.fluid.Program):</strong> 待分析的目标网络。更多关于Program的介绍请参考:<a href="https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/Program_cn.html#program">Program概念介绍</a></li>
</ul>
<p><strong>返回值:</strong></p>
<ul>
<li><strong>model_size(int):</strong> 整个网络的参数数量。</li>
</ul>
<p><strong>示例:</strong></p>
<pre><code>import paddle.fluid as fluid
from paddle.fluid.param_attr import ParamAttr
from paddleslim.analysis import model_size
def conv_layer(input,
num_filters,
filter_size,
name,
stride=1,
groups=1,
act=None):
conv = fluid.layers.conv2d(
input=input,
num_filters=num_filters,
filter_size=filter_size,
stride=stride,
padding=(filter_size - 1) // 2,
groups=groups,
act=None,
param_attr=ParamAttr(name=name + &quot;_weights&quot;),
bias_attr=False,
name=name + &quot;_out&quot;)
return conv
main_program = fluid.Program()
startup_program = fluid.Program()
# X X O X O
# conv1--&gt;conv2--&gt;sum1--&gt;conv3--&gt;conv4--&gt;sum2--&gt;conv5--&gt;conv6
# | ^ | ^
# |____________| |____________________|
#
# X: prune output channels
# O: prune input channels
with fluid.program_guard(main_program, startup_program):
input = fluid.data(name=&quot;image&quot;, shape=[None, 3, 16, 16])
conv1 = conv_layer(input, 8, 3, &quot;conv1&quot;)
conv2 = conv_layer(conv1, 8, 3, &quot;conv2&quot;)
sum1 = conv1 + conv2
conv3 = conv_layer(sum1, 8, 3, &quot;conv3&quot;)
conv4 = conv_layer(conv3, 8, 3, &quot;conv4&quot;)
sum2 = conv4 + sum1
conv5 = conv_layer(sum2, 8, 3, &quot;conv5&quot;)
conv6 = conv_layer(conv5, 8, 3, &quot;conv6&quot;)
print(&quot;FLOPS: {}&quot;.format(model_size(main_program)))
</code></pre>
<h2 id="tablelatencyevaluator">TableLatencyEvaluator</h2>
<blockquote>
<p>paddleslim.analysis.TableLatencyEvaluator(table_file, delimiter=",") <a href="">源代码</a></p>
</blockquote>
<p>基于硬件延时表的模型延时评估器。</p>
<p><strong>参数:</strong></p>
<ul>
<li>
<p><strong>table_file(str):</strong> 所使用的延时评估表的绝对路径。关于演示评估表格式请参考:<a href="../paddleslim/analysis/table_latency.md">PaddleSlim硬件延时评估表格式</a></p>
</li>
<li>
<p><strong>delimiter(str):</strong> 硬件延时评估表中,操作信息之前所使用的分割符,默认为英文字符逗号。</p>
</li>
</ul>
<p><strong>返回值:</strong></p>
<ul>
<li><strong>Evaluator:</strong> 硬件延时评估器的实例。</li>
</ul>
<blockquote>
<p>paddleslim.analysis.TableLatencyEvaluator.latency(graph) <a href="">源代码</a></p>
</blockquote>
<p>获得指定网络的预估延时。</p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>graph(Program):</strong> 待预估的目标网络。</li>
</ul>
<p><strong>返回值:</strong></p>
<ul>
<li><strong>latency:</strong> 目标网络的预估延时。</li>
</ul>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../api_guide/" class="btn btn-neutral float-right" title="PaddleSlim API文档导航">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../../table_latency/" class="btn btn-neutral" title="硬件延时评估表"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<span><a href="../../table_latency/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../api_guide/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../../..';</script>
<script src="../../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>paddleslim.nas API文档 - PaddleSlim</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "paddleslim.nas API\u6587\u6863";
var mkdocs_page_input_path = "docs/api/nas_api.md";
var mkdocs_page_url = null;
</script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a>
</li>
<li class="toctree-l1">
<span class="caption-text">Docs</span>
<ul class="subnav">
<li class="">
<a class="" href="../../">PaddleSlim</a>
</li>
<li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a>
</li>
<li class=" current">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3 current">
<a class="current" href="./">paddleslim.nas API文档</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#paddleslimnas-api">paddleslim.nas API文档</a></li>
<ul>
<li><a class="toctree-l5" href="#sanas-api">SANAS API文档</a></li>
<li><a class="toctree-l5" href="#class-sanas">class SANAS</a></li>
</ul>
</ul>
</li>
<li class="toctree-l3">
<a class="" href="../prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="../single_distiller_api/">paddleslim.dist API文档</a>
</li>
</ul>
</li>
<li class="">
<span class="caption-text">Tutorials</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../tutorials/demo_guide/">Demo guide</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/nas_demo/">网络结构搜索示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_aware_demo/">在线量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_post_demo/">离线量化示例</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li>
<li>Api &raquo;</li>
<li>Docs &raquo;</li>
<li>paddleslim.nas API文档</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="paddleslimnas-api">paddleslim.nas API文档</h1>
<h2 id="sanas-api">SANAS API文档</h2>
<h2 id="class-sanas">class SANAS</h2>
<p>SANAS(Simulated Annealing Neural Architecture Search)是基于模拟退火算法进行模型结构搜索的算法,一般用于离散搜索任务。</p>
<hr />
<blockquote>
<p>paddleslim.nas.SANAS(configs, server_addr, init_temperature, reduce_rate, search_steps, save_checkpoint, load_checkpoint, is_server)</p>
</blockquote>
<p><strong>参数:</strong>
- <strong>configs(list<tuple>):</strong> 搜索空间配置列表,格式是<code>[(key, {input_size, output_size, block_num, block_mask})]</code>或者<code>[(key)]</code>(MobileNetV2、MobilenetV1和ResNet的搜索空间使用和原本网络结构相同的搜索空间,所以仅需指定<code>key</code>即可), <code>input_size</code><code>output_size</code>表示输入和输出的特征图的大小,<code>block_num</code>是指搜索网络中的block数量,<code>block_mask</code>是一组由0和1组成的列表,0代表不进行下采样的block,1代表下采样的block。 更多paddleslim提供的搜索空间配置可以参考。
- <strong>server_addr(tuple):</strong> SANAS的地址,包括server的ip地址和端口号,如果ip地址为None或者为""的话则默认使用本机ip。默认:("", 8881)。
- <strong>init_temperature(float):</strong> 基于模拟退火进行搜索的初始温度。默认:100。
- <strong>reduce_rate(float):</strong> 基于模拟退火进行搜索的衰减率。默认:0.85。
- <strong>search_steps(int):</strong> 搜索过程迭代的次数。默认:300。
- <strong>save_checkpoint(str|None):</strong> 保存checkpoint的文件目录,如果设置为None的话则不保存checkpoint。默认:<code>./nas_checkpoint</code>
- <strong>load_checkpoint(str|None):</strong> 加载checkpoint的文件目录,如果设置为None的话则不加载checkpoint。默认:None。
- <strong>is_server(bool):</strong> 当前实例是否要启动一个server。默认:True。</p>
<p><strong>返回:</strong>
一个SANAS类的实例</p>
<p><strong>示例代码:</strong></p>
<pre><code>from paddleslim.nas import SANAS
config = [('MobileNetV2Space')]
sanas = SANAS(config=config)
</code></pre>
<hr />
<blockquote>
<p>tokens2arch(tokens)
通过一组token得到实际的模型结构,一般用来把搜索到最优的token转换为模型结构用来做最后的训练。</p>
</blockquote>
<p><strong>参数:</strong>
- <strong>tokens(list):</strong> 一组token。</p>
<p><strong>返回</strong>
返回一个模型结构实例。</p>
<p><strong>示例代码:</strong></p>
<pre><code>import paddle.fluid as fluid
input = fluid.data(name='input', shape=[None, 3, 32, 32], dtype='float32')
archs = sanas.token2arch(tokens)
for arch in archs:
output = arch(input)
input = output
</code></pre>
<hr />
<blockquote>
<p>next_archs():
获取下一组模型结构。</p>
</blockquote>
<p><strong>返回</strong>
返回模型结构实例的列表,形式为list。</p>
<p><strong>示例代码:</strong></p>
<pre><code>import paddle.fluid as fluid
input = fluid.data(name='input', shape=[None, 3, 32, 32], dtype='float32')
archs = sanas.next_archs()
for arch in archs:
output = arch(input)
input = output
</code></pre>
<hr />
<blockquote>
<p>reward(score):
把当前模型结构的得分情况回传。</p>
</blockquote>
<p><strong>参数:</strong>
<strong>score<float>:</strong> 当前模型的得分,分数越大越好。</p>
<p><strong>返回</strong>
模型结构更新成功或者失败,成功则返回<code>True</code>,失败则返回<code>False</code></p>
<p><strong>代码示例</strong></p>
<pre><code class="python">import numpy as np
import paddle
import paddle.fluid as fluid
from paddleslim.nas import SANAS
from paddleslim.analysis import flops
max_flops = 321208544
batch_size = 256
# 搜索空间配置
config=[('MobileNetV2Space')]
# 实例化SANAS
sa_nas = SANAS(config, server_addr=(&quot;&quot;, 8887), init_temperature=10.24, reduce_rate=0.85, search_steps=100, is_server=True)
for step in range(100):
archs = sa_nas.next_archs()
train_program = fluid.Program()
test_program = fluid.Program()
startup_program = fluid.Program()
### 构造训练program
with fluid.program_guard(train_program, startup_program):
image = fluid.data(name='image', shape=[None, 3, 32, 32], dtype='float32')
label = fluid.data(name='label', shape=[None, 1], dtype='int64')
for arch in archs:
output = arch(image)
out = fluid.layers.fc(output, size=10, act=&quot;softmax&quot;)
softmax_out = fluid.layers.softmax(input=out, use_cudnn=False)
cost = fluid.layers.cross_entropy(input=softmax_out, label=label)
avg_cost = fluid.layers.mean(cost)
acc_top1 = fluid.layers.accuracy(input=softmax_out, label=label, k=1)
### 构造测试program
test_program = train_program.clone(for_test=True)
### 定义优化器
sgd = fluid.optimizer.SGD(learning_rate=1e-3)
sgd.minimize(avg_cost)
### 增加限制条件,如果没有则进行无限制搜索
if flops(train_program) &gt; max_flops:
continue
### 定义代码是在cpu上运行
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(startup_program)
### 定义训练输入数据
train_reader = paddle.batch(
paddle.reader.shuffle(
paddle.dataset.cifar.train10(cycle=False), buf_size=1024),
batch_size=batch_size,
drop_last=True)
### 定义预测输入数据
test_reader = paddle.batch(
paddle.dataset.cifar.test10(cycle=False),
batch_size=batch_size,
drop_last=False)
train_feeder = fluid.DataFeeder([image, label], place, program=train_program)
test_feeder = fluid.DataFeeder([image, label], place, program=test_program)
### 开始训练,每个搜索结果训练5个epoch
for epoch_id in range(5):
for batch_id, data in enumerate(train_reader()):
fetches = [avg_cost.name]
outs = exe.run(train_program,
feed=train_feeder.feed(data),
fetch_list=fetches)[0]
if batch_id % 10 == 0:
print('TRAIN: steps: {}, epoch: {}, batch: {}, cost: {}'.format(step, epoch_id, batch_id, outs[0]))
### 开始预测,得到最终的测试结果作为score回传给sa_nas
reward = []
for batch_id, data in enumerate(test_reader()):
test_fetches = [
avg_cost.name, acc_top1.name
]
batch_reward = exe.run(test_program,
feed=test_feeder.feed(data),
fetch_list=test_fetches)
reward_avg = np.mean(np.array(batch_reward), axis=1)
reward.append(reward_avg)
print('TEST: step: {}, batch: {}, avg_cost: {}, acc_top1: {}'.
format(step, batch_id, batch_reward[0],batch_reward[1]))
finally_reward = np.mean(np.array(reward), axis=0)
print(
'FINAL TEST: avg_cost: {}, acc_top1: {}'.format(
finally_reward[0], finally_reward[1]))
### 回传score
sa_nas.reward(float(finally_reward[1]))
</code></pre>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../prune_api/" class="btn btn-neutral float-right" title="卷积通道剪裁API文档">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../api_guide/" class="btn btn-neutral" title="PaddleSlim API文档导航"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<span><a href="../api_guide/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../prune_api/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../../..';</script>
<script src="../../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>卷积通道剪裁API文档 - PaddleSlim</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "\u5377\u79ef\u901a\u9053\u526a\u88c1API\u6587\u6863";
var mkdocs_page_input_path = "docs/api/prune_api.md";
var mkdocs_page_url = null;
</script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a>
</li>
<li class="toctree-l1">
<span class="caption-text">Docs</span>
<ul class="subnav">
<li class="">
<a class="" href="../../">PaddleSlim</a>
</li>
<li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a>
</li>
<li class=" current">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="../nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3 current">
<a class="current" href="./">卷积通道剪裁API文档</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#api">卷积通道剪裁API文档</a></li>
<ul>
<li><a class="toctree-l5" href="#class-pruner">class Pruner</a></li>
<li><a class="toctree-l5" href="#sensitivity">sensitivity</a></li>
<li><a class="toctree-l5" href="#merge_sensitive">merge_sensitive</a></li>
<li><a class="toctree-l5" href="#load_sensitivities">load_sensitivities</a></li>
<li><a class="toctree-l5" href="#get_ratios_by_losssensitivities-loss">get_ratios_by_loss(sensitivities, loss)</a></li>
</ul>
</ul>
</li>
<li class="toctree-l3">
<a class="" href="../quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="../single_distiller_api/">paddleslim.dist API文档</a>
</li>
</ul>
</li>
<li class="">
<span class="caption-text">Tutorials</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../tutorials/demo_guide/">Demo guide</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/nas_demo/">网络结构搜索示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_aware_demo/">在线量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_post_demo/">离线量化示例</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li>
<li>Api &raquo;</li>
<li>Docs &raquo;</li>
<li>卷积通道剪裁API文档</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="api">卷积通道剪裁API文档</h1>
<h2 id="class-pruner">class Pruner</h2>
<hr />
<blockquote>
<p>paddleslim.prune.Pruner(criterion="l1_norm")<a href="">源代码</a></p>
</blockquote>
<p>对卷积网络的通道进行一次剪裁。剪裁一个卷积层的通道,是指剪裁该卷积层输出的通道。卷积层的权重形状为<code>[output_channel, input_channel, kernel_size, kernel_size]</code>,通过剪裁该权重的第一纬度达到剪裁输出通道数的目的。</p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>criterion:</strong> 评估一个卷积层内通道重要性所参考的指标。目前仅支持<code>l1_norm</code>。默认为<code>l1_norm</code></li>
</ul>
<p><strong>返回:</strong> 一个Pruner类的实例</p>
<p><strong>示例代码:</strong></p>
<pre><code>from paddleslim.prune import Pruner
pruner = Pruner()
</code></pre>
<hr />
<blockquote>
<p>prune(program, scope, params, ratios, place=None, lazy=False, only_graph=False, param_backup=False, param_shape_backup=False)</p>
</blockquote>
<p>对目标网络的一组卷积层的权重进行裁剪。</p>
<p><strong>参数:</strong></p>
<ul>
<li>
<p><strong>program(paddle.fluid.Program):</strong> 要裁剪的目标网络。更多关于Program的介绍请参考:<a href="https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/Program_cn.html#program">Program概念介绍</a></p>
</li>
<li>
<p><strong>scope(paddle.fluid.Scope):</strong> 要裁剪的权重所在的<code>scope</code>,Paddle中用<code>scope</code>实例存放模型参数和运行时变量的值。Scope中的参数值会被<code>inplace</code>的裁剪。更多介绍请参考<a href="">Scope概念介绍</a></p>
</li>
<li>
<p><strong>params(list<str>):</strong> 需要被裁剪的卷积层的参数的名称列表。可以通过以下方式查看模型中所有参数的名称:</p>
</li>
</ul>
<pre><code>for block in program.blocks:
for param in block.all_parameters():
print(&quot;param: {}; shape: {}&quot;.format(param.name, param.shape))
</code></pre>
<ul>
<li>
<p><strong>ratios(list<float>):</strong> 用于裁剪<code>params</code>的剪切率,类型为列表。该列表长度必须与<code>params</code>的长度一致。</p>
</li>
<li>
<p><strong>place(paddle.fluid.Place):</strong> 待裁剪参数所在的设备位置,可以是<code>CUDAPlace</code><code>CPUPlace</code><a href="">Place概念介绍</a></p>
</li>
<li>
<p><strong>lazy(bool):</strong> <code>lazy</code>为True时,通过将指定通道的参数置零达到裁剪的目的,参数的<code>shape保持不变</code><code>lazy</code>为False时,直接将要裁的通道的参数删除,参数的<code>shape</code>会发生变化。</p>
</li>
<li>
<p><strong>only_graph(bool):</strong> 是否只裁剪网络结构。在Paddle中,Program定义了网络结构,Scope存储参数的数值。一个Scope实例可以被多个Program使用,比如定义了训练网络的Program和定义了测试网络的Program是使用同一个Scope实例的。<code>only_graph</code>为True时,只对Program中定义的卷积的通道进行剪裁;<code>only_graph</code>为false时,Scope中卷积参数的数值也会被剪裁。默认为False。</p>
</li>
<li>
<p><strong>param_backup(bool):</strong> 是否返回对参数值的备份。默认为False。</p>
</li>
<li>
<p><strong>param_shape_backup(bool):</strong> 是否返回对参数<code>shape</code>的备份。默认为False。</p>
</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>
<p><strong>pruned_program(paddle.fluid.Program):</strong> 被裁剪后的Program。</p>
</li>
<li>
<p><strong>param_backup(dict):</strong> 对参数数值的备份,用于恢复Scope中的参数数值。</p>
</li>
<li>
<p><strong>param_shape_backup(dict):</strong> 对参数形状的备份。</p>
</li>
</ul>
<p><strong>示例:</strong></p>
<p>点击<a href="https://aistudio.baidu.com/aistudio/projectDetail/200786">AIStudio</a>执行以下示例代码。</p>
<pre><code>
import paddle.fluid as fluid
from paddle.fluid.param_attr import ParamAttr
from paddleslim.prune import Pruner
def conv_bn_layer(input,
num_filters,
filter_size,
name,
stride=1,
groups=1,
act=None):
conv = fluid.layers.conv2d(
input=input,
num_filters=num_filters,
filter_size=filter_size,
stride=stride,
padding=(filter_size - 1) // 2,
groups=groups,
act=None,
param_attr=ParamAttr(name=name + &quot;_weights&quot;),
bias_attr=False,
name=name + &quot;_out&quot;)
bn_name = name + &quot;_bn&quot;
return fluid.layers.batch_norm(
input=conv,
act=act,
name=bn_name + '_output',
param_attr=ParamAttr(name=bn_name + '_scale'),
bias_attr=ParamAttr(bn_name + '_offset'),
moving_mean_name=bn_name + '_mean',
moving_variance_name=bn_name + '_variance', )
main_program = fluid.Program()
startup_program = fluid.Program()
# X X O X O
# conv1--&gt;conv2--&gt;sum1--&gt;conv3--&gt;conv4--&gt;sum2--&gt;conv5--&gt;conv6
# | ^ | ^
# |____________| |____________________|
#
# X: prune output channels
# O: prune input channels
with fluid.program_guard(main_program, startup_program):
input = fluid.data(name=&quot;image&quot;, shape=[None, 3, 16, 16])
conv1 = conv_bn_layer(input, 8, 3, &quot;conv1&quot;)
conv2 = conv_bn_layer(conv1, 8, 3, &quot;conv2&quot;)
sum1 = conv1 + conv2
conv3 = conv_bn_layer(sum1, 8, 3, &quot;conv3&quot;)
conv4 = conv_bn_layer(conv3, 8, 3, &quot;conv4&quot;)
sum2 = conv4 + sum1
conv5 = conv_bn_layer(sum2, 8, 3, &quot;conv5&quot;)
conv6 = conv_bn_layer(conv5, 8, 3, &quot;conv6&quot;)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
scope = fluid.Scope()
exe.run(startup_program, scope=scope)
pruner = Pruner()
main_program, _, _ = pruner.prune(
main_program,
scope,
params=[&quot;conv4_weights&quot;],
ratios=[0.5],
place=place,
lazy=False,
only_graph=False,
param_backup=False,
param_shape_backup=False)
for param in main_program.global_block().all_parameters():
if &quot;weights&quot; in param.name:
print(&quot;param name: {}; param shape: {}&quot;.format(param.name, param.shape))
</code></pre>
<hr />
<h2 id="sensitivity">sensitivity</h2>
<blockquote>
<p>paddleslim.prune.sensitivity(program, place, param_names, eval_func, sensitivities_file=None, pruned_ratios=None) <a href="">源代码</a></p>
</blockquote>
<p>计算网络中每个卷积层的敏感度。每个卷积层的敏感度信息统计方法为:依次剪掉当前卷积层不同比例的输出通道数,在测试集上计算剪裁后的精度损失。得到敏感度信息后,可以通过观察或其它方式确定每层卷积的剪裁率。</p>
<p><strong>参数:</strong></p>
<ul>
<li>
<p><strong>program(paddle.fluid.Program):</strong> 待评估的目标网络。更多关于Program的介绍请参考:<a href="https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/Program_cn.html#program">Program概念介绍</a></p>
</li>
<li>
<p><strong>place(paddle.fluid.Place):</strong> 待分析的参数所在的设备位置,可以是<code>CUDAPlace</code><code>CPUPlace</code><a href="">Place概念介绍</a></p>
</li>
<li>
<p><strong>param_names(list<str>):</strong> 待分析的卷积层的参数的名称列表。可以通过以下方式查看模型中所有参数的名称:</p>
</li>
</ul>
<pre><code>for block in program.blocks:
for param in block.all_parameters():
print(&quot;param: {}; shape: {}&quot;.format(param.name, param.shape))
</code></pre>
<ul>
<li>
<p><strong>eval_func(function):</strong> 用于评估裁剪后模型效果的回调函数。该回调函数接受被裁剪后的<code>program</code>为参数,返回一个表示当前program的精度,用以计算当前裁剪带来的精度损失。</p>
</li>
<li>
<p><strong>sensitivities_file(str):</strong> 保存敏感度信息的本地文件系统的文件。在敏感度计算过程中,会持续将新计算出的敏感度信息追加到该文件中。重启任务后,文件中已有敏感度信息不会被重复计算。该文件可以用<code>pickle</code>加载。</p>
</li>
<li>
<p><strong>pruned_ratios(list<float>):</strong> 计算卷积层敏感度信息时,依次剪掉的通道数比例。默认为[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]。</p>
</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li><strong>sensitivities(dict):</strong> 存放敏感度信息的dict,其格式为:</li>
</ul>
<pre><code>{&quot;weight_0&quot;:
{0.1: 0.22,
0.2: 0.33
},
&quot;weight_1&quot;:
{0.1: 0.21,
0.2: 0.4
}
}
</code></pre>
<p>其中,<code>weight_0</code>是卷积层参数的名称,sensitivities['weight_0']的<code>value</code>为剪裁比例,<code>value</code>为精度损失的比例。</p>
<p><strong>示例:</strong></p>
<p>点击<a href="https://aistudio.baidu.com/aistudio/projectdetail/201401">AIStudio</a>运行以下示例代码。</p>
<pre><code>import paddle
import numpy as np
import paddle.fluid as fluid
from paddle.fluid.param_attr import ParamAttr
from paddleslim.prune import sensitivity
import paddle.dataset.mnist as reader
def conv_bn_layer(input,
num_filters,
filter_size,
name,
stride=1,
groups=1,
act=None):
conv = fluid.layers.conv2d(
input=input,
num_filters=num_filters,
filter_size=filter_size,
stride=stride,
padding=(filter_size - 1) // 2,
groups=groups,
act=None,
param_attr=ParamAttr(name=name + &quot;_weights&quot;),
bias_attr=False,
name=name + &quot;_out&quot;)
bn_name = name + &quot;_bn&quot;
return fluid.layers.batch_norm(
input=conv,
act=act,
name=bn_name + '_output',
param_attr=ParamAttr(name=bn_name + '_scale'),
bias_attr=ParamAttr(bn_name + '_offset'),
moving_mean_name=bn_name + '_mean',
moving_variance_name=bn_name + '_variance', )
main_program = fluid.Program()
startup_program = fluid.Program()
# X X O X O
# conv1--&gt;conv2--&gt;sum1--&gt;conv3--&gt;conv4--&gt;sum2--&gt;conv5--&gt;conv6
# | ^ | ^
# |____________| |____________________|
#
# X: prune output channels
# O: prune input channels
image_shape = [1,28,28]
with fluid.program_guard(main_program, startup_program):
image = fluid.data(name='image', shape=[None]+image_shape, dtype='float32')
label = fluid.data(name='label', shape=[None, 1], dtype='int64')
conv1 = conv_bn_layer(image, 8, 3, &quot;conv1&quot;)
conv2 = conv_bn_layer(conv1, 8, 3, &quot;conv2&quot;)
sum1 = conv1 + conv2
conv3 = conv_bn_layer(sum1, 8, 3, &quot;conv3&quot;)
conv4 = conv_bn_layer(conv3, 8, 3, &quot;conv4&quot;)
sum2 = conv4 + sum1
conv5 = conv_bn_layer(sum2, 8, 3, &quot;conv5&quot;)
conv6 = conv_bn_layer(conv5, 8, 3, &quot;conv6&quot;)
out = fluid.layers.fc(conv6, size=10, act=&quot;softmax&quot;)
# cost = fluid.layers.cross_entropy(input=out, label=label)
# avg_cost = fluid.layers.mean(x=cost)
acc_top1 = fluid.layers.accuracy(input=out, label=label, k=1)
# acc_top5 = fluid.layers.accuracy(input=out, label=label, k=5)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(startup_program)
val_reader = paddle.batch(reader.test(), batch_size=128)
val_feeder = feeder = fluid.DataFeeder(
[image, label], place, program=main_program)
def eval_func(program):
acc_top1_ns = []
for data in val_reader():
acc_top1_n = exe.run(program,
feed=val_feeder.feed(data),
fetch_list=[acc_top1.name])
acc_top1_ns.append(np.mean(acc_top1_n))
return np.mean(acc_top1_ns)
param_names = []
for param in main_program.global_block().all_parameters():
if &quot;weights&quot; in param.name:
param_names.append(param.name)
sensitivities = sensitivity(main_program,
place,
param_names,
eval_func,
sensitivities_file=&quot;./sensitive.data&quot;,
pruned_ratios=[0.1, 0.2, 0.3])
print(sensitivities)
</code></pre>
<h2 id="merge_sensitive">merge_sensitive</h2>
<blockquote>
<p>merge_sensitive(sensitivities)</p>
</blockquote>
<p>合并多个敏感度信息。</p>
<p>参数:</p>
<ul>
<li><strong>sensitivities(list<dict> | list<str>):</strong> 待合并的敏感度信息,可以是字典的列表,或者是存放敏感度信息的文件的路径列表。</li>
</ul>
<p>返回:</p>
<ul>
<li><strong>sensitivities(dict):</strong> 合并后的敏感度信息。其格式为:</li>
</ul>
<pre><code>{&quot;weight_0&quot;:
{0.1: 0.22,
0.2: 0.33
},
&quot;weight_1&quot;:
{0.1: 0.21,
0.2: 0.4
}
}
</code></pre>
<p>其中,<code>weight_0</code>是卷积层参数的名称,sensitivities['weight_0']的<code>value</code>为剪裁比例,<code>value</code>为精度损失的比例。</p>
<p>示例:</p>
<h2 id="load_sensitivities">load_sensitivities</h2>
<blockquote>
<p>load_sensitivities(sensitivities_file)</p>
</blockquote>
<p>从文件中加载敏感度信息。</p>
<p>参数:</p>
<ul>
<li><strong>sensitivities_file(str):</strong> 存放敏感度信息的本地文件.</li>
</ul>
<p>返回:</p>
<ul>
<li><strong>sensitivities(dict)</strong>敏感度信息。</li>
</ul>
<p>示例:</p>
<h2 id="get_ratios_by_losssensitivities-loss">get_ratios_by_loss(sensitivities, loss)</h2>
<p>根据敏感度和精度损失阈值计算出一组剪切率。对于参数<code>w</code>, 其剪裁率为使精度损失低于<code>loss</code>的最大剪裁率。</p>
<p>参数:</p>
<ul>
<li>
<p><strong>sensitivities(dict):</strong> 敏感度信息。</p>
</li>
<li>
<p><strong>loss:</strong> 精度损失阈值。</p>
</li>
</ul>
<p>返回:</p>
<ul>
<li>ratios(dict): 一组剪切率。<code>key</code>是待剪裁参数的名称。<code>value</code>是对应参数的剪裁率。</li>
</ul>
<p>示例:</p>
<pre><code>
</code></pre>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../quantization_api/" class="btn btn-neutral float-right" title="paddleslim.quant API文档">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../nas_api/" class="btn btn-neutral" title="paddleslim.nas API文档"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<span><a href="../nas_api/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../quantization_api/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../../..';</script>
<script src="../../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>paddleslim.nas 提供的搜索空间: - PaddleSlim</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "paddleslim.nas \u63d0\u4f9b\u7684\u641c\u7d22\u7a7a\u95f4\uff1a";
var mkdocs_page_input_path = "docs/api/search_space.md";
var mkdocs_page_url = null;
</script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a>
</li>
<li class="toctree-l1">
<span class="caption-text">Docs</span>
<ul class="subnav">
<li class="">
<a class="" href="../../">PaddleSlim</a>
</li>
<li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a>
</li>
<li class=" current">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="../nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3 current">
<a class="current" href="./">paddleslim.nas 提供的搜索空间:</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#paddleslimnas">paddleslim.nas 提供的搜索空间:</a></li>
<ul>
<li><a class="toctree-l5" href="#_1">搜索空间的配置介绍:</a></li>
<li><a class="toctree-l5" href="#_2">搜索空间示例:</a></li>
</ul>
<li class="toctree-l4"><a href="#search-space">自定义搜索空间(search space)</a></li>
</ul>
</li>
<li class="toctree-l3">
<a class="" href="../single_distiller_api/">paddleslim.dist API文档</a>
</li>
</ul>
</li>
<li class="">
<span class="caption-text">Tutorials</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../tutorials/demo_guide/">Demo guide</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/nas_demo/">网络结构搜索示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_aware_demo/">在线量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_post_demo/">离线量化示例</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li>
<li>Api &raquo;</li>
<li>Docs &raquo;</li>
<li>paddleslim.nas 提供的搜索空间:</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="paddleslimnas">paddleslim.nas 提供的搜索空间:</h1>
<ol>
<li>根据原本模型结构构造搜索空间:</li>
</ol>
<p>1.1 MobileNetV2Space</p>
<p>1.2 MobileNetV1Space</p>
<p>1.3 ResNetSpace</p>
<ol>
<li>根据相应模型的block构造搜索空间</li>
</ol>
<p>2.1 MobileNetV1BlockSpace</p>
<p>2.2 MobileNetV2BlockSpace</p>
<p>2.3 ResNetBlockSpace</p>
<p>2.4 InceptionABlockSpace</p>
<p>2.5 InceptionCBlockSpace</p>
<h2 id="_1">搜索空间的配置介绍:</h2>
<p><strong>input_size(int|None)</strong><code>input_size</code>表示输入feature map的大小。
<strong>output_size(int|None)</strong><code>output_size</code>表示输出feature map的大小。
<strong>block_num(int|None)</strong><code>block_num</code>表示搜索空间中block的数量。
<strong>block_mask(list|None)</strong><code>block_mask</code>表示当前的block是一个reduction block还是一个normal block,是一组由0、1组成的列表,0表示当前block是normal block,1表示当前block是reduction block。如果设置了<code>block_mask</code>,则主要以<code>block_mask</code>为主要配置,<code>input_size</code><code>output_size</code><code>block_num</code>三种配置是无效的。</p>
<p><strong>Note:</strong>
1. reduction block表示经过这个block之后的feature map大小下降为之前的一半,normal block表示经过这个block之后feature map大小不变。
2. <code>input_size</code><code>output_size</code>用来计算整个模型结构中reduction block数量。</p>
<h2 id="_2">搜索空间示例:</h2>
<ol>
<li>使用paddleslim中提供用原本的模型结构来构造搜索空间的话,仅需要指定搜索空间名字即可。例如:如果使用原本的MobileNetV2的搜索空间进行搜索的话,传入SANAS中的config直接指定为[('MobileNetV2Space')]。</li>
<li>使用paddleslim中提供的block搜索空间构造搜索空间:
2.1 使用<code>input_size</code>, <code>output_size</code><code>block_num</code>来构造搜索空间。例如:传入SANAS的config可以指定为[('MobileNetV2BlockSpace', {'input_size': 224, 'output_size': 32, 'block_num': 10})]。
2.2 使用<code>block_mask</code>构造搜索空间。例如:传入SANAS的config可以指定为[('MobileNetV2BlockSpace', {'block_mask': [0, 1, 1, 1, 1, 0, 1, 0]})]。</li>
</ol>
<h1 id="search-space">自定义搜索空间(search space)</h1>
<p>自定义搜索空间类需要继承搜索空间基类并重写以下几部分:
1. 初始化的tokens(<code>init_tokens</code>函数),可以设置为自己想要的tokens列表, tokens列表中的每个数字指的是当前数字在相应的搜索列表中的索引。例如本示例中若tokens=[0, 3, 5],则代表当前模型结构搜索到的通道数为[8, 40, 128]。
2. token中每个数字的搜索列表长度(<code>range_table</code>函数),tokens中每个token的索引范围。
3. 根据token产生模型结构(<code>token2arch</code>函数),根据搜索到的tokens列表产生模型结构。</p>
<p>以新增reset block为例说明如何构造自己的search space。自定义的search space不能和已有的search space同名。</p>
<pre><code class="python">### 引入搜索空间基类函数和search space的注册类函数
from .search_space_base import SearchSpaceBase
from .search_space_registry import SEARCHSPACE
import numpy as np
### 需要调用注册函数把自定义搜索空间注册到space space中
@SEARCHSPACE.register
### 定义一个继承SearchSpaceBase基类的搜索空间的类函数
class ResNetBlockSpace2(SearchSpaceBase):
def __init__(self, input_size, output_size, block_num, block_mask):
### 定义一些实际想要搜索的内容,例如:通道数、每个卷积的重复次数、卷积核大小等等
### self.filter_num 代表通道数的搜索列表
self.filter_num = np.array([8, 16, 32, 40, 64, 128, 256, 512])
### 定义初始化token,初始化token的长度根据传入的block_num或者block_mask的长度来得到的
def init_tokens(self):
return [0] * 3 * len(self.block_mask)
### 定义
def range_table(self):
return [len(self.filter_num)] * 3 * len(self.block_mask)
def token2arch(self, tokens=None):
if tokens == None:
tokens = self.init_tokens()
self.bottleneck_params_list = []
for i in range(len(self.block_mask)):
self.bottleneck_params_list.append(self.filter_num[tokens[i * 3 + 0]],
self.filter_num[tokens[i * 3 + 1]],
self.filter_num[tokens[i * 3 + 2]],
2 if self.block_mask[i] == 1 else 1)
def net_arch(input):
for i, layer_setting in enumerate(self.bottleneck_params_list):
channel_num, stride = layer_setting[:-1], layer_setting[-1]
input = self._resnet_block(input, channel_num, stride, name='resnet_layer{}'.format(i+1))
return input
return net_arch
### 构造具体block的操作
def _resnet_block(self, input, channel_num, stride, name=None):
shortcut_conv = self._shortcut(input, channel_num[2], stride, name=name)
input = self._conv_bn_layer(input=input, num_filters=channel_num[0], filter_size=1, act='relu', name=name + '_conv0')
input = self._conv_bn_layer(input=input, num_filters=channel_num[1], filter_size=3, stride=stride, act='relu', name=name + '_conv1')
input = self._conv_bn_layer(input=input, num_filters=channel_num[2], filter_size=1, name=name + '_conv2')
return fluid.layers.elementwise_add(x=shortcut_conv, y=input, axis=0, name=name+'_elementwise_add')
def _shortcut(self, input, channel_num, stride, name=None):
channel_in = input.shape[1]
if channel_in != channel_num or stride != 1:
return self.conv_bn_layer(input, num_filters=channel_num, filter_size=1, stride=stride, name=name+'_shortcut')
else:
return input
def _conv_bn_layer(self, input, num_filters, filter_size, stride=1, padding='SAME', act=None, name=None):
conv = fluid.layers.conv2d(input, num_filters, filter_size, stride, name=name+'_conv')
bn = fluid.layers.batch_norm(conv, act=act, name=name+'_bn')
return bn
</code></pre>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../single_distiller_api/" class="btn btn-neutral float-right" title="paddleslim.dist API文档">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../quantization_api/" class="btn btn-neutral" title="paddleslim.quant API文档"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<span><a href="../quantization_api/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../single_distiller_api/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../../..';</script>
<script src="../../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>paddleslim.dist API文档 - PaddleSlim</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "paddleslim.dist API\u6587\u6863";
var mkdocs_page_input_path = "docs/api/single_distiller_api.md";
var mkdocs_page_url = null;
</script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a>
</li>
<li class="toctree-l1">
<span class="caption-text">Docs</span>
<ul class="subnav">
<li class="">
<a class="" href="../../">PaddleSlim</a>
</li>
<li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a>
</li>
<li class=" current">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="../nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3 current">
<a class="current" href="./">paddleslim.dist API文档</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#paddleslimdist-api">paddleslim.dist API文档</a></li>
<ul>
<li><a class="toctree-l5" href="#mergeteacher_program-student_program-data_name_map-place-scopefluidglobal_scope-name_prefixteacher_">merge(teacher_program, student_program, data_name_map, place, scope=fluid.global_scope(), name_prefix='teacher_')</a></li>
<li><a class="toctree-l5" href="#fsp_lossteacher_var1_name-teacher_var2_name-student_var1_name-student_var2_name-programfluiddefault_main_program">fsp_loss(teacher_var1_name, teacher_var2_name, student_var1_name, student_var2_name, program=fluid.default_main_program())</a></li>
<li><a class="toctree-l5" href="#l2_lossteacher_var_name-student_var_name-programfluiddefault_main_program">l2_loss(teacher_var_name, student_var_name, program=fluid.default_main_program())</a></li>
<li><a class="toctree-l5" href="#soft_label_lossteacher_var_name-student_var_name-programfluiddefault_main_program-teacher_temperature1-student_temperature1">soft_label_loss(teacher_var_name, student_var_name, program=fluid.default_main_program(), teacher_temperature=1., student_temperature=1.)</a></li>
<li><a class="toctree-l5" href="#lossloss_func-programfluiddefault_main_program-kwargs">loss(loss_func, program=fluid.default_main_program(), **kwargs)</a></li>
<li><a class="toctree-l5" href="#_1">注意事项</a></li>
</ul>
</ul>
</li>
</ul>
</li>
<li class="">
<span class="caption-text">Tutorials</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../tutorials/demo_guide/">Demo guide</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/nas_demo/">网络结构搜索示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_aware_demo/">在线量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_embedding_demo/">Embedding量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../../tutorials/quant_post_demo/">离线量化示例</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li>
<li>Api &raquo;</li>
<li>Docs &raquo;</li>
<li>paddleslim.dist API文档</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="paddleslimdist-api">paddleslim.dist API文档</h1>
<h2 id="mergeteacher_program-student_program-data_name_map-place-scopefluidglobal_scope-name_prefixteacher_">merge(teacher_program, student_program, data_name_map, place, scope=fluid.global_scope(), name_prefix='teacher_')</h2>
<p>该方法将两个fluid program(teacher_program, student_program)融合为一个program,并将融合得到的program返回。在融合的program中,可以为其中合适的teacher特征图和student特征图添加蒸馏损失函数,从而达到用teacher模型的暗知识(Dark Knowledge)指导student模型学习的目的。</p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>teacher_program</strong>(Program)-定义了teacher模型的paddle program</li>
<li><strong>student_program</strong>(Program)-定义了student模型的paddle program</li>
<li><strong>data_name_map</strong>(dict)-teacher输入接口名与student输入接口名的映射,key为teacher的输入名,value为student的输入名。merge函数将会把这两个模型的输入按对应关系合并在一起,保证teacher与student输入数据相同</li>
<li><strong>place</strong>(fluid.CPUPlace()|fluid.CUDAPlace(N))-该参数表示程序运行在何种设备上,这里的N为GPU对应的ID</li>
<li><strong>scope</strong>(Scope)-该参数表示teacher variables和student variables所使用的作用域,如果不指定将使用默认的全局作用域。默认值:fluid.global_scope()</li>
<li><strong>name_prefix</strong>(str)-为了避免teacher variables和student variables存在同名变量而引起命名冲突,merge函数将统一为teacher variables添加一个名称前缀name_prefix,merge后的program中所有teacher variables都将带有这一名称前缀。默认值:'teacher_'</li>
</ul>
<p><strong>返回:</strong>由student_program和teacher_program merge得到的program</p>
<p><strong>使用示例:</strong></p>
<pre><code class="python">import paddle.fluid as fluid
import paddleslim.dist as dist
student_program = fluid.Program()
with fluid.program_guard(student_program):
x = fluid.layers.data(name='x', shape=[1, 28, 28])
conv = fluid.layers.conv2d(x, 32, 1)
out = fluid.layers.conv2d(conv, 64, 3, padding=1)
teacher_program = fluid.Program()
with fluid.program_guard(teacher_program):
y = fluid.layers.data(name='y', shape=[1, 28, 28])
conv = fluid.layers.conv2d(y, 32, 1)
conv = fluid.layers.conv2d(conv, 32, 3, padding=1)
out = fluid.layers.conv2d(conv, 64, 3, padding=1)
data_name_map = {'y':'x'}
USE_GPU = False
place = fluid.CUDAPlace(0) if USE_GPU else fluid.CPUPlace()
main_program = dist.merge(teacher_program, student_program, data_name_map, place)
</code></pre>
<h2 id="fsp_lossteacher_var1_name-teacher_var2_name-student_var1_name-student_var2_name-programfluiddefault_main_program">fsp_loss(teacher_var1_name, teacher_var2_name, student_var1_name, student_var2_name, program=fluid.default_main_program())</h2>
<p>fsp_loss为program内的teacher var和student var添加fsp loss,出自论文<a href="http://openaccess.thecvf.com/content_cvpr_2017/papers/Yim_A_Gift_From_CVPR_2017_paper.pdf">A Gift from Knowledge Distillation: Fast Optimization, Network Minimization and Transfer Learning</a></p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>teacher_var1_name</strong>(str): teacher_var1的名称. 对应的variable是一个形为<code>[batch_size, x_channel, height, width]</code>的4-D特征图Tensor,数据类型为float32或float64</li>
<li><strong>teacher_var2_name</strong>(str): teacher_var2的名称. 对应的variable是一个形为<code>[batch_size, y_channel, height, width]</code>的4-D特征图Tensor,数据类型为float32或float64。只有y_channel可以与teacher_var1的x_channel不同,其他维度必须与teacher_var1相同</li>
<li><strong>student_var1_name</strong>(str): student_var1的名称. 对应的variable需与teacher_var1尺寸保持一致,是一个形为<code>[batch_size, x_channel, height, width]</code>的4-D特征图Tensor,数据类型为float32或float64</li>
<li><strong>student_var2_name</strong>(str): student_var2的名称. 对应的variable需与teacher_var2尺寸保持一致,是一个形为<code>[batch_size, y_channel, height, width]</code>的4-D特征图Tensor,数据类型为float32或float64。只有y_channel可以与student_var1的x_channel不同,其他维度必须与student_var1相同</li>
<li><strong>program</strong>(Program): 用于蒸馏训练的fluid program。默认值:fluid.default_main_program()</li>
</ul>
<p><strong>返回:</strong>由teacher_var1, teacher_var2, student_var1, student_var2组合得到的fsp_loss</p>
<p><strong>使用示例:</strong></p>
<pre><code class="python">import paddle.fluid as fluid
import paddleslim.dist as dist
student_program = fluid.Program()
with fluid.program_guard(student_program):
x = fluid.layers.data(name='x', shape=[1, 28, 28])
conv = fluid.layers.conv2d(x, 32, 1, name='s1')
out = fluid.layers.conv2d(conv, 64, 3, padding=1, name='s2')
teacher_program = fluid.Program()
with fluid.program_guard(teacher_program):
y = fluid.layers.data(name='y', shape=[1, 28, 28])
conv = fluid.layers.conv2d(y, 32, 1, name='t1')
conv = fluid.layers.conv2d(conv, 32, 3, padding=1)
out = fluid.layers.conv2d(conv, 64, 3, padding=1, name='t2')
data_name_map = {'y':'x'}
USE_GPU = False
place = fluid.CUDAPlace(0) if USE_GPU else fluid.CPUPlace()
main_program = merge(teacher_program, student_program, data_name_map, place)
with fluid.program_guard(main_program):
distillation_loss = dist.fsp_loss('teacher_t1.tmp_1', 'teacher_t2.tmp_1', 's1.tmp_1', 's2.tmp_1', main_program)
</code></pre>
<h2 id="l2_lossteacher_var_name-student_var_name-programfluiddefault_main_program">l2_loss(teacher_var_name, student_var_name, program=fluid.default_main_program())</h2>
<p>l2_loss为program内的teacher var和student var添加l2 loss</p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>teacher_var_name</strong>(str): teacher_var的名称. </li>
<li><strong>student_var_name</strong>(str): student_var的名称.</li>
<li><strong>program</strong>(Program): 用于蒸馏训练的fluid program。默认值:fluid.default_main_program()</li>
</ul>
<p><strong>返回:</strong>由teacher_var, student_var组合得到的l2_loss</p>
<p><strong>使用示例:</strong></p>
<pre><code class="python">import paddle.fluid as fluid
import paddleslim.dist as dist
student_program = fluid.Program()
with fluid.program_guard(student_program):
x = fluid.layers.data(name='x', shape=[1, 28, 28])
conv = fluid.layers.conv2d(x, 32, 1, name='s1')
out = fluid.layers.conv2d(conv, 64, 3, padding=1, name='s2')
teacher_program = fluid.Program()
with fluid.program_guard(teacher_program):
y = fluid.layers.data(name='y', shape=[1, 28, 28])
conv = fluid.layers.conv2d(y, 32, 1, name='t1')
conv = fluid.layers.conv2d(conv, 32, 3, padding=1)
out = fluid.layers.conv2d(conv, 64, 3, padding=1, name='t2')
data_name_map = {'y':'x'}
USE_GPU = False
place = fluid.CUDAPlace(0) if USE_GPU else fluid.CPUPlace()
main_program = merge(teacher_program, student_program, data_name_map, place)
with fluid.program_guard(main_program):
distillation_loss = dist.l2_loss('teacher_t2.tmp_1', 's2.tmp_1', main_program)
</code></pre>
<h2 id="soft_label_lossteacher_var_name-student_var_name-programfluiddefault_main_program-teacher_temperature1-student_temperature1">soft_label_loss(teacher_var_name, student_var_name, program=fluid.default_main_program(), teacher_temperature=1., student_temperature=1.)</h2>
<p>soft_label_loss为program内的teacher var和student var添加soft label loss,出自论文<a href="https://arxiv.org/pdf/1503.02531.pdf">Distilling the Knowledge in a Neural Network</a></p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>teacher_var_name</strong>(str): teacher_var的名称. </li>
<li><strong>student_var_name</strong>(str): student_var的名称. </li>
<li><strong>program</strong>(Program): 用于蒸馏训练的fluid program。默认值:fluid.default_main_program()</li>
<li><strong>teacher_temperature</strong>(float): 对teacher_var进行soft操作的温度值,温度值越大得到的特征图越平滑 </li>
<li><strong>student_temperature</strong>(float): 对student_var进行soft操作的温度值,温度值越大得到的特征图越平滑 </li>
</ul>
<p><strong>返回:</strong>由teacher_var, student_var组合得到的soft_label_loss</p>
<p><strong>使用示例:</strong></p>
<pre><code class="python">import paddle.fluid as fluid
import paddleslim.dist as dist
student_program = fluid.Program()
with fluid.program_guard(student_program):
x = fluid.layers.data(name='x', shape=[1, 28, 28])
conv = fluid.layers.conv2d(x, 32, 1, name='s1')
out = fluid.layers.conv2d(conv, 64, 3, padding=1, name='s2')
teacher_program = fluid.Program()
with fluid.program_guard(teacher_program):
y = fluid.layers.data(name='y', shape=[1, 28, 28])
conv = fluid.layers.conv2d(y, 32, 1, name='t1')
conv = fluid.layers.conv2d(conv, 32, 3, padding=1)
out = fluid.layers.conv2d(conv, 64, 3, padding=1, name='t2')
data_name_map = {'y':'x'}
USE_GPU = False
place = fluid.CUDAPlace(0) if USE_GPU else fluid.CPUPlace()
main_program = merge(teacher_program, student_program, data_name_map, place)
with fluid.program_guard(main_program):
distillation_loss = dist.soft_label_loss('teacher_t2.tmp_1', 's2.tmp_1', main_program, 1., 1.)
</code></pre>
<h2 id="lossloss_func-programfluiddefault_main_program-kwargs">loss(loss_func, program=fluid.default_main_program(), **kwargs)</h2>
<p>loss函数支持对任意多对teacher_var和student_var使用自定义损失函数</p>
<p><strong>参数:</strong></p>
<ul>
<li><strong>loss_func</strong>(python function): 自定义的损失函数,输入为teacher var和student var,输出为自定义的loss </li>
<li><strong>program</strong>(Program): 用于蒸馏训练的fluid program。默认值:fluid.default_main_program()</li>
<li><strong>**kwargs</strong>: loss_func输入名与对应variable名称</li>
</ul>
<p><strong>返回</strong>:自定义的损失函数loss</p>
<p><strong>使用示例:</strong></p>
<pre><code class="python">import paddle.fluid as fluid
import paddleslim.dist as dist
student_program = fluid.Program()
with fluid.program_guard(student_program):
x = fluid.layers.data(name='x', shape=[1, 28, 28])
conv = fluid.layers.conv2d(x, 32, 1, name='s1')
out = fluid.layers.conv2d(conv, 64, 3, padding=1, name='s2')
teacher_program = fluid.Program()
with fluid.program_guard(teacher_program):
y = fluid.layers.data(name='y', shape=[1, 28, 28])
conv = fluid.layers.conv2d(y, 32, 1, name='t1')
conv = fluid.layers.conv2d(conv, 32, 3, padding=1)
out = fluid.layers.conv2d(conv, 64, 3, padding=1, name='t2')
data_name_map = {'y':'x'}
USE_GPU = False
place = fluid.CUDAPlace(0) if USE_GPU else fluid.CPUPlace()
main_program = merge(teacher_program, student_program, data_name_map, place)
def adaptation_loss(t_var, s_var):
teacher_channel = t_var.shape[1]
s_hint = fluid.layers.conv2d(s_var, teacher_channel, 1)
hint_loss = fluid.layers.reduce_mean(fluid.layers.square(s_hint - t_var))
return hint_loss
with fluid.program_guard(main_program):
distillation_loss = dist.loss(main_program, adaptation_loss, t_var='teacher_t2.tmp_1', s_var='s2.tmp_1')
</code></pre>
<h2 id="_1">注意事项</h2>
<p>在添加蒸馏loss时会引入新的variable,需要注意新引入的variable不要与student variables命名冲突。这里建议两种用法:</p>
<ol>
<li>建议与student_program使用同一个命名空间,以避免一些未指定名称的variables(例如tmp_0, tmp_1...)多次定义为同一名称出现命名冲突</li>
<li>建议在添加蒸馏loss时指定一个命名空间前缀,具体用法请参考Paddle官方文档<a href="https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/name_scope_cn.html#name-scope">fluid.name_scope</a></li>
</ol>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../../tutorials/demo_guide/" class="btn btn-neutral float-right" title="Demo guide">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../search_space/" class="btn btn-neutral" title="paddleslim.nas 提供的搜索空间:"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<span><a href="../search_space/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../../tutorials/demo_guide/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../../..';</script>
<script src="../../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../img/favicon.ico">
<title>PaddleSlim - PaddleSlim</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "PaddleSlim";
var mkdocs_page_input_path = "docs/index.md";
var mkdocs_page_url = null;
</script>
<script src="../js/jquery-2.1.1.min.js" defer></script>
<script src="../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href=".." class="icon icon-home"> PaddleSlim</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="..">Welcome to MkDocs</a>
</li>
<li class="toctree-l1">
<span class="caption-text">Docs</span>
<ul class="subnav">
<li class=" current">
<a class="current" href="./">PaddleSlim</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#paddleslim">PaddleSlim</a></li>
<ul>
<li><a class="toctree-l4" href="#_1">功能</a></li>
<li><a class="toctree-l4" href="#_2">安装</a></li>
<li><a class="toctree-l4" href="#_3">使用</a></li>
<li><a class="toctree-l4" href="#_4">贡献与反馈</a></li>
</ul>
</ul>
</li>
<li class="">
<a class="" href="table_latency/">硬件延时评估表</a>
</li>
<li class="">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="api/analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="api/api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="api/nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="api/prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="api/quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="api/search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="api/single_distiller_api/">paddleslim.dist API文档</a>
</li>
</ul>
</li>
<li class="">
<span class="caption-text">Tutorials</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="tutorials/demo_guide/">Demo guide</a>
</li>
<li class="toctree-l3">
<a class="" href="tutorials/nas_demo/">网络结构搜索示例</a>
</li>
<li class="toctree-l3">
<a class="" href="tutorials/quant_aware_demo/">在线量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="tutorials/quant_embedding_demo/">Embedding量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="tutorials/quant_post_demo/">离线量化示例</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="..">PaddleSlim</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="..">Docs</a> &raquo;</li>
<li>Docs &raquo;</li>
<li>PaddleSlim</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="paddleslim">PaddleSlim</h1>
<p>PaddleSlim是PaddlePaddle框架的一个子模块,主要用于压缩图像领域模型。在PaddleSlim中,不仅实现了目前主流的网络剪枝、量化、蒸馏三种压缩策略,还实现了超参数搜索和小模型网络结构搜索功能。在后续版本中,会添加更多的压缩策略,以及完善对NLP领域模型的支持。</p>
<h2 id="_1">功能</h2>
<ul>
<li>模型剪裁</li>
<li>支持通道均匀模型剪裁(uniform pruning)</li>
<li>基于敏感度的模型剪裁</li>
<li>
<p>基于进化算法的自动模型剪裁三种方式</p>
</li>
<li>
<p>量化训练</p>
</li>
<li>在线量化训练(training aware)</li>
<li>离线量化(post training)</li>
<li>
<p>支持对权重全局量化和Channel-Wise量化</p>
</li>
<li>
<p>蒸馏</p>
</li>
<li>
<p>轻量神经网络结构自动搜索(Light-NAS)</p>
</li>
<li>支持基于进化算法的轻量神经网络结构自动搜索(Light-NAS)</li>
<li>支持 FLOPS / 硬件延时约束</li>
<li>支持多平台模型延时评估</li>
</ul>
<h2 id="_2">安装</h2>
<p>安装PaddleSlim前,请确认已正确安装Paddle1.6版本或更新版本。Paddle安装请参考:<a href="https://www.paddlepaddle.org.cn/install/quick">Paddle安装教程</a></p>
<ul>
<li>安装develop版本</li>
</ul>
<pre><code>git clone https://github.com/PaddlePaddle/PaddleSlim.git
cd PaddleSlim
python setup.py install
</code></pre>
<ul>
<li>安装官方发布的最新版本</li>
</ul>
<pre><code>pip install paddleslim -i https://pypi.org/simple
</code></pre>
<ul>
<li>安装历史版本</li>
</ul>
<p>请点击<a href="https://pypi.org/project/paddleslim/#history">pypi.org</a>查看可安装历史版本。</p>
<h2 id="_3">使用</h2>
<ul>
<li><a href="doc/api_guide.md">API文档</a>:API使用介绍,包括<a href="">蒸馏</a><a href="">剪裁</a><a href="">量化</a><a href="">模型结构搜索</a></li>
<li><a href="doc/demo_guide.md">示例</a>:基于mnist和cifar10等简单分类任务的模型压缩示例,您可以通过该部分快速体验和了解PaddleSlim的功能。</li>
<li><a href="">实践教程</a>:经典模型的分析和压缩实验教程。</li>
<li><a href="">模型库</a>:经过压缩的分类、检测、语义分割模型,包括权重文件、网络结构文件和性能数据。</li>
<li><a href="">Paddle检测库</a>:介绍如何在检测库中使用PaddleSlim。</li>
<li><a href="">Paddle分割库</a>:介绍如何在分割库中使用PaddleSlim。</li>
<li><a href="">PaddleLite</a>:介绍如何使用预测库PaddleLite部署PaddleSlim产出的模型。</li>
</ul>
<h2 id="_4">贡献与反馈</h2>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="table_latency/" class="btn btn-neutral float-right" title="硬件延时评估表">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href=".." class="btn btn-neutral" title="Welcome to MkDocs"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<span><a href=".." style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="table_latency/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '..';</script>
<script src="../js/theme.js" defer></script>
<script src="../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>网络结构搜索示例 - PaddleSlim</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "\u7f51\u7edc\u7ed3\u6784\u641c\u7d22\u793a\u4f8b";
var mkdocs_page_input_path = "docs/tutorials/nas_demo.md";
var mkdocs_page_url = null;
</script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a>
</li>
<li class="toctree-l1">
<span class="caption-text">Docs</span>
<ul class="subnav">
<li class="">
<a class="" href="../../">PaddleSlim</a>
</li>
<li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a>
</li>
<li class="">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../api/analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/single_distiller_api/">paddleslim.dist API文档</a>
</li>
</ul>
</li>
<li class=" current">
<span class="caption-text">Tutorials</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../demo_guide/">Demo guide</a>
</li>
<li class="toctree-l3 current">
<a class="current" href="./">网络结构搜索示例</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#_1">网络结构搜索示例</a></li>
<ul>
<li><a class="toctree-l5" href="#_2">接口介绍</a></li>
</ul>
</ul>
</li>
<li class="toctree-l3">
<a class="" href="../quant_aware_demo/">在线量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../quant_embedding_demo/">Embedding量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../quant_post_demo/">离线量化示例</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li>
<li>Tutorials &raquo;</li>
<li>Docs &raquo;</li>
<li>网络结构搜索示例</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="_1">网络结构搜索示例</h1>
<p>本示例介绍如何使用网络结构搜索接口,搜索到一个更小或者精度更高的模型,该文档仅介绍paddleslim中SANAS的使用及如何利用SANAS得到模型结构,完整示例代码请参考sa_nas_mobilenetv2.py或者block_sa_nas_mobilenetv2.py。</p>
<h2 id="_2">接口介绍</h2>
<p>请参考。</p>
<h3 id="1">1. 配置搜索空间</h3>
<p>详细的搜索空间配置可以参考<a href='../../../paddleslim/nas/nas_api.md'>神经网络搜索API文档</a></p>
<pre><code>config = [('MobileNetV2Space')]
</code></pre>
<h3 id="2-sanas">2. 利用搜索空间初始化SANAS实例</h3>
<pre><code>from paddleslim.nas import SANAS
sa_nas = SANAS(
config,
server_addr=(&quot;&quot;, 8881),
init_temperature=10.24,
reduce_rate=0.85,
search_steps=300,
is_server=True)
</code></pre>
<h3 id="3-nas">3. 根据实例化的NAS得到当前的网络结构</h3>
<pre><code>archs = sa_nas.next_archs()
</code></pre>
<h3 id="4-program">4. 根据得到的网络结构和输入构造训练和测试program</h3>
<pre><code>import paddle.fluid as fluid
train_program = fluid.Program()
test_program = fluid.Program()
startup_program = fluid.Program()
with fluid.program_guard(train_program, startup_program):
data = fluid.data(name='data', shape=[None, 3, 32, 32], dtype='float32')
label = fluid.data(name='label', shape=[None, 1], dtype='int64')
for arch in archs:
data = arch(data)
output = fluid.layers.fc(data, 10)
softmax_out = fluid.layers.softmax(input=output, use_cudnn=False)
cost = fluid.layers.cross_entropy(input=softmax_out, label=label)
avg_cost = fluid.layers.mean(cost)
acc_top1 = fluid.layers.accuracy(input=softmax_out, label=label, k=1)
test_program = train_program.clone(for_test=True)
sgd = fluid.optimizer.SGD(learning_rate=1e-3)
sgd.minimize(avg_cost)
</code></pre>
<h3 id="5-program">5. 根据构造的训练program添加限制条件</h3>
<pre><code>from paddleslim.analysis import flops
if flops(train_program) &gt; 321208544:
continue
</code></pre>
<h3 id="6-score">6. 回传score</h3>
<pre><code>sa_nas.reward(score)
</code></pre>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../quant_aware_demo/" class="btn btn-neutral float-right" title="在线量化示例">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../demo_guide/" class="btn btn-neutral" title="Demo guide"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<span><a href="../demo_guide/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../quant_aware_demo/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../../..';</script>
<script src="../../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>在线量化示例 - PaddleSlim</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "\u5728\u7ebf\u91cf\u5316\u793a\u4f8b";
var mkdocs_page_input_path = "docs/tutorials/quant_aware_demo.md";
var mkdocs_page_url = null;
</script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a>
</li>
<li class="toctree-l1">
<span class="caption-text">Docs</span>
<ul class="subnav">
<li class="">
<a class="" href="../../">PaddleSlim</a>
</li>
<li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a>
</li>
<li class="">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../api/analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/single_distiller_api/">paddleslim.dist API文档</a>
</li>
</ul>
</li>
<li class=" current">
<span class="caption-text">Tutorials</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../demo_guide/">Demo guide</a>
</li>
<li class="toctree-l3">
<a class="" href="../nas_demo/">网络结构搜索示例</a>
</li>
<li class="toctree-l3 current">
<a class="current" href="./">在线量化示例</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#_1">在线量化示例</a></li>
<ul>
<li><a class="toctree-l5" href="#_2">接口介绍</a></li>
<li><a class="toctree-l5" href="#_3">分类模型的离线量化流程</a></li>
</ul>
</ul>
</li>
<li class="toctree-l3">
<a class="" href="../quant_embedding_demo/">Embedding量化示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../quant_post_demo/">离线量化示例</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li>
<li>Tutorials &raquo;</li>
<li>Docs &raquo;</li>
<li>在线量化示例</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="_1">在线量化示例</h1>
<p>本示例介绍如何使用在线量化接口,来对训练好的分类模型进行量化, 可以减少模型的存储空间和显存占用。</p>
<h2 id="_2">接口介绍</h2>
<p>请参考 <a href='../../../paddleslim/quant/quantization_api_doc.md'>量化API文档</a></p>
<h2 id="_3">分类模型的离线量化流程</h2>
<h3 id="1">1. 配置量化参数</h3>
<pre><code>quant_config = {
'weight_quantize_type': 'abs_max',
'activation_quantize_type': 'moving_average_abs_max',
'weight_bits': 8,
'activation_bits': 8,
'not_quant_pattern': ['skip_quant'],
'quantize_op_types': ['conv2d', 'depthwise_conv2d', 'mul'],
'dtype': 'int8',
'window_size': 10000,
'moving_rate': 0.9,
'quant_weight_only': False
}
</code></pre>
<h3 id="2-programop">2. 对训练和测试program插入可训练量化op</h3>
<pre><code>val_program = quant_aware(val_program, place, quant_config, scope=None, for_test=True)
compiled_train_prog = quant_aware(train_prog, place, quant_config, scope=None, for_test=False)
</code></pre>
<h3 id="3build">3.关掉指定build策略</h3>
<pre><code>build_strategy = fluid.BuildStrategy()
build_strategy.fuse_all_reduce_ops = False
build_strategy.sync_batch_norm = False
exec_strategy = fluid.ExecutionStrategy()
compiled_train_prog = compiled_train_prog.with_data_parallel(
loss_name=avg_cost.name,
build_strategy=build_strategy,
exec_strategy=exec_strategy)
</code></pre>
<h3 id="4-freeze-program">4. freeze program</h3>
<pre><code>float_program, int8_program = convert(val_program,
place,
quant_config,
scope=None,
save_int8=True)
</code></pre>
<h3 id="5">5.保存预测模型</h3>
<pre><code>fluid.io.save_inference_model(
dirname=float_path,
feeded_var_names=[image.name],
target_vars=[out], executor=exe,
main_program=float_program,
model_filename=float_path + '/model',
params_filename=float_path + '/params')
fluid.io.save_inference_model(
dirname=int8_path,
feeded_var_names=[image.name],
target_vars=[out], executor=exe,
main_program=int8_program,
model_filename=int8_path + '/model',
params_filename=int8_path + '/params')
</code></pre>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../quant_embedding_demo/" class="btn btn-neutral float-right" title="Embedding量化示例">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../nas_demo/" class="btn btn-neutral" title="网络结构搜索示例"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<span><a href="../nas_demo/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../quant_embedding_demo/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../../..';</script>
<script src="../../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>Embedding量化示例 - PaddleSlim</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "Embedding\u91cf\u5316\u793a\u4f8b";
var mkdocs_page_input_path = "docs/tutorials/quant_embedding_demo.md";
var mkdocs_page_url = null;
</script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a>
</li>
<li class="toctree-l1">
<span class="caption-text">Docs</span>
<ul class="subnav">
<li class="">
<a class="" href="../../">PaddleSlim</a>
</li>
<li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a>
</li>
<li class="">
<span class="caption-text">Api</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../api/analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/single_distiller_api/">paddleslim.dist API文档</a>
</li>
</ul>
</li>
<li class=" current">
<span class="caption-text">Tutorials</span>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../demo_guide/">Demo guide</a>
</li>
<li class="toctree-l3">
<a class="" href="../nas_demo/">网络结构搜索示例</a>
</li>
<li class="toctree-l3">
<a class="" href="../quant_aware_demo/">在线量化示例</a>
</li>
<li class="toctree-l3 current">
<a class="current" href="./">Embedding量化示例</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#embedding">Embedding量化示例</a></li>
<ul>
<li><a class="toctree-l5" href="#skip-gramword2vector">基于skip-gram的word2vector模型</a></li>
<li><a class="toctree-l5" href="#skip-gramword2vector_1">量化基于skip-gram的word2vector模型</a></li>
</ul>
</ul>
</li>
<li class="toctree-l3">
<a class="" href="../quant_post_demo/">离线量化示例</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li>
<li>Tutorials &raquo;</li>
<li>Docs &raquo;</li>
<li>Embedding量化示例</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="embedding">Embedding量化示例</h1>
<p>本示例介绍如何使用Embedding量化的接口 <a href="">paddleslim.quant.quant_embedding</a><code>quant_embedding</code>接口将网络中的Embedding参数从<code>float32</code>类型量化到 <code>8-bit</code>整数类型,在几乎不损失模型精度的情况下减少模型的存储空间和显存占用。</p>
<p>接口介绍请参考 <a href='../../../paddleslim/quant/quantization_api_doc.md'>量化API文档</a></p>
<p>该接口对program的修改:</p>
<p>量化前:</p>
<p align="center">
<img src="./image/before.png" height=200 width=100 hspace='10'/> <br />
<strong>图1:量化前的模型结构</strong>
</p>
<p>量化后:</p>
<p align="center">
<img src="./image/after.png" height=300 width=300 hspace='10'/> <br />
<strong>图2: 量化后的模型结构</strong>
</p>
<p>以下将以 <code>基于skip-gram的word2vector模型</code> 为例来说明如何使用<code>quant_embedding</code>接口。首先介绍 <code>基于skip-gram的word2vector模型</code> 的正常训练和测试流程。</p>
<h2 id="skip-gramword2vector">基于skip-gram的word2vector模型</h2>
<p>以下是本例的简要目录结构及说明:</p>
<pre><code class="text">.
├── cluster_train.py # 分布式训练函数
├── cluster_train.sh # 本地模拟多机脚本
├── train.py # 训练函数
├── infer.py # 预测脚本
├── net.py # 网络结构
├── preprocess.py # 预处理脚本,包括构建词典和预处理文本
├── reader.py # 训练阶段的文本读写
├── train.py # 训练函数
└── utils.py # 通用函数
</code></pre>
<h3 id="_1">介绍</h3>
<p>本例实现了skip-gram模式的word2vector模型。</p>
<p>同时推荐用户参考<a href="https://aistudio.baidu.com/aistudio/projectDetail/124377"> IPython Notebook demo</a></p>
<h3 id="_2">数据下载</h3>
<p>全量数据集使用的是来自1 Billion Word Language Model Benchmark的(http://www.statmt.org/lm-benchmark) 的数据集.</p>
<pre><code class="bash">mkdir data
wget http://www.statmt.org/lm-benchmark/1-billion-word-language-modeling-benchmark-r13output.tar.gz
tar xzvf 1-billion-word-language-modeling-benchmark-r13output.tar.gz
mv 1-billion-word-language-modeling-benchmark-r13output/training-monolingual.tokenized.shuffled/ data/
</code></pre>
<p>备用数据地址下载命令如下</p>
<pre><code class="bash">mkdir data
wget https://paddlerec.bj.bcebos.com/word2vec/1-billion-word-language-modeling-benchmark-r13output.tar
tar xvf 1-billion-word-language-modeling-benchmark-r13output.tar
mv 1-billion-word-language-modeling-benchmark-r13output/training-monolingual.tokenized.shuffled/ data/
</code></pre>
<p>为了方便快速验证,我们也提供了经典的text8样例数据集,包含1700w个词。 下载命令如下</p>
<pre><code class="bash">mkdir data
wget https://paddlerec.bj.bcebos.com/word2vec/text.tar
tar xvf text.tar
mv text data/
</code></pre>
<h3 id="_3">数据预处理</h3>
<p>以样例数据集为例进行预处理。全量数据集注意解压后以training-monolingual.tokenized.shuffled 目录为预处理目录,和样例数据集的text目录并列。</p>
<p>词典格式: 词&lt;空格&gt;词频。注意低频词用'UNK'表示</p>
<p>可以按格式自建词典,如果自建词典跳过第一步。</p>
<pre><code>the 1061396
of 593677
and 416629
one 411764
in 372201
a 325873
&lt;UNK&gt; 324608
to 316376
zero 264975
nine 250430
</code></pre>
<p>第一步根据英文语料生成词典,中文语料可以通过修改text_strip方法自定义处理方法。</p>
<pre><code class="bash">python preprocess.py --build_dict --build_dict_corpus_dir data/text/ --dict_path data/test_build_dict
</code></pre>
<p>第二步根据词典将文本转成id, 同时进行downsample,按照概率过滤常见词, 同时生成word和id映射的文件,文件名为词典+"<em>word_to_id</em>"。</p>
<pre><code class="bash">python preprocess.py --filter_corpus --dict_path data/test_build_dict --input_corpus_dir data/text --output_corpus_dir data/convert_text8 --min_count 5 --downsample 0.001
</code></pre>
<h3 id="_4">训练</h3>
<p>具体的参数配置可运行</p>
<pre><code class="bash">python train.py -h
</code></pre>
<p>单机多线程训练</p>
<pre><code class="bash">OPENBLAS_NUM_THREADS=1 CPU_NUM=5 python train.py --train_data_dir data/convert_text8 --dict_path data/test_build_dict --num_passes 10 --batch_size 100 --model_output_dir v1_cpu5_b100_lr1dir --base_lr 1.0 --print_batch 1000 --with_speed --is_sparse
</code></pre>
<p>本地单机模拟多机训练</p>
<pre><code class="bash">sh cluster_train.sh
</code></pre>
<p>本示例中按照单机多线程训练的命令进行训练,训练完毕后,可看到在当前文件夹下保存模型的路径为: <code>v1_cpu5_b100_lr1dir</code>, 运行 <code>ls v1_cpu5_b100_lr1dir</code>可看到该文件夹下保存了训练的10个epoch的模型文件。</p>
<pre><code>pass-0 pass-1 pass-2 pass-3 pass-4 pass-5 pass-6 pass-7 pass-8 pass-9
</code></pre>
<h3 id="_5">预测</h3>
<p>测试集下载命令如下</p>
<pre><code class="bash">#全量数据集测试集
wget https://paddlerec.bj.bcebos.com/word2vec/test_dir.tar
#样本数据集测试集
wget https://paddlerec.bj.bcebos.com/word2vec/test_mid_dir.tar
</code></pre>
<p>预测命令,注意词典名称需要加后缀"<em>word_to_id</em>", 此文件是预处理阶段生成的。</p>
<pre><code class="bash">python infer.py --infer_epoch --test_dir data/test_mid_dir --dict_path data/test_build_dict_word_to_id_ --batch_size 20000 --model_dir v1_cpu5_b100_lr1dir/ --start_index 0 --last_index 9
</code></pre>
<p>运行该预测命令, 可看到如下输出</p>
<pre><code>('start index: ', 0, ' last_index:', 9)
('vocab_size:', 63642)
step:1 249
epoch:0 acc:0.014
step:1 590
epoch:1 acc:0.033
step:1 982
epoch:2 acc:0.055
step:1 1338
epoch:3 acc:0.075
step:1 1653
epoch:4 acc:0.093
step:1 1914
epoch:5 acc:0.107
step:1 2204
epoch:6 acc:0.124
step:1 2416
epoch:7 acc:0.136
step:1 2606
epoch:8 acc:0.146
step:1 2722
epoch:9 acc:0.153
</code></pre>
<h2 id="skip-gramword2vector_1">量化<code>基于skip-gram的word2vector模型</code></h2>
<p>量化配置为:</p>
<pre><code>config = {
'params_name': 'emb',
'quantize_type': 'abs_max'
}
</code></pre>
<p>运行命令为:</p>
<pre><code class="bash">python infer.py --infer_epoch --test_dir data/test_mid_dir --dict_path data/test_build_dict_word_to_id_ --batch_size 20000 --model_dir v1_cpu5_b100_lr1dir/ --start_index 0 --last_index 9 --emb_quant True
</code></pre>
<p>运行输出为:</p>
<pre><code>('start index: ', 0, ' last_index:', 9)
('vocab_size:', 63642)
quant_embedding config {'quantize_type': 'abs_max', 'params_name': 'emb', 'quantize_bits': 8, 'dtype': 'int8'}
step:1 253
epoch:0 acc:0.014
quant_embedding config {'quantize_type': 'abs_max', 'params_name': 'emb', 'quantize_bits': 8, 'dtype': 'int8'}
step:1 586
epoch:1 acc:0.033
quant_embedding config {'quantize_type': 'abs_max', 'params_name': 'emb', 'quantize_bits': 8, 'dtype': 'int8'}
step:1 970
epoch:2 acc:0.054
quant_embedding config {'quantize_type': 'abs_max', 'params_name': 'emb', 'quantize_bits': 8, 'dtype': 'int8'}
step:1 1364
epoch:3 acc:0.077
quant_embedding config {'quantize_type': 'abs_max', 'params_name': 'emb', 'quantize_bits': 8, 'dtype': 'int8'}
step:1 1642
epoch:4 acc:0.092
quant_embedding config {'quantize_type': 'abs_max', 'params_name': 'emb', 'quantize_bits': 8, 'dtype': 'int8'}
step:1 1936
epoch:5 acc:0.109
quant_embedding config {'quantize_type': 'abs_max', 'params_name': 'emb', 'quantize_bits': 8, 'dtype': 'int8'}
step:1 2216
epoch:6 acc:0.124
quant_embedding config {'quantize_type': 'abs_max', 'params_name': 'emb', 'quantize_bits': 8, 'dtype': 'int8'}
step:1 2419
epoch:7 acc:0.136
quant_embedding config {'quantize_type': 'abs_max', 'params_name': 'emb', 'quantize_bits': 8, 'dtype': 'int8'}
step:1 2603
epoch:8 acc:0.146
quant_embedding config {'quantize_type': 'abs_max', 'params_name': 'emb', 'quantize_bits': 8, 'dtype': 'int8'}
step:1 2719
epoch:9 acc:0.153
</code></pre>
<p>量化后的模型保存在<code>./output_quant</code>中,可看到量化后的参数<code>'emb.int8'</code>的大小为3.9M, 在<code>./v1_cpu5_b100_lr1dir</code>中可看到量化前的参数<code>'emb'</code>的大小为16M。</p>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../quant_post_demo/" class="btn btn-neutral float-right" title="离线量化示例">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../quant_aware_demo/" class="btn btn-neutral" title="在线量化示例"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<span><a href="../quant_aware_demo/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../quant_post_demo/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../../..';</script>
<script src="../../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script>
</body>
</html>
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<meta name="description" content="None"> <meta name="description" content="None">
<link rel="shortcut icon" href="img/favicon.ico"> <link rel="shortcut icon" href="img/favicon.ico">
<title>Welcome to MkDocs - PaddleSlim</title> <title>Home - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="css/theme.css" type="text/css" /> <link rel="stylesheet" href="css/theme.css" type="text/css" />
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<script> <script>
// Current page data // Current page data
var mkdocs_page_name = "Welcome to MkDocs"; var mkdocs_page_name = "Home";
var mkdocs_page_input_path = "index.md"; var mkdocs_page_input_path = "index.md";
var mkdocs_page_url = null; var mkdocs_page_url = null;
</script> </script>
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search"> <div class="wy-side-nav-search">
<a href="." class="icon icon-home"> PaddleSlim</a> <a href="." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search"> <div role="search">
<form id ="rtd-search-form" class="wy-form" action="./search.html" method="get"> <form id ="rtd-search-form" class="wy-form" action="./search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" /> <input type="text" name="q" placeholder="Search docs" title="Type search term here" />
...@@ -50,16 +50,20 @@ ...@@ -50,16 +50,20 @@
<li class="toctree-l1 current"> <li class="toctree-l1 current">
<a class="current" href=".">Welcome to MkDocs</a> <a class="current" href=".">Home</a>
<ul class="subnav"> <ul class="subnav">
<li class="toctree-l2"><a href="#welcome-to-mkdocs">Welcome to MkDocs</a></li> <li class="toctree-l2"><a href="#paddleslim">PaddleSlim</a></li>
<ul> <ul>
<li><a class="toctree-l3" href="#commands">Commands</a></li> <li><a class="toctree-l3" href="#_1">功能</a></li>
<li><a class="toctree-l3" href="#project-layout">Project layout</a></li> <li><a class="toctree-l3" href="#_2">安装</a></li>
<li><a class="toctree-l3" href="#_3">使用</a></li>
<li><a class="toctree-l3" href="#_4">贡献与反馈</a></li>
</ul> </ul>
...@@ -69,75 +73,54 @@ ...@@ -69,75 +73,54 @@
<li class="toctree-l1"> <li class="toctree-l1">
<span class="caption-text">Docs</span> <span class="caption-text">教程</span>
<ul class="subnav"> <ul class="subnav">
<li class=""> <li class="">
<a class="" href="docs/">PaddleSlim</a> <a class="" href="tutorials/quant_post_demo/">离线量化</a>
</li> </li>
<li class=""> <li class="">
<a class="" href="docs/table_latency/">硬件延时评估表</a> <a class="" href="tutorials/quant_aware_demo/">量化训练</a>
</li> </li>
<li class=""> <li class="">
<span class="caption-text">Api</span> <a class="" href="tutorials/quant_embedding_demo/">Embedding量化</a>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="docs/api/analysis_api/">模型分析API文档</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="docs/api/api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="docs/api/nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="docs/api/prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="docs/api/quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="docs/api/search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="docs/api/single_distiller_api/">paddleslim.dist API文档</a> <a class="" href="tutorials/nas_demo/">SA搜索</a>
</li> </li>
</ul> </ul>
</li> </li>
<li class="">
<li class="toctree-l1">
<span class="caption-text">Tutorials</span>
<span class="caption-text">API</span>
<ul class="subnav"> <ul class="subnav">
<li class="toctree-l3"> <li class="">
<a class="" href="docs/tutorials/demo_guide/">Demo guide</a> <a class="" href="api/quantization_api/">量化</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="docs/tutorials/nas_demo/">网络结构搜索示例</a> <a class="" href="api/prune_api/">剪枝</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="docs/tutorials/quant_aware_demo/">在线量化示例</a> <a class="" href="api/analysis_api/">敏感度分析</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="docs/tutorials/quant_embedding_demo/">Embedding量化示例</a> <a class="" href="api/single_distiller_api/">蒸馏</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="docs/tutorials/quant_post_demo/">离线量化示例</a> <a class="" href="api/nas_api/">SA搜索</a>
</li> </li>
</ul> <li class="">
<a class="" href="api/search_space/">搜索空间</a>
</li> </li>
</ul> </ul>
</li> </li>
...@@ -152,7 +135,7 @@ ...@@ -152,7 +135,7 @@
<nav class="wy-nav-top" role="navigation" aria-label="top navigation"> <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href=".">PaddleSlim</a> <a href=".">PaddleSlim Docs</a>
</nav> </nav>
...@@ -164,9 +147,12 @@ ...@@ -164,9 +147,12 @@
<li>Welcome to MkDocs</li> <li>Home</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/index.md"
class="icon icon-github"> Edit on GitHub</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
...@@ -174,21 +160,71 @@ ...@@ -174,21 +160,71 @@
<div role="main"> <div role="main">
<div class="section"> <div class="section">
<h1 id="welcome-to-mkdocs">Welcome to MkDocs</h1> <h1 id="paddleslim">PaddleSlim<a class="headerlink" href="#paddleslim" title="Permanent link">#</a></h1>
<p>For full documentation visit <a href="https://mkdocs.org">mkdocs.org</a>.</p> <p>PaddleSlim是PaddlePaddle框架的一个子模块,主要用于压缩图像领域模型。在PaddleSlim中,不仅实现了目前主流的网络剪枝、量化、蒸馏三种压缩策略,还实现了超参数搜索和小模型网络结构搜索功能。在后续版本中,会添加更多的压缩策略,以及完善对NLP领域模型的支持。</p>
<h2 id="commands">Commands</h2> <h2 id="_1">功能<a class="headerlink" href="#_1" title="Permanent link">#</a></h2>
<ul>
<li>
<p>模型剪裁</p>
<ul> <ul>
<li><code>mkdocs new [dir-name]</code> - Create a new project.</li> <li>支持通道均匀模型剪裁(uniform pruning)</li>
<li><code>mkdocs serve</code> - Start the live-reloading docs server.</li> <li>基于敏感度的模型剪裁</li>
<li><code>mkdocs build</code> - Build the documentation site.</li> <li>基于进化算法的自动模型剪裁三种方式</li>
<li><code>mkdocs help</code> - Print this help message.</li>
</ul> </ul>
<h2 id="project-layout">Project layout</h2> </li>
<pre><code>mkdocs.yml # The configuration file. <li>
docs/ <p>量化训练</p>
index.md # The documentation homepage. <ul>
... # Other markdown pages, images and other files. <li>在线量化训练(training aware)</li>
</code></pre> <li>离线量化(post training)</li>
<li>支持对权重全局量化和Channel-Wise量化</li>
</ul>
</li>
<li>
<p>知识蒸馏</p>
</li>
<li>
<p>轻量神经网络结构自动搜索(Light-NAS)</p>
<ul>
<li>支持基于进化算法的轻量神经网络结构自动搜索(Light-NAS)</li>
<li>支持 FLOPS / 硬件延时约束</li>
<li>支持多平台模型延时评估</li>
</ul>
</li>
</ul>
<h2 id="_2">安装<a class="headerlink" href="#_2" title="Permanent link">#</a></h2>
<p>安装PaddleSlim前,请确认已正确安装Paddle1.6版本或更新版本。Paddle安装请参考:<a href="https://www.paddlepaddle.org.cn/install/quick">Paddle安装教程</a></p>
<ul>
<li>安装develop版本</li>
</ul>
<div class="codehilite"><pre><span></span><span class="n">git</span> <span class="n">clone</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="p">.</span><span class="n">com</span><span class="o">/</span><span class="n">PaddlePaddle</span><span class="o">/</span><span class="n">PaddleSlim</span><span class="p">.</span><span class="n">git</span>
<span class="n">cd</span> <span class="n">PaddleSlim</span>
<span class="n">python</span> <span class="n">setup</span><span class="p">.</span><span class="n">py</span> <span class="n">install</span>
</pre></div>
<ul>
<li>安装官方发布的最新版本</li>
</ul>
<div class="codehilite"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">paddleslim</span> <span class="o">-</span><span class="n">i</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">pypi</span><span class="p">.</span><span class="n">org</span><span class="o">/</span><span class="k">simple</span>
</pre></div>
<ul>
<li>安装历史版本</li>
</ul>
<p>请点击<a href="https://pypi.org/project/paddleslim/#history">pypi.org</a>查看可安装历史版本。</p>
<h2 id="_3">使用<a class="headerlink" href="#_3" title="Permanent link">#</a></h2>
<ul>
<li><a href="doc/api_guide.md">API文档</a>:API使用介绍,包括<a href="">蒸馏</a><a href="">剪裁</a><a href="">量化</a><a href="">模型结构搜索</a></li>
<li><a href="doc/demo_guide.md">示例</a>:基于mnist和cifar10等简单分类任务的模型压缩示例,您可以通过该部分快速体验和了解PaddleSlim的功能。</li>
<li><a href="">实践教程</a>:经典模型的分析和压缩实验教程。</li>
<li><a href="">模型库</a>:经过压缩的分类、检测、语义分割模型,包括权重文件、网络结构文件和性能数据。</li>
<li><a href="">Paddle检测库</a>:介绍如何在检测库中使用PaddleSlim。</li>
<li><a href="">Paddle分割库</a>:介绍如何在分割库中使用PaddleSlim。</li>
<li><a href="">PaddleLite</a>:介绍如何使用预测库PaddleLite部署PaddleSlim产出的模型。</li>
</ul>
<h2 id="_4">贡献与反馈<a class="headerlink" href="#_4" title="Permanent link">#</a></h2>
</div> </div>
</div> </div>
...@@ -196,7 +232,7 @@ docs/ ...@@ -196,7 +232,7 @@ docs/
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="docs/" class="btn btn-neutral float-right" title="PaddleSlim">Next <span class="icon icon-circle-arrow-right"></span></a> <a href="tutorials/quant_post_demo/" class="btn btn-neutral float-right" title="离线量化">Next <span class="icon icon-circle-arrow-right"></span></a>
</div> </div>
...@@ -222,14 +258,18 @@ docs/ ...@@ -222,14 +258,18 @@ docs/
<div class="rst-versions" role="note" style="cursor: pointer"> <div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version"> <span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span style="margin-left: 15px"><a href="docs/" style="color: #fcfcfc">Next &raquo;</a></span> <span style="margin-left: 15px"><a href="tutorials/quant_post_demo/" style="color: #fcfcfc">Next &raquo;</a></span>
</span> </span>
</div> </div>
<script>var base_url = '.';</script> <script>var base_url = '.';</script>
<script src="js/theme.js" defer></script> <script src="js/theme.js" defer></script>
<script src="mathjax-config.js" defer></script>
<script src="MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="search/main.js" defer></script> <script src="search/main.js" defer></script>
</body> </body>
...@@ -237,5 +277,5 @@ docs/ ...@@ -237,5 +277,5 @@ docs/
<!-- <!--
MkDocs version : 1.0.4 MkDocs version : 1.0.4
Build Date UTC : 2019-12-19 11:54:51 Build Date UTC : 2019-12-20 02:14:25
--> -->
site_name: PaddleSlim Docs
nav:
- Home: index.md
- 教程:
- 离线量化: tutorials/quant_post_demo.md
- 量化训练: tutorials/quant_aware_demo.md
- Embedding量化: tutorials/quant_embedding_demo.md
- SA搜索: tutorials/nas_demo.md
- API:
- 量化: api/quantization_api.md
- 剪枝: api/prune_api.md
- 敏感度分析: api/analysis_api.md
- 蒸馏: api/single_distiller_api.md
- SA搜索: api/nas_api.md
- 搜索空间: api/search_space.md
theme: readthedocs
markdown_extensions:
- pymdownx.arithmatex
- admonition
- codehilite
extra_javascript:
- mathjax-config.js
- MathJax.js?config=TeX-AMS-MML_HTMLorMML
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<link rel="shortcut icon" href="./img/favicon.ico"> <link rel="shortcut icon" href="./img/favicon.ico">
<title>PaddleSlim</title> <title>PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="./css/theme.css" type="text/css" /> <link rel="stylesheet" href="./css/theme.css" type="text/css" />
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search"> <div class="wy-side-nav-search">
<a href="./." class="icon icon-home"> PaddleSlim</a> <a href="./." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search"> <div role="search">
<form id ="rtd-search-form" class="wy-form" action="./search.html" method="get"> <form id ="rtd-search-form" class="wy-form" action="./search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" /> <input type="text" name="q" placeholder="Search docs" title="Type search term here" />
...@@ -43,80 +43,59 @@ ...@@ -43,80 +43,59 @@
<li class="toctree-l1"> <li class="toctree-l1">
<a class="" href="./.">Welcome to MkDocs</a> <a class="" href="./.">Home</a>
</li> </li>
<li class="toctree-l1"> <li class="toctree-l1">
<span class="caption-text">Docs</span> <span class="caption-text">教程</span>
<ul class="subnav"> <ul class="subnav">
<li class=""> <li class="">
<a class="" href="./docs/">PaddleSlim</a> <a class="" href="./tutorials/quant_post_demo/">离线量化</a>
</li> </li>
<li class=""> <li class="">
<a class="" href="./docs/table_latency/">硬件延时评估表</a> <a class="" href="./tutorials/quant_aware_demo/">量化训练</a>
</li> </li>
<li class=""> <li class="">
<span class="caption-text">Api</span> <a class="" href="./tutorials/quant_embedding_demo/">Embedding量化</a>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="./docs/api/analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="./docs/api/api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="./docs/api/nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="./docs/api/prune_api/">卷积通道剪裁API文档</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="./docs/api/quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="./docs/api/search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="./docs/api/single_distiller_api/">paddleslim.dist API文档</a> <a class="" href="./tutorials/nas_demo/">SA搜索</a>
</li> </li>
</ul> </ul>
</li> </li>
<li class="">
<li class="toctree-l1">
<span class="caption-text">Tutorials</span>
<span class="caption-text">API</span>
<ul class="subnav"> <ul class="subnav">
<li class="toctree-l3"> <li class="">
<a class="" href="./docs/tutorials/demo_guide/">Demo guide</a> <a class="" href="./api/quantization_api/">量化</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="./docs/tutorials/nas_demo/">网络结构搜索示例</a> <a class="" href="./api/prune_api/">剪枝</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="./docs/tutorials/quant_aware_demo/">在线量化示例</a> <a class="" href="./api/analysis_api/">敏感度分析</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="./docs/tutorials/quant_embedding_demo/">Embedding量化示例</a> <a class="" href="./api/single_distiller_api/">蒸馏</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="./docs/tutorials/quant_post_demo/">离线量化示例</a> <a class="" href="./api/nas_api/">SA搜索</a>
</li> </li>
</ul> <li class="">
<a class="" href="./api/search_space/">搜索空间</a>
</li> </li>
</ul> </ul>
</li> </li>
...@@ -131,7 +110,7 @@ ...@@ -131,7 +110,7 @@
<nav class="wy-nav-top" role="navigation" aria-label="top navigation"> <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="./.">PaddleSlim</a> <a href="./.">PaddleSlim Docs</a>
</nav> </nav>
...@@ -189,12 +168,16 @@ ...@@ -189,12 +168,16 @@
<div class="rst-versions" role="note" style="cursor: pointer"> <div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version"> <span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
</span> </span>
</div> </div>
<script>var base_url = '.';</script> <script>var base_url = '.';</script>
<script src="./js/theme.js" defer></script> <script src="./js/theme.js" defer></script>
<script src="./mathjax-config.js" defer></script>
<script src="./MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="./search/main.js" defer></script> <script src="./search/main.js" defer></script>
</body> </body>
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
...@@ -2,77 +2,57 @@ ...@@ -2,77 +2,57 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
<url> <url>
<loc>None</loc> <loc>None</loc>
<lastmod>2019-12-19</lastmod> <lastmod>2019-12-20</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-12-19</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-12-19</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-12-19</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-12-19</lastmod>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
</url> </url>
</urlset> </urlset>
\ No newline at end of file
无法预览此类型文件
...@@ -7,23 +7,23 @@ ...@@ -7,23 +7,23 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../img/favicon.ico"> <link rel="shortcut icon" href="../img/favicon.ico">
<title>硬件延时评估表 - PaddleSlim</title> <title>硬件延时评估表 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../css/theme.css" type="text/css" /> <link rel="stylesheet" href="../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" /> <link rel="stylesheet" href="../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css"> <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script> <script>
// Current page data // Current page data
var mkdocs_page_name = "\u786c\u4ef6\u5ef6\u65f6\u8bc4\u4f30\u8868"; var mkdocs_page_name = "\u786c\u4ef6\u5ef6\u65f6\u8bc4\u4f30\u8868";
var mkdocs_page_input_path = "docs/table_latency.md"; var mkdocs_page_input_path = "table_latency.md";
var mkdocs_page_url = null; var mkdocs_page_url = null;
</script> </script>
<script src="../../js/jquery-2.1.1.min.js" defer></script> <script src="../js/jquery-2.1.1.min.js" defer></script>
<script src="../../js/modernizr-2.8.3.min.js" defer></script> <script src="../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script> <script>hljs.initHighlightingOnLoad();</script>
...@@ -36,9 +36,9 @@ ...@@ -36,9 +36,9 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search"> <div class="wy-side-nav-search">
<a href="../.." class="icon icon-home"> PaddleSlim</a> <a href=".." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search"> <div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get"> <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" /> <input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form> </form>
</div> </div>
...@@ -50,98 +50,59 @@ ...@@ -50,98 +50,59 @@
<li class="toctree-l1"> <li class="toctree-l1">
<a class="" href="../..">Welcome to MkDocs</a> <a class="" href="..">Home</a>
</li> </li>
<li class="toctree-l1"> <li class="toctree-l1">
<span class="caption-text">Docs</span> <span class="caption-text">教程</span>
<ul class="subnav"> <ul class="subnav">
<li class=""> <li class="">
<a class="" href="../">PaddleSlim</a> <a class="" href="../tutorials/quant_post_demo/">离线量化</a>
</li>
<li class=" current">
<a class="current" href="./">硬件延时评估表</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#_1">硬件延时评估表</a></li>
<ul>
<li><a class="toctree-l4" href="#_2">概述</a></li>
<li><a class="toctree-l4" href="#_3">整体格式</a></li>
<li><a class="toctree-l4" href="#_4">版本信息</a></li>
<li><a class="toctree-l4" href="#_5">操作信息</a></li>
</ul>
</ul>
</li> </li>
<li class=""> <li class="">
<span class="caption-text">Api</span> <a class="" href="../tutorials/quant_aware_demo/">量化训练</a>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../api/analysis_api/">模型分析API文档</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../api/api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="../api/nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../api/prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../api/quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../api/search_space/">paddleslim.nas 提供的搜索空间:</a> <a class="" href="../tutorials/quant_embedding_demo/">Embedding量化</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../api/single_distiller_api/">paddleslim.dist API文档</a> <a class="" href="../tutorials/nas_demo/">SA搜索</a>
</li> </li>
</ul> </ul>
</li> </li>
<li class="">
<li class="toctree-l1">
<span class="caption-text">Tutorials</span>
<span class="caption-text">API</span>
<ul class="subnav"> <ul class="subnav">
<li class="toctree-l3"> <li class="">
<a class="" href="../tutorials/demo_guide/">Demo guide</a> <a class="" href="../api/quantization_api/">量化</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../tutorials/nas_demo/">网络结构搜索示例</a> <a class="" href="../api/prune_api/">剪枝</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../tutorials/quant_aware_demo/">在线量化示例</a> <a class="" href="../api/analysis_api/">敏感度分析</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../tutorials/quant_embedding_demo/">Embedding量化示例</a> <a class="" href="../api/single_distiller_api/">蒸馏</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../tutorials/quant_post_demo/">离线量化示例</a> <a class="" href="../api/nas_api/">SA搜索</a>
</li> </li>
</ul> <li class="">
<a class="" href="../api/search_space/">搜索空间</a>
</li> </li>
</ul> </ul>
</li> </li>
...@@ -156,7 +117,7 @@ ...@@ -156,7 +117,7 @@
<nav class="wy-nav-top" role="navigation" aria-label="top navigation"> <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../..">PaddleSlim</a> <a href="..">PaddleSlim Docs</a>
</nav> </nav>
...@@ -164,17 +125,16 @@ ...@@ -164,17 +125,16 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="../..">Docs</a> &raquo;</li> <li><a href="..">Docs</a> &raquo;</li>
<li>Docs &raquo;</li>
<li>硬件延时评估表</li> <li>硬件延时评估表</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/table_latency.md"
class="icon icon-github"> Edit on GitHub</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
...@@ -182,16 +142,16 @@ ...@@ -182,16 +142,16 @@
<div role="main"> <div role="main">
<div class="section"> <div class="section">
<h1 id="_1">硬件延时评估表</h1> <h1 id="_1">硬件延时评估表<a class="headerlink" href="#_1" title="Permanent link">#</a></h1>
<p>硬件延时评估表用于快速评估一个模型在特定硬件环境和推理引擎上的推理速度。 <p>硬件延时评估表用于快速评估一个模型在特定硬件环境和推理引擎上的推理速度。
该文档主要用于定义PaddleSlim支持的硬件延时评估表的格式。</p> 该文档主要用于定义PaddleSlim支持的硬件延时评估表的格式。</p>
<h2 id="_2">概述</h2> <h2 id="_2">概述<a class="headerlink" href="#_2" title="Permanent link">#</a></h2>
<p>硬件延时评估表中存放着所有可能的操作对应的延时信息,该表中的一个操作包括操作类型和操作参数,比如:操作类型可以是<code>conv2d</code>,对应的操作参数有输入特征图的大小、卷积核个数、卷积核大小等。 <p>硬件延时评估表中存放着所有可能的操作对应的延时信息,该表中的一个操作包括操作类型和操作参数,比如:操作类型可以是<code>conv2d</code>,对应的操作参数有输入特征图的大小、卷积核个数、卷积核大小等。
给定操作的延时依赖于硬件环境和推理引擎。</p> 给定操作的延时依赖于硬件环境和推理引擎。</p>
<h2 id="_3">整体格式</h2> <h2 id="_3">整体格式<a class="headerlink" href="#_3" title="Permanent link">#</a></h2>
<p>硬件延时评估表以文件或多行字符串的形式保存。</p> <p>硬件延时评估表以文件或多行字符串的形式保存。</p>
<p>硬件延时评估表第一行保存版本信息,后续每行为一个操作和对应的延时信息。</p> <p>硬件延时评估表第一行保存版本信息,后续每行为一个操作和对应的延时信息。</p>
<h2 id="_4">版本信息</h2> <h2 id="_4">版本信息<a class="headerlink" href="#_4" title="Permanent link">#</a></h2>
<p>版本信息以英文字符逗号分割,内容依次为硬件环境名称、推理引擎名称和时间戳。</p> <p>版本信息以英文字符逗号分割,内容依次为硬件环境名称、推理引擎名称和时间戳。</p>
<ul> <ul>
<li> <li>
...@@ -204,12 +164,13 @@ ...@@ -204,12 +164,13 @@
<p><strong>时间戳:</strong> 该评估表的创建时间。</p> <p><strong>时间戳:</strong> 该评估表的创建时间。</p>
</li> </li>
</ul> </ul>
<h2 id="_5">操作信息</h2> <h2 id="_5">操作信息<a class="headerlink" href="#_5" title="Permanent link">#</a></h2>
<p>操作信息字段之间以逗号分割。操作信息与延迟信息之间以制表符分割。</p> <p>操作信息字段之间以逗号分割。操作信息与延迟信息之间以制表符分割。</p>
<h3 id="conv2d">conv2d</h3> <h3 id="conv2d">conv2d<a class="headerlink" href="#conv2d" title="Permanent link">#</a></h3>
<p><strong>格式</strong></p> <p><strong>格式</strong></p>
<pre><code>op_type,flag_bias,flag_relu,n_in,c_in,h_in,w_in,c_out,groups,kernel,padding,stride,dilation\tlatency <div class="codehilite"><pre><span></span><span class="n">op_type</span><span class="p">,</span><span class="n">flag_bias</span><span class="p">,</span><span class="n">flag_relu</span><span class="p">,</span><span class="n">n_in</span><span class="p">,</span><span class="n">c_in</span><span class="p">,</span><span class="n">h_in</span><span class="p">,</span><span class="n">w_in</span><span class="p">,</span><span class="n">c_out</span><span class="p">,</span><span class="n">groups</span><span class="p">,</span><span class="n">kernel</span><span class="p">,</span><span class="n">padding</span><span class="p">,</span><span class="n">stride</span><span class="p">,</span><span class="n">dilation</span><span class="err">\</span><span class="n">tlatency</span>
</code></pre> </pre></div>
<p><strong>字段解释</strong></p> <p><strong>字段解释</strong></p>
<ul> <ul>
...@@ -228,10 +189,11 @@ ...@@ -228,10 +189,11 @@
<li><strong>dilation (int)</strong> - 膨胀 (dilation) 大小。</li> <li><strong>dilation (int)</strong> - 膨胀 (dilation) 大小。</li>
<li><strong>latency (float)</strong> - 当前op的延时时间</li> <li><strong>latency (float)</strong> - 当前op的延时时间</li>
</ul> </ul>
<h3 id="activation">activation</h3> <h3 id="activation">activation<a class="headerlink" href="#activation" title="Permanent link">#</a></h3>
<p><strong>格式</strong></p> <p><strong>格式</strong></p>
<pre><code>op_type,n_in,c_in,h_in,w_in\tlatency <div class="codehilite"><pre><span></span><span class="n">op_type</span><span class="p">,</span><span class="n">n_in</span><span class="p">,</span><span class="n">c_in</span><span class="p">,</span><span class="n">h_in</span><span class="p">,</span><span class="n">w_in</span><span class="err">\</span><span class="n">tlatency</span>
</code></pre> </pre></div>
<p><strong>字段解释</strong></p> <p><strong>字段解释</strong></p>
<ul> <ul>
...@@ -242,10 +204,11 @@ ...@@ -242,10 +204,11 @@
<li><strong>w_in (int)</strong> - 输入 Tensor 的特征宽度。</li> <li><strong>w_in (int)</strong> - 输入 Tensor 的特征宽度。</li>
<li><strong>latency (float)</strong> - 当前op的延时时间</li> <li><strong>latency (float)</strong> - 当前op的延时时间</li>
</ul> </ul>
<h3 id="batch_norm">batch_norm</h3> <h3 id="batch_norm">batch_norm<a class="headerlink" href="#batch_norm" title="Permanent link">#</a></h3>
<p><strong>格式</strong></p> <p><strong>格式</strong></p>
<pre><code>op_type,active_type,n_in,c_in,h_in,w_in\tlatency <div class="codehilite"><pre><span></span><span class="n">op_type</span><span class="p">,</span><span class="n">active_type</span><span class="p">,</span><span class="n">n_in</span><span class="p">,</span><span class="n">c_in</span><span class="p">,</span><span class="n">h_in</span><span class="p">,</span><span class="n">w_in</span><span class="err">\</span><span class="n">tlatency</span>
</code></pre> </pre></div>
<p><strong>字段解释</strong></p> <p><strong>字段解释</strong></p>
<ul> <ul>
...@@ -257,10 +220,11 @@ ...@@ -257,10 +220,11 @@
<li><strong>w_in (int)</strong> - 输入 Tensor 的特征宽度。</li> <li><strong>w_in (int)</strong> - 输入 Tensor 的特征宽度。</li>
<li><strong>latency (float)</strong> - 当前op的延时时间</li> <li><strong>latency (float)</strong> - 当前op的延时时间</li>
</ul> </ul>
<h3 id="eltwise">eltwise</h3> <h3 id="eltwise">eltwise<a class="headerlink" href="#eltwise" title="Permanent link">#</a></h3>
<p><strong>格式</strong></p> <p><strong>格式</strong></p>
<pre><code>op_type,n_in,c_in,h_in,w_in\tlatency <div class="codehilite"><pre><span></span><span class="n">op_type</span><span class="p">,</span><span class="n">n_in</span><span class="p">,</span><span class="n">c_in</span><span class="p">,</span><span class="n">h_in</span><span class="p">,</span><span class="n">w_in</span><span class="err">\</span><span class="n">tlatency</span>
</code></pre> </pre></div>
<p><strong>字段解释</strong></p> <p><strong>字段解释</strong></p>
<ul> <ul>
...@@ -271,10 +235,11 @@ ...@@ -271,10 +235,11 @@
<li><strong>w_in (int)</strong> - 输入 Tensor 的特征宽度。</li> <li><strong>w_in (int)</strong> - 输入 Tensor 的特征宽度。</li>
<li><strong>latency (float)</strong> - 当前op的延时时间</li> <li><strong>latency (float)</strong> - 当前op的延时时间</li>
</ul> </ul>
<h3 id="pooling">pooling</h3> <h3 id="pooling">pooling<a class="headerlink" href="#pooling" title="Permanent link">#</a></h3>
<p><strong>格式</strong></p> <p><strong>格式</strong></p>
<pre><code>op_type,flag_global_pooling,n_in,c_in,h_in,w_in,kernel,padding,stride,ceil_mode,pool_type\tlatency <div class="codehilite"><pre><span></span><span class="n">op_type</span><span class="p">,</span><span class="n">flag_global_pooling</span><span class="p">,</span><span class="n">n_in</span><span class="p">,</span><span class="n">c_in</span><span class="p">,</span><span class="n">h_in</span><span class="p">,</span><span class="n">w_in</span><span class="p">,</span><span class="n">kernel</span><span class="p">,</span><span class="n">padding</span><span class="p">,</span><span class="n">stride</span><span class="p">,</span><span class="n">ceil_mode</span><span class="p">,</span><span class="n">pool_type</span><span class="err">\</span><span class="n">tlatency</span>
</code></pre> </pre></div>
<p><strong>字段解释</strong></p> <p><strong>字段解释</strong></p>
<ul> <ul>
...@@ -291,10 +256,11 @@ ...@@ -291,10 +256,11 @@
<li><strong>pool_type (int)</strong> - 池化类型,其中 1 表示 pooling_max,2 表示 pooling_average_include_padding,3 表示 pooling_average_exclude_padding。</li> <li><strong>pool_type (int)</strong> - 池化类型,其中 1 表示 pooling_max,2 表示 pooling_average_include_padding,3 表示 pooling_average_exclude_padding。</li>
<li><strong>latency (float)</strong> - 当前op的延时时间</li> <li><strong>latency (float)</strong> - 当前op的延时时间</li>
</ul> </ul>
<h3 id="softmax">softmax</h3> <h3 id="softmax">softmax<a class="headerlink" href="#softmax" title="Permanent link">#</a></h3>
<p><strong>格式</strong></p> <p><strong>格式</strong></p>
<pre><code>op_type,axis,n_in,c_in,h_in,w_in\tlatency <div class="codehilite"><pre><span></span><span class="n">op_type</span><span class="p">,</span><span class="n">axis</span><span class="p">,</span><span class="n">n_in</span><span class="p">,</span><span class="n">c_in</span><span class="p">,</span><span class="n">h_in</span><span class="p">,</span><span class="n">w_in</span><span class="err">\</span><span class="n">tlatency</span>
</code></pre> </pre></div>
<p><strong>字段解释</strong></p> <p><strong>字段解释</strong></p>
<ul> <ul>
...@@ -311,15 +277,6 @@ ...@@ -311,15 +277,6 @@
</div> </div>
<footer> <footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../api/analysis_api/" class="btn btn-neutral float-right" title="模型分析API文档">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../" class="btn btn-neutral" title="PaddleSlim"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/> <hr/>
...@@ -341,17 +298,17 @@ ...@@ -341,17 +298,17 @@
<div class="rst-versions" role="note" style="cursor: pointer"> <div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version"> <span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../api/analysis_api/" style="color: #fcfcfc">Next &raquo;</a></span>
</span> </span>
</div> </div>
<script>var base_url = '../..';</script> <script>var base_url = '..';</script>
<script src="../../js/theme.js" defer></script> <script src="../js/theme.js" defer></script>
<script src="../../search/main.js" defer></script> <script src="../mathjax-config.js" defer></script>
<script src="../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../search/main.js" defer></script>
</body> </body>
</html> </html>
...@@ -7,23 +7,23 @@ ...@@ -7,23 +7,23 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico"> <link rel="shortcut icon" href="../../img/favicon.ico">
<title>Demo guide - PaddleSlim</title> <title>Demo guide - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" /> <link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css"> <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script> <script>
// Current page data // Current page data
var mkdocs_page_name = "Demo guide"; var mkdocs_page_name = "Demo guide";
var mkdocs_page_input_path = "docs/tutorials/demo_guide.md"; var mkdocs_page_input_path = "tutorials/demo_guide.md";
var mkdocs_page_url = null; var mkdocs_page_url = null;
</script> </script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script> <script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script> <script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script> <script>hljs.initHighlightingOnLoad();</script>
...@@ -36,9 +36,9 @@ ...@@ -36,9 +36,9 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search"> <div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a> <a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search"> <div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get"> <form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" /> <input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form> </form>
</div> </div>
...@@ -50,108 +50,59 @@ ...@@ -50,108 +50,59 @@
<li class="toctree-l1"> <li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a> <a class="" href="../..">Home</a>
</li> </li>
<li class="toctree-l1"> <li class="toctree-l1">
<span class="caption-text">Docs</span> <span class="caption-text">教程</span>
<ul class="subnav"> <ul class="subnav">
<li class=""> <li class="">
<a class="" href="../../">PaddleSlim</a> <a class="" href="../quant_post_demo/">离线量化</a>
</li> </li>
<li class=""> <li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a> <a class="" href="../quant_aware_demo/">量化训练</a>
</li> </li>
<li class=""> <li class="">
<span class="caption-text">Api</span> <a class="" href="../quant_embedding_demo/">Embedding量化</a>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../api/analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/api_guide/">PaddleSlim API文档导航</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/search_space/">paddleslim.nas 提供的搜索空间:</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../../api/single_distiller_api/">paddleslim.dist API文档</a> <a class="" href="../nas_demo/">SA搜索</a>
</li> </li>
</ul> </ul>
</li> </li>
<li class=" current">
<li class="toctree-l1">
<span class="caption-text">Tutorials</span>
<span class="caption-text">API</span>
<ul class="subnav"> <ul class="subnav">
<li class="toctree-l3 current"> <li class="">
<a class="current" href="./">Demo guide</a> <a class="" href="../../api/quantization_api/">量化</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#_1">蒸馏</a></li>
<li class="toctree-l4"><a href="#_2">量化</a></li>
<ul>
<li><a class="toctree-l5" href="#demo">量化训练demo文档</a></li>
<li><a class="toctree-l5" href="#demo_1">离线量化demo文档</a></li>
<li><a class="toctree-l5" href="#embeddingdemo">Embedding量化demo文档</a></li>
</ul>
<li class="toctree-l4"><a href="#nas">NAS</a></li>
<ul>
<li><a class="toctree-l5" href="#nas_1">NAS示例</a></li>
</ul>
</ul>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../nas_demo/">网络结构搜索示例</a> <a class="" href="../../api/prune_api/">剪枝</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../quant_aware_demo/">在线量化示例</a> <a class="" href="../../api/analysis_api/">敏感度分析</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../quant_embedding_demo/">Embedding量化示例</a> <a class="" href="../../api/single_distiller_api/">蒸馏</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../quant_post_demo/">离线量化示例</a> <a class="" href="../../api/nas_api/">SA搜索</a>
</li> </li>
</ul> <li class="">
<a class="" href="../../api/search_space/">搜索空间</a>
</li> </li>
</ul> </ul>
</li> </li>
...@@ -166,7 +117,7 @@ ...@@ -166,7 +117,7 @@
<nav class="wy-nav-top" role="navigation" aria-label="top navigation"> <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a> <a href="../..">PaddleSlim Docs</a>
</nav> </nav>
...@@ -174,21 +125,16 @@ ...@@ -174,21 +125,16 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li> <li><a href="../..">Docs</a> &raquo;</li>
<li>Tutorials &raquo;</li>
<li>Docs &raquo;</li>
<li>Demo guide</li> <li>Demo guide</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/tutorials/demo_guide.md"
class="icon icon-github"> Edit on GitHub</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
...@@ -196,30 +142,21 @@ ...@@ -196,30 +142,21 @@
<div role="main"> <div role="main">
<div class="section"> <div class="section">
<h2 id="_1"><a href="../demo/distillation/distillation_demo.py">蒸馏</a></h2> <h2 id="_1"><a href="../demo/distillation/distillation_demo.py">蒸馏</a><a class="headerlink" href="#_1" title="Permanent link">#</a></h2>
<p>蒸馏demo默认使用ResNet50作为teacher网络,MobileNet作为student网络,此外还支持将teacher和student换成<a href="../demo/models">models目录</a>支持的任意模型。</p> <p>蒸馏demo默认使用ResNet50作为teacher网络,MobileNet作为student网络,此外还支持将teacher和student换成<a href="../demo/models">models目录</a>支持的任意模型。</p>
<p>demo中对teahcer模型和student模型的一层特征图添加了l2_loss的蒸馏损失函数,使用时也可根据需要选择fsp_loss, soft_label_loss以及自定义的loss函数。</p> <p>demo中对teahcer模型和student模型的一层特征图添加了l2_loss的蒸馏损失函数,使用时也可根据需要选择fsp_loss, soft_label_loss以及自定义的loss函数。</p>
<p>训练默认使用的是cifar10数据集,piecewise_decay学习率衰减策略,momentum优化器进行120轮蒸馏训练。使用者也可以简单地用args参数切换为使用ImageNet数据集,cosine_decay学习率衰减策略等其他训练配置。</p> <p>训练默认使用的是cifar10数据集,piecewise_decay学习率衰减策略,momentum优化器进行120轮蒸馏训练。使用者也可以简单地用args参数切换为使用ImageNet数据集,cosine_decay学习率衰减策略等其他训练配置。</p>
<h2 id="_2">量化</h2> <h2 id="_2">量化<a class="headerlink" href="#_2" title="Permanent link">#</a></h2>
<h3 id="demo"><a href="../quant_aware_demo/">量化训练demo文档</a></h3> <h3 id="demo"><a href="../quant_aware_demo/">量化训练demo文档</a><a class="headerlink" href="#demo" title="Permanent link">#</a></h3>
<h3 id="demo_1"><a href="../quant_post_demo/">离线量化demo文档</a></h3> <h3 id="demo_1"><a href="../quant_post_demo/">离线量化demo文档</a><a class="headerlink" href="#demo_1" title="Permanent link">#</a></h3>
<h3 id="embeddingdemo"><a href="../quant_embedding_demo/">Embedding量化demo文档</a></h3> <h3 id="embeddingdemo"><a href="../quant_embedding_demo/">Embedding量化demo文档</a><a class="headerlink" href="#embeddingdemo" title="Permanent link">#</a></h3>
<h2 id="nas">NAS</h2> <h2 id="nas">NAS<a class="headerlink" href="#nas" title="Permanent link">#</a></h2>
<h3 id="nas_1"><a href="../nas_demo/">NAS示例</a></h3> <h3 id="nas_1"><a href="../nas_demo/">NAS示例</a><a class="headerlink" href="#nas_1" title="Permanent link">#</a></h3>
</div> </div>
</div> </div>
<footer> <footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../nas_demo/" class="btn btn-neutral float-right" title="网络结构搜索示例">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../../api/single_distiller_api/" class="btn btn-neutral" title="paddleslim.dist API文档"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/> <hr/>
...@@ -241,17 +178,17 @@ ...@@ -241,17 +178,17 @@
<div class="rst-versions" role="note" style="cursor: pointer"> <div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version"> <span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../../api/single_distiller_api/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../nas_demo/" style="color: #fcfcfc">Next &raquo;</a></span>
</span> </span>
</div> </div>
<script>var base_url = '../../..';</script> <script>var base_url = '../..';</script>
<script src="../../../js/theme.js" defer></script> <script src="../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script> <script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body> </body>
</html> </html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>SA搜索 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "SA\u641c\u7d22";
var mkdocs_page_input_path = "tutorials/nas_demo.md";
var mkdocs_page_url = null;
</script>
<script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../..">Home</a>
</li>
<li class="toctree-l1">
<span class="caption-text">教程</span>
<ul class="subnav">
<li class="">
<a class="" href="../quant_post_demo/">离线量化</a>
</li>
<li class="">
<a class="" href="../quant_aware_demo/">量化训练</a>
</li>
<li class="">
<a class="" href="../quant_embedding_demo/">Embedding量化</a>
</li>
<li class=" current">
<a class="current" href="./">SA搜索</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#_1">网络结构搜索示例</a></li>
<ul>
<li><a class="toctree-l4" href="#_2">接口介绍</a></li>
</ul>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1">
<span class="caption-text">API</span>
<ul class="subnav">
<li class="">
<a class="" href="../../api/quantization_api/">量化</a>
</li>
<li class="">
<a class="" href="../../api/prune_api/">剪枝</a>
</li>
<li class="">
<a class="" href="../../api/analysis_api/">敏感度分析</a>
</li>
<li class="">
<a class="" href="../../api/single_distiller_api/">蒸馏</a>
</li>
<li class="">
<a class="" href="../../api/nas_api/">SA搜索</a>
</li>
<li class="">
<a class="" href="../../api/search_space/">搜索空间</a>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../..">PaddleSlim Docs</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../..">Docs</a> &raquo;</li>
<li>教程 &raquo;</li>
<li>SA搜索</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/tutorials/nas_demo.md"
class="icon icon-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="_1">网络结构搜索示例<a class="headerlink" href="#_1" title="Permanent link">#</a></h1>
<p>本示例介绍如何使用网络结构搜索接口,搜索到一个更小或者精度更高的模型,该文档仅介绍paddleslim中SANAS的使用及如何利用SANAS得到模型结构,完整示例代码请参考sa_nas_mobilenetv2.py或者block_sa_nas_mobilenetv2.py。</p>
<h2 id="_2">接口介绍<a class="headerlink" href="#_2" title="Permanent link">#</a></h2>
<p>请参考。</p>
<h3 id="1">1. 配置搜索空间<a class="headerlink" href="#1" title="Permanent link">#</a></h3>
<p>详细的搜索空间配置可以参考<a href='../../../paddleslim/nas/nas_api.md'>神经网络搜索API文档</a></p>
<div class="codehilite"><pre><span></span><span class="n">config</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">&#39;MobileNetV2Space&#39;</span><span class="p">)]</span>
</pre></div>
<h3 id="2-sanas">2. 利用搜索空间初始化SANAS实例<a class="headerlink" href="#2-sanas" title="Permanent link">#</a></h3>
<div class="codehilite"><pre><span></span><span class="kn">from</span> <span class="nn">paddleslim.nas</span> <span class="kn">import</span> <span class="n">SANAS</span>
<span class="n">sa_nas</span> <span class="o">=</span> <span class="n">SANAS</span><span class="p">(</span>
<span class="n">config</span><span class="p">,</span>
<span class="n">server_addr</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="mi">8881</span><span class="p">),</span>
<span class="n">init_temperature</span><span class="o">=</span><span class="mf">10.24</span><span class="p">,</span>
<span class="n">reduce_rate</span><span class="o">=</span><span class="mf">0.85</span><span class="p">,</span>
<span class="n">search_steps</span><span class="o">=</span><span class="mi">300</span><span class="p">,</span>
<span class="n">is_server</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</pre></div>
<h3 id="3-nas">3. 根据实例化的NAS得到当前的网络结构<a class="headerlink" href="#3-nas" title="Permanent link">#</a></h3>
<div class="codehilite"><pre><span></span><span class="n">archs</span> <span class="o">=</span> <span class="n">sa_nas</span><span class="p">.</span><span class="n">next_archs</span><span class="p">()</span>
</pre></div>
<h3 id="4-program">4. 根据得到的网络结构和输入构造训练和测试program<a class="headerlink" href="#4-program" title="Permanent link">#</a></h3>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">paddle.fluid</span> <span class="kn">as</span> <span class="nn">fluid</span>
<span class="n">train_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="n">test_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="n">startup_program</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">Program</span><span class="p">()</span>
<span class="k">with</span> <span class="n">fluid</span><span class="o">.</span><span class="n">program_guard</span><span class="p">(</span><span class="n">train_program</span><span class="p">,</span> <span class="n">startup_program</span><span class="p">):</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;data&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</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="mi">32</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="s1">&#39;float32&#39;</span><span class="p">)</span>
<span class="n">label</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">data</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;label&#39;</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="s1">&#39;int64&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">arch</span> <span class="ow">in</span> <span class="n">archs</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">arch</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">fc</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">softmax_out</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">softmax</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="n">output</span><span class="p">,</span> <span class="n">use_cudnn</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">cost</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">cross_entropy</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="n">softmax_out</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">)</span>
<span class="n">avg_cost</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">cost</span><span class="p">)</span>
<span class="n">acc_top1</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">accuracy</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="n">softmax_out</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">test_program</span> <span class="o">=</span> <span class="n">train_program</span><span class="o">.</span><span class="n">clone</span><span class="p">(</span><span class="n">for_test</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">sgd</span> <span class="o">=</span> <span class="n">fluid</span><span class="o">.</span><span class="n">optimizer</span><span class="o">.</span><span class="n">SGD</span><span class="p">(</span><span class="n">learning_rate</span><span class="o">=</span><span class="mf">1e-3</span><span class="p">)</span>
<span class="n">sgd</span><span class="o">.</span><span class="n">minimize</span><span class="p">(</span><span class="n">avg_cost</span><span class="p">)</span>
</pre></div>
<h3 id="5-program">5. 根据构造的训练program添加限制条件<a class="headerlink" href="#5-program" title="Permanent link">#</a></h3>
<div class="codehilite"><pre><span></span><span class="kn">from</span> <span class="nn">paddleslim.analysis</span> <span class="kn">import</span> <span class="n">flops</span>
<span class="k">if</span> <span class="n">flops</span><span class="p">(</span><span class="n">train_program</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">321208544</span><span class="p">:</span>
<span class="k">continue</span>
</pre></div>
<h3 id="6-score">6. 回传score<a class="headerlink" href="#6-score" title="Permanent link">#</a></h3>
<div class="codehilite"><pre><span></span><span class="n">sa_nas</span><span class="p">.</span><span class="n">reward</span><span class="p">(</span><span class="n">score</span><span class="p">)</span>
</pre></div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../../api/quantization_api/" class="btn btn-neutral float-right" title="量化">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../quant_embedding_demo/" class="btn btn-neutral" title="Embedding量化"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../quant_embedding_demo/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../../api/quantization_api/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../..';</script>
<script src="../../js/theme.js" defer></script>
<script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>量化训练 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "\u91cf\u5316\u8bad\u7ec3";
var mkdocs_page_input_path = "tutorials/quant_aware_demo.md";
var mkdocs_page_url = null;
</script>
<script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../..">Home</a>
</li>
<li class="toctree-l1">
<span class="caption-text">教程</span>
<ul class="subnav">
<li class="">
<a class="" href="../quant_post_demo/">离线量化</a>
</li>
<li class=" current">
<a class="current" href="./">量化训练</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#_1">在线量化示例</a></li>
<ul>
<li><a class="toctree-l4" href="#_2">接口介绍</a></li>
<li><a class="toctree-l4" href="#_3">分类模型的离线量化流程</a></li>
</ul>
</ul>
</li>
<li class="">
<a class="" href="../quant_embedding_demo/">Embedding量化</a>
</li>
<li class="">
<a class="" href="../nas_demo/">SA搜索</a>
</li>
</ul>
</li>
<li class="toctree-l1">
<span class="caption-text">API</span>
<ul class="subnav">
<li class="">
<a class="" href="../../api/quantization_api/">量化</a>
</li>
<li class="">
<a class="" href="../../api/prune_api/">剪枝</a>
</li>
<li class="">
<a class="" href="../../api/analysis_api/">敏感度分析</a>
</li>
<li class="">
<a class="" href="../../api/single_distiller_api/">蒸馏</a>
</li>
<li class="">
<a class="" href="../../api/nas_api/">SA搜索</a>
</li>
<li class="">
<a class="" href="../../api/search_space/">搜索空间</a>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../..">PaddleSlim Docs</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../..">Docs</a> &raquo;</li>
<li>教程 &raquo;</li>
<li>量化训练</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/tutorials/quant_aware_demo.md"
class="icon icon-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="_1">在线量化示例<a class="headerlink" href="#_1" title="Permanent link">#</a></h1>
<p>本示例介绍如何使用在线量化接口,来对训练好的分类模型进行量化, 可以减少模型的存储空间和显存占用。</p>
<h2 id="_2">接口介绍<a class="headerlink" href="#_2" title="Permanent link">#</a></h2>
<p>请参考 <a href='../../../paddleslim/quant/quantization_api_doc.md'>量化API文档</a></p>
<h2 id="_3">分类模型的离线量化流程<a class="headerlink" href="#_3" title="Permanent link">#</a></h2>
<h3 id="1">1. 配置量化参数<a class="headerlink" href="#1" title="Permanent link">#</a></h3>
<div class="codehilite"><pre><span></span><span class="n">quant_config</span> <span class="o">=</span> <span class="err">{</span>
<span class="s1">&#39;weight_quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span>
<span class="s1">&#39;activation_quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;moving_average_abs_max&#39;</span><span class="p">,</span>
<span class="s1">&#39;weight_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>
<span class="s1">&#39;activation_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>
<span class="s1">&#39;not_quant_pattern&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;skip_quant&#39;</span><span class="p">],</span>
<span class="s1">&#39;quantize_op_types&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;conv2d&#39;</span><span class="p">,</span> <span class="s1">&#39;depthwise_conv2d&#39;</span><span class="p">,</span> <span class="s1">&#39;mul&#39;</span><span class="p">],</span>
<span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="p">,</span>
<span class="s1">&#39;window_size&#39;</span><span class="p">:</span> <span class="mi">10000</span><span class="p">,</span>
<span class="s1">&#39;moving_rate&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">.</span><span class="mi">9</span><span class="p">,</span>
<span class="s1">&#39;quant_weight_only&#39;</span><span class="p">:</span> <span class="k">False</span>
<span class="err">}</span>
</pre></div>
<h3 id="2-programop">2. 对训练和测试program插入可训练量化op<a class="headerlink" href="#2-programop" title="Permanent link">#</a></h3>
<div class="codehilite"><pre><span></span><span class="n">val_program</span> <span class="o">=</span> <span class="n">quant_aware</span><span class="p">(</span><span class="n">val_program</span><span class="p">,</span> <span class="n">place</span><span class="p">,</span> <span class="n">quant_config</span><span class="p">,</span> <span class="k">scope</span><span class="o">=</span><span class="k">None</span><span class="p">,</span> <span class="n">for_test</span><span class="o">=</span><span class="k">True</span><span class="p">)</span>
<span class="n">compiled_train_prog</span> <span class="o">=</span> <span class="n">quant_aware</span><span class="p">(</span><span class="n">train_prog</span><span class="p">,</span> <span class="n">place</span><span class="p">,</span> <span class="n">quant_config</span><span class="p">,</span> <span class="k">scope</span><span class="o">=</span><span class="k">None</span><span class="p">,</span> <span class="n">for_test</span><span class="o">=</span><span class="k">False</span><span class="p">)</span>
</pre></div>
<h3 id="3build">3.关掉指定build策略<a class="headerlink" href="#3build" title="Permanent link">#</a></h3>
<div class="codehilite"><pre><span></span><span class="n">build_strategy</span> <span class="o">=</span> <span class="n">fluid</span><span class="p">.</span><span class="n">BuildStrategy</span><span class="p">()</span>
<span class="n">build_strategy</span><span class="p">.</span><span class="n">fuse_all_reduce_ops</span> <span class="o">=</span> <span class="k">False</span>
<span class="n">build_strategy</span><span class="p">.</span><span class="n">sync_batch_norm</span> <span class="o">=</span> <span class="k">False</span>
<span class="n">exec_strategy</span> <span class="o">=</span> <span class="n">fluid</span><span class="p">.</span><span class="n">ExecutionStrategy</span><span class="p">()</span>
<span class="n">compiled_train_prog</span> <span class="o">=</span> <span class="n">compiled_train_prog</span><span class="p">.</span><span class="n">with_data_parallel</span><span class="p">(</span>
<span class="n">loss_name</span><span class="o">=</span><span class="n">avg_cost</span><span class="p">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">build_strategy</span><span class="o">=</span><span class="n">build_strategy</span><span class="p">,</span>
<span class="n">exec_strategy</span><span class="o">=</span><span class="n">exec_strategy</span><span class="p">)</span>
</pre></div>
<h3 id="4-freeze-program">4. freeze program<a class="headerlink" href="#4-freeze-program" title="Permanent link">#</a></h3>
<div class="codehilite"><pre><span></span><span class="n">float_program</span><span class="p">,</span> <span class="n">int8_program</span> <span class="o">=</span> <span class="k">convert</span><span class="p">(</span><span class="n">val_program</span><span class="p">,</span>
<span class="n">place</span><span class="p">,</span>
<span class="n">quant_config</span><span class="p">,</span>
<span class="k">scope</span><span class="o">=</span><span class="k">None</span><span class="p">,</span>
<span class="n">save_int8</span><span class="o">=</span><span class="k">True</span><span class="p">)</span>
</pre></div>
<h3 id="5">5.保存预测模型<a class="headerlink" href="#5" title="Permanent link">#</a></h3>
<div class="codehilite"><pre><span></span><span class="nv">fluid</span>.<span class="nv">io</span>.<span class="nv">save_inference_model</span><span class="ss">(</span>
<span class="k">dirname</span><span class="o">=</span><span class="nv">float_path</span>,
<span class="nv">feeded_var_names</span><span class="o">=</span>[<span class="nv">image</span>.<span class="nv">name</span>],
<span class="nv">target_vars</span><span class="o">=</span>[<span class="nv">out</span>], <span class="nv">executor</span><span class="o">=</span><span class="nv">exe</span>,
<span class="nv">main_program</span><span class="o">=</span><span class="nv">float_program</span>,
<span class="nv">model_filename</span><span class="o">=</span><span class="nv">float_path</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="s">/model</span><span class="s1">&#39;</span>,
<span class="nv">params_filename</span><span class="o">=</span><span class="nv">float_path</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="s">/params</span><span class="s1">&#39;</span><span class="ss">)</span>
<span class="nv">fluid</span>.<span class="nv">io</span>.<span class="nv">save_inference_model</span><span class="ss">(</span>
<span class="k">dirname</span><span class="o">=</span><span class="nv">int8_path</span>,
<span class="nv">feeded_var_names</span><span class="o">=</span>[<span class="nv">image</span>.<span class="nv">name</span>],
<span class="nv">target_vars</span><span class="o">=</span>[<span class="nv">out</span>], <span class="nv">executor</span><span class="o">=</span><span class="nv">exe</span>,
<span class="nv">main_program</span><span class="o">=</span><span class="nv">int8_program</span>,
<span class="nv">model_filename</span><span class="o">=</span><span class="nv">int8_path</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="s">/model</span><span class="s1">&#39;</span>,
<span class="nv">params_filename</span><span class="o">=</span><span class="nv">int8_path</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="s">/params</span><span class="s1">&#39;</span><span class="ss">)</span>
</pre></div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../quant_embedding_demo/" class="btn btn-neutral float-right" title="Embedding量化">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../quant_post_demo/" class="btn btn-neutral" title="离线量化"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../quant_post_demo/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../quant_embedding_demo/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../..';</script>
<script src="../../js/theme.js" defer></script>
<script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body>
</html>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>Embedding量化 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script>
// Current page data
var mkdocs_page_name = "Embedding\u91cf\u5316";
var mkdocs_page_input_path = "tutorials/quant_embedding_demo.md";
var mkdocs_page_url = null;
</script>
<script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search">
<a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1">
<a class="" href="../..">Home</a>
</li>
<li class="toctree-l1">
<span class="caption-text">教程</span>
<ul class="subnav">
<li class="">
<a class="" href="../quant_post_demo/">离线量化</a>
</li>
<li class="">
<a class="" href="../quant_aware_demo/">量化训练</a>
</li>
<li class=" current">
<a class="current" href="./">Embedding量化</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#embedding">Embedding量化示例</a></li>
<ul>
<li><a class="toctree-l4" href="#skip-gramword2vector">基于skip-gram的word2vector模型</a></li>
<li><a class="toctree-l4" href="#skip-gramword2vector_1">量化基于skip-gram的word2vector模型</a></li>
</ul>
</ul>
</li>
<li class="">
<a class="" href="../nas_demo/">SA搜索</a>
</li>
</ul>
</li>
<li class="toctree-l1">
<span class="caption-text">API</span>
<ul class="subnav">
<li class="">
<a class="" href="../../api/quantization_api/">量化</a>
</li>
<li class="">
<a class="" href="../../api/prune_api/">剪枝</a>
</li>
<li class="">
<a class="" href="../../api/analysis_api/">敏感度分析</a>
</li>
<li class="">
<a class="" href="../../api/single_distiller_api/">蒸馏</a>
</li>
<li class="">
<a class="" href="../../api/nas_api/">SA搜索</a>
</li>
<li class="">
<a class="" href="../../api/search_space/">搜索空间</a>
</li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../..">PaddleSlim Docs</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../..">Docs</a> &raquo;</li>
<li>教程 &raquo;</li>
<li>Embedding量化</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/tutorials/quant_embedding_demo.md"
class="icon icon-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<h1 id="embedding">Embedding量化示例<a class="headerlink" href="#embedding" title="Permanent link">#</a></h1>
<p>本示例介绍如何使用Embedding量化的接口 <a href="">paddleslim.quant.quant_embedding</a><code>quant_embedding</code>接口将网络中的Embedding参数从<code>float32</code>类型量化到 <code>8-bit</code>整数类型,在几乎不损失模型精度的情况下减少模型的存储空间和显存占用。</p>
<p>接口介绍请参考 <a href='../../../paddleslim/quant/quantization_api_doc.md'>量化API文档</a></p>
<p>该接口对program的修改:</p>
<p>量化前:</p>
<p align="center">
<img src="./image/before.png" height=200 width=100 hspace='10'/> <br />
<strong>图1:量化前的模型结构</strong>
</p>
<p>量化后:</p>
<p align="center">
<img src="./image/after.png" height=300 width=300 hspace='10'/> <br />
<strong>图2: 量化后的模型结构</strong>
</p>
<p>以下将以 <code>基于skip-gram的word2vector模型</code> 为例来说明如何使用<code>quant_embedding</code>接口。首先介绍 <code>基于skip-gram的word2vector模型</code> 的正常训练和测试流程。</p>
<h2 id="skip-gramword2vector">基于skip-gram的word2vector模型<a class="headerlink" href="#skip-gramword2vector" title="Permanent link">#</a></h2>
<p>以下是本例的简要目录结构及说明:</p>
<div class="codehilite"><pre><span></span>.
├── cluster_train.py # 分布式训练函数
├── cluster_train.sh # 本地模拟多机脚本
├── train.py # 训练函数
├── infer.py # 预测脚本
├── net.py # 网络结构
├── preprocess.py # 预处理脚本,包括构建词典和预处理文本
├── reader.py # 训练阶段的文本读写
├── train.py # 训练函数
└── utils.py # 通用函数
</pre></div>
<h3 id="_1">介绍<a class="headerlink" href="#_1" title="Permanent link">#</a></h3>
<p>本例实现了skip-gram模式的word2vector模型。</p>
<p>同时推荐用户参考<a href="https://aistudio.baidu.com/aistudio/projectDetail/124377"> IPython Notebook demo</a></p>
<h3 id="_2">数据下载<a class="headerlink" href="#_2" title="Permanent link">#</a></h3>
<p>全量数据集使用的是来自1 Billion Word Language Model Benchmark的(http://www.statmt.org/lm-benchmark) 的数据集.</p>
<div class="codehilite"><pre><span></span>mkdir data
wget http://www.statmt.org/lm-benchmark/1-billion-word-language-modeling-benchmark-r13output.tar.gz
tar xzvf <span class="m">1</span>-billion-word-language-modeling-benchmark-r13output.tar.gz
mv <span class="m">1</span>-billion-word-language-modeling-benchmark-r13output/training-monolingual.tokenized.shuffled/ data/
</pre></div>
<p>备用数据地址下载命令如下</p>
<div class="codehilite"><pre><span></span>mkdir data
wget https://paddlerec.bj.bcebos.com/word2vec/1-billion-word-language-modeling-benchmark-r13output.tar
tar xvf <span class="m">1</span>-billion-word-language-modeling-benchmark-r13output.tar
mv <span class="m">1</span>-billion-word-language-modeling-benchmark-r13output/training-monolingual.tokenized.shuffled/ data/
</pre></div>
<p>为了方便快速验证,我们也提供了经典的text8样例数据集,包含1700w个词。 下载命令如下</p>
<div class="codehilite"><pre><span></span>mkdir data
wget https://paddlerec.bj.bcebos.com/word2vec/text.tar
tar xvf text.tar
mv text data/
</pre></div>
<h3 id="_3">数据预处理<a class="headerlink" href="#_3" title="Permanent link">#</a></h3>
<p>以样例数据集为例进行预处理。全量数据集注意解压后以training-monolingual.tokenized.shuffled 目录为预处理目录,和样例数据集的text目录并列。</p>
<p>词典格式: 词&lt;空格&gt;词频。注意低频词用'UNK'表示</p>
<p>可以按格式自建词典,如果自建词典跳过第一步。</p>
<div class="codehilite"><pre><span></span><span class="n">the</span> <span class="mi">1061396</span>
<span class="k">of</span> <span class="mi">593677</span>
<span class="k">and</span> <span class="mi">416629</span>
<span class="n">one</span> <span class="mi">411764</span>
<span class="k">in</span> <span class="mi">372201</span>
<span class="n">a</span> <span class="mi">325873</span>
<span class="o">&lt;</span><span class="n">UNK</span><span class="o">&gt;</span> <span class="mi">324608</span>
<span class="k">to</span> <span class="mi">316376</span>
<span class="n">zero</span> <span class="mi">264975</span>
<span class="n">nine</span> <span class="mi">250430</span>
</pre></div>
<p>第一步根据英文语料生成词典,中文语料可以通过修改text_strip方法自定义处理方法。</p>
<div class="codehilite"><pre><span></span>python preprocess.py --build_dict --build_dict_corpus_dir data/text/ --dict_path data/test_build_dict
</pre></div>
<p>第二步根据词典将文本转成id, 同时进行downsample,按照概率过滤常见词, 同时生成word和id映射的文件,文件名为词典+"<em>word_to_id</em>"。</p>
<div class="codehilite"><pre><span></span>python preprocess.py --filter_corpus --dict_path data/test_build_dict --input_corpus_dir data/text --output_corpus_dir data/convert_text8 --min_count <span class="m">5</span> --downsample <span class="m">0</span>.001
</pre></div>
<h3 id="_4">训练<a class="headerlink" href="#_4" title="Permanent link">#</a></h3>
<p>具体的参数配置可运行</p>
<div class="codehilite"><pre><span></span>python train.py -h
</pre></div>
<p>单机多线程训练</p>
<div class="codehilite"><pre><span></span><span class="nv">OPENBLAS_NUM_THREADS</span><span class="o">=</span><span class="m">1</span> <span class="nv">CPU_NUM</span><span class="o">=</span><span class="m">5</span> python train.py --train_data_dir data/convert_text8 --dict_path data/test_build_dict --num_passes <span class="m">10</span> --batch_size <span class="m">100</span> --model_output_dir v1_cpu5_b100_lr1dir --base_lr <span class="m">1</span>.0 --print_batch <span class="m">1000</span> --with_speed --is_sparse
</pre></div>
<p>本地单机模拟多机训练</p>
<div class="codehilite"><pre><span></span>sh cluster_train.sh
</pre></div>
<p>本示例中按照单机多线程训练的命令进行训练,训练完毕后,可看到在当前文件夹下保存模型的路径为: <code>v1_cpu5_b100_lr1dir</code>, 运行 <code>ls v1_cpu5_b100_lr1dir</code>可看到该文件夹下保存了训练的10个epoch的模型文件。</p>
<div class="codehilite"><pre><span></span><span class="n">pass</span><span class="o">-</span><span class="mi">0</span> <span class="n">pass</span><span class="o">-</span><span class="mi">1</span> <span class="n">pass</span><span class="o">-</span><span class="mi">2</span> <span class="n">pass</span><span class="o">-</span><span class="mi">3</span> <span class="n">pass</span><span class="o">-</span><span class="mi">4</span> <span class="n">pass</span><span class="o">-</span><span class="mi">5</span> <span class="n">pass</span><span class="o">-</span><span class="mi">6</span> <span class="n">pass</span><span class="o">-</span><span class="mi">7</span> <span class="n">pass</span><span class="o">-</span><span class="mi">8</span> <span class="n">pass</span><span class="o">-</span><span class="mi">9</span>
</pre></div>
<h3 id="_5">预测<a class="headerlink" href="#_5" title="Permanent link">#</a></h3>
<p>测试集下载命令如下</p>
<div class="codehilite"><pre><span></span><span class="c1">#全量数据集测试集</span>
wget https://paddlerec.bj.bcebos.com/word2vec/test_dir.tar
<span class="c1">#样本数据集测试集</span>
wget https://paddlerec.bj.bcebos.com/word2vec/test_mid_dir.tar
</pre></div>
<p>预测命令,注意词典名称需要加后缀"<em>word_to_id</em>", 此文件是预处理阶段生成的。</p>
<div class="codehilite"><pre><span></span>python infer.py --infer_epoch --test_dir data/test_mid_dir --dict_path data/test_build_dict_word_to_id_ --batch_size <span class="m">20000</span> --model_dir v1_cpu5_b100_lr1dir/ --start_index <span class="m">0</span> --last_index <span class="m">9</span>
</pre></div>
<p>运行该预测命令, 可看到如下输出</p>
<div class="codehilite"><pre><span></span><span class="p">(</span><span class="s1">&#39;start index: &#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39; last_index:&#39;</span><span class="p">,</span> <span class="mi">9</span><span class="p">)</span>
<span class="p">(</span><span class="s1">&#39;vocab_size:&#39;</span><span class="p">,</span> <span class="mi">63642</span><span class="p">)</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">249</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">0</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">014</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">590</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">1</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">033</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">982</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">2</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">055</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">1338</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">3</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">075</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">1653</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">4</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">093</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">1914</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">5</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">107</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">2204</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">6</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">124</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">2416</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">7</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">136</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">2606</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">8</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">146</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">2722</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">9</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">153</span>
</pre></div>
<h2 id="skip-gramword2vector_1">量化<code>基于skip-gram的word2vector模型</code><a class="headerlink" href="#skip-gramword2vector_1" title="Permanent link">#</a></h2>
<p>量化配置为:</p>
<div class="codehilite"><pre><span></span><span class="n">config</span> <span class="o">=</span> <span class="err">{</span>
<span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span>
<span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span>
<span class="err">}</span>
</pre></div>
<p>运行命令为:</p>
<div class="codehilite"><pre><span></span>python infer.py --infer_epoch --test_dir data/test_mid_dir --dict_path data/test_build_dict_word_to_id_ --batch_size <span class="m">20000</span> --model_dir v1_cpu5_b100_lr1dir/ --start_index <span class="m">0</span> --last_index <span class="m">9</span> --emb_quant True
</pre></div>
<p>运行输出为:</p>
<div class="codehilite"><pre><span></span><span class="p">(</span><span class="s1">&#39;start index: &#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39; last_index:&#39;</span><span class="p">,</span> <span class="mi">9</span><span class="p">)</span>
<span class="p">(</span><span class="s1">&#39;vocab_size:&#39;</span><span class="p">,</span> <span class="mi">63642</span><span class="p">)</span>
<span class="n">quant_embedding</span> <span class="n">config</span> <span class="err">{</span><span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span> <span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="err">}</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">253</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">0</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">014</span>
<span class="n">quant_embedding</span> <span class="n">config</span> <span class="err">{</span><span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span> <span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="err">}</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">586</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">1</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">033</span>
<span class="n">quant_embedding</span> <span class="n">config</span> <span class="err">{</span><span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span> <span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="err">}</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">970</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">2</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">054</span>
<span class="n">quant_embedding</span> <span class="n">config</span> <span class="err">{</span><span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span> <span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="err">}</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">1364</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">3</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">077</span>
<span class="n">quant_embedding</span> <span class="n">config</span> <span class="err">{</span><span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span> <span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="err">}</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">1642</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">4</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">092</span>
<span class="n">quant_embedding</span> <span class="n">config</span> <span class="err">{</span><span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span> <span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="err">}</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">1936</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">5</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">109</span>
<span class="n">quant_embedding</span> <span class="n">config</span> <span class="err">{</span><span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span> <span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="err">}</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">2216</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">6</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">124</span>
<span class="n">quant_embedding</span> <span class="n">config</span> <span class="err">{</span><span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span> <span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="err">}</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">2419</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">7</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">136</span>
<span class="n">quant_embedding</span> <span class="n">config</span> <span class="err">{</span><span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span> <span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="err">}</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">2603</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">8</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">146</span>
<span class="n">quant_embedding</span> <span class="n">config</span> <span class="err">{</span><span class="s1">&#39;quantize_type&#39;</span><span class="p">:</span> <span class="s1">&#39;abs_max&#39;</span><span class="p">,</span> <span class="s1">&#39;params_name&#39;</span><span class="p">:</span> <span class="s1">&#39;emb&#39;</span><span class="p">,</span> <span class="s1">&#39;quantize_bits&#39;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">&#39;dtype&#39;</span><span class="p">:</span> <span class="s1">&#39;int8&#39;</span><span class="err">}</span>
<span class="n">step</span><span class="p">:</span><span class="mi">1</span> <span class="mi">2719</span>
<span class="n">epoch</span><span class="p">:</span><span class="mi">9</span> <span class="n">acc</span><span class="p">:</span><span class="mi">0</span><span class="p">.</span><span class="mi">153</span>
</pre></div>
<p>量化后的模型保存在<code>./output_quant</code>中,可看到量化后的参数<code>'emb.int8'</code>的大小为3.9M, 在<code>./v1_cpu5_b100_lr1dir</code>中可看到量化前的参数<code>'emb'</code>的大小为16M。</p>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../nas_demo/" class="btn btn-neutral float-right" title="SA搜索">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../quant_aware_demo/" class="btn btn-neutral" title="量化训练"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../quant_aware_demo/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../nas_demo/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '../..';</script>
<script src="../../js/theme.js" defer></script>
<script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body>
</html>
...@@ -7,23 +7,23 @@ ...@@ -7,23 +7,23 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../../../img/favicon.ico"> <link rel="shortcut icon" href="../../img/favicon.ico">
<title>离线量化示例 - PaddleSlim</title> <title>离线量化 - PaddleSlim Docs</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../../css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../css/theme_extra.css" type="text/css" /> <link rel="stylesheet" href="../../css/theme_extra.css" type="text/css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css"> <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script> <script>
// Current page data // Current page data
var mkdocs_page_name = "\u79bb\u7ebf\u91cf\u5316\u793a\u4f8b"; var mkdocs_page_name = "\u79bb\u7ebf\u91cf\u5316";
var mkdocs_page_input_path = "docs/tutorials/quant_post_demo.md"; var mkdocs_page_input_path = "tutorials/quant_post_demo.md";
var mkdocs_page_url = null; var mkdocs_page_url = null;
</script> </script>
<script src="../../../js/jquery-2.1.1.min.js" defer></script> <script src="../../js/jquery-2.1.1.min.js" defer></script>
<script src="../../../js/modernizr-2.8.3.min.js" defer></script> <script src="../../js/modernizr-2.8.3.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script> <script>hljs.initHighlightingOnLoad();</script>
...@@ -36,9 +36,9 @@ ...@@ -36,9 +36,9 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-nav-search"> <div class="wy-side-nav-search">
<a href="../../.." class="icon icon-home"> PaddleSlim</a> <a href="../.." class="icon icon-home"> PaddleSlim Docs</a>
<div role="search"> <div role="search">
<form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get"> <form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" /> <input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form> </form>
</div> </div>
...@@ -50,94 +50,73 @@ ...@@ -50,94 +50,73 @@
<li class="toctree-l1"> <li class="toctree-l1">
<a class="" href="../../..">Welcome to MkDocs</a> <a class="" href="../..">Home</a>
</li> </li>
<li class="toctree-l1"> <li class="toctree-l1">
<span class="caption-text">Docs</span> <span class="caption-text">教程</span>
<ul class="subnav"> <ul class="subnav">
<li class=""> <li class=" current">
<a class="" href="../../">PaddleSlim</a> <a class="current" href="./">离线量化</a>
<ul class="subnav">
<li class="toctree-l3"><a href="#_1">离线量化示例</a></li>
<ul>
<li><a class="toctree-l4" href="#_2">接口介绍</a></li>
<li><a class="toctree-l4" href="#_3">分类模型的离线量化流程</a></li>
</ul>
</ul>
</li> </li>
<li class=""> <li class="">
<a class="" href="../../table_latency/">硬件延时评估表</a> <a class="" href="../quant_aware_demo/">量化训练</a>
</li> </li>
<li class=""> <li class="">
<span class="caption-text">Api</span> <a class="" href="../quant_embedding_demo/">Embedding量化</a>
<ul class="subnav">
<li class="toctree-l3">
<a class="" href="../../api/analysis_api/">模型分析API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/api_guide/">PaddleSlim API文档导航</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../../api/nas_api/">paddleslim.nas API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/prune_api/">卷积通道剪裁API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/quantization_api/">paddleslim.quant API文档</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/search_space/">paddleslim.nas 提供的搜索空间:</a>
</li>
<li class="toctree-l3">
<a class="" href="../../api/single_distiller_api/">paddleslim.dist API文档</a> <a class="" href="../nas_demo/">SA搜索</a>
</li> </li>
</ul> </ul>
</li> </li>
<li class=" current">
<li class="toctree-l1">
<span class="caption-text">Tutorials</span>
<span class="caption-text">API</span>
<ul class="subnav"> <ul class="subnav">
<li class="toctree-l3"> <li class="">
<a class="" href="../demo_guide/">Demo guide</a> <a class="" href="../../api/quantization_api/">量化</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../nas_demo/">网络结构搜索示例</a> <a class="" href="../../api/prune_api/">剪枝</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../quant_aware_demo/">在线量化示例</a> <a class="" href="../../api/analysis_api/">敏感度分析</a>
</li> </li>
<li class="toctree-l3"> <li class="">
<a class="" href="../quant_embedding_demo/">Embedding量化示例</a> <a class="" href="../../api/single_distiller_api/">蒸馏</a>
</li> </li>
<li class="toctree-l3 current"> <li class="">
<a class="current" href="./">离线量化示例</a> <a class="" href="../../api/nas_api/">SA搜索</a>
<ul class="subnav">
<li class="toctree-l4"><a href="#_1">离线量化示例</a></li>
<ul>
<li><a class="toctree-l5" href="#_2">接口介绍</a></li>
<li><a class="toctree-l5" href="#_3">分类模型的离线量化流程</a></li>
</ul>
</ul>
</li> </li>
</ul> <li class="">
<a class="" href="../../api/search_space/">搜索空间</a>
</li> </li>
</ul> </ul>
</li> </li>
...@@ -152,7 +131,7 @@ ...@@ -152,7 +131,7 @@
<nav class="wy-nav-top" role="navigation" aria-label="top navigation"> <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../..">PaddleSlim</a> <a href="../..">PaddleSlim Docs</a>
</nav> </nav>
...@@ -160,21 +139,20 @@ ...@@ -160,21 +139,20 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="../../..">Docs</a> &raquo;</li> <li><a href="../..">Docs</a> &raquo;</li>
<li>Tutorials &raquo;</li> <li>教程 &raquo;</li>
<li>Docs &raquo;</li>
<li>离线量化示例</li> <li>离线量化</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="https://github.com/PaddlePaddle/PaddleSlim/edit/master/docs/tutorials/quant_post_demo.md"
class="icon icon-github"> Edit on GitHub</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
...@@ -182,31 +160,33 @@ ...@@ -182,31 +160,33 @@
<div role="main"> <div role="main">
<div class="section"> <div class="section">
<h1 id="_1">离线量化示例</h1> <h1 id="_1">离线量化示例<a class="headerlink" href="#_1" title="Permanent link">#</a></h1>
<p>本示例介绍如何使用离线量化接口<code>paddleslim.quant.quant_post</code>来对训练好的分类模型进行离线量化, 该接口无需对模型进行训练就可得到量化模型,减少模型的存储空间和显存占用。</p> <p>本示例介绍如何使用离线量化接口<code>paddleslim.quant.quant_post</code>来对训练好的分类模型进行离线量化, 该接口无需对模型进行训练就可得到量化模型,减少模型的存储空间和显存占用。</p>
<h2 id="_2">接口介绍</h2> <h2 id="_2">接口介绍<a class="headerlink" href="#_2" title="Permanent link">#</a></h2>
<p>请参考 <a href='../../../paddleslim/quant/quantization_api_doc.md'>量化API文档</a></p> <p>请参考 <a href='../../../paddleslim/quant/quantization_api_doc.md'>量化API文档</a></p>
<h2 id="_3">分类模型的离线量化流程</h2> <h2 id="_3">分类模型的离线量化流程<a class="headerlink" href="#_3" title="Permanent link">#</a></h2>
<h3 id="_4">准备数据</h3> <h3 id="_4">准备数据<a class="headerlink" href="#_4" title="Permanent link">#</a></h3>
<p>在当前文件夹下创建<code>data</code>文件夹,将<code>imagenet</code>数据集解压在<code>data</code>文件夹下,解压后<code>data</code>文件夹下应包含以下文件: <p>在当前文件夹下创建<code>data</code>文件夹,将<code>imagenet</code>数据集解压在<code>data</code>文件夹下,解压后<code>data</code>文件夹下应包含以下文件:
- <code>'train'</code>文件夹,训练图片 - <code>'train'</code>文件夹,训练图片
- <code>'train_list.txt'</code>文件 - <code>'train_list.txt'</code>文件
- <code>'val'</code>文件夹,验证图片 - <code>'val'</code>文件夹,验证图片
- <code>'val_list.txt'</code>文件</p> - <code>'val_list.txt'</code>文件</p>
<h3 id="_5">准备需要量化的模型</h3> <h3 id="_5">准备需要量化的模型<a class="headerlink" href="#_5" title="Permanent link">#</a></h3>
<p>因为离线量化接口只支持加载通过<code>fluid.io.save_inference_model</code>接口保存的模型,因此如果您的模型是通过其他接口保存的,那需要先将模型进行转化。本示例将以分类模型为例进行说明。</p> <p>因为离线量化接口只支持加载通过<code>fluid.io.save_inference_model</code>接口保存的模型,因此如果您的模型是通过其他接口保存的,那需要先将模型进行转化。本示例将以分类模型为例进行说明。</p>
<p>首先在<a href="https://github.com/PaddlePaddle/models/tree/develop/PaddleCV/image_classification#%E5%B7%B2%E5%8F%91%E5%B8%83%E6%A8%A1%E5%9E%8B%E5%8F%8A%E5%85%B6%E6%80%A7%E8%83%BD">imagenet分类模型</a>中下载训练好的<code>mobilenetv1</code>模型。</p> <p>首先在<a href="https://github.com/PaddlePaddle/models/tree/develop/PaddleCV/image_classification#%E5%B7%B2%E5%8F%91%E5%B8%83%E6%A8%A1%E5%9E%8B%E5%8F%8A%E5%85%B6%E6%80%A7%E8%83%BD">imagenet分类模型</a>中下载训练好的<code>mobilenetv1</code>模型。</p>
<p>在当前文件夹下创建<code>'pretrain'</code>文件夹,将<code>mobilenetv1</code>模型在该文件夹下解压,解压后的目录为<code>pretrain/MobileNetV1_pretrained</code></p> <p>在当前文件夹下创建<code>'pretrain'</code>文件夹,将<code>mobilenetv1</code>模型在该文件夹下解压,解压后的目录为<code>pretrain/MobileNetV1_pretrained</code></p>
<h3 id="_6">导出模型</h3> <h3 id="_6">导出模型<a class="headerlink" href="#_6" title="Permanent link">#</a></h3>
<p>通过运行以下命令可将模型转化为离线量化接口可用的模型:</p> <p>通过运行以下命令可将模型转化为离线量化接口可用的模型:</p>
<pre><code>python export_model.py --model &quot;MobileNet&quot; --pretrained_model ./pretrain/MobileNetV1_pretrained --data imagenet <div class="codehilite"><pre><span></span><span class="n">python</span> <span class="n">export_model</span><span class="p">.</span><span class="n">py</span> <span class="c1">--model &quot;MobileNet&quot; --pretrained_model ./pretrain/MobileNetV1_pretrained --data imagenet</span>
</code></pre> </pre></div>
<p>转化之后的模型存储在<code>inference_model/MobileNet/</code>文件夹下,可看到该文件夹下有<code>'model'</code>, <code>'weights'</code>两个文件。</p> <p>转化之后的模型存储在<code>inference_model/MobileNet/</code>文件夹下,可看到该文件夹下有<code>'model'</code>, <code>'weights'</code>两个文件。</p>
<h3 id="_7">离线量化</h3> <h3 id="_7">离线量化<a class="headerlink" href="#_7" title="Permanent link">#</a></h3>
<p>接下来对导出的模型文件进行离线量化,离线量化的脚本为<a href="./quant_post.py">quant_post.py</a>,脚本中使用接口<code>paddleslim.quant.quant_post</code>对模型进行离线量化。运行命令为:</p> <p>接下来对导出的模型文件进行离线量化,离线量化的脚本为<a href="./quant_post.py">quant_post.py</a>,脚本中使用接口<code>paddleslim.quant.quant_post</code>对模型进行离线量化。运行命令为:</p>
<pre><code>python quant_post.py --model_path ./inference_model/MobileNet --save_path ./quant_model_train/MobileNet --model_filename model --params_filename weights <div class="codehilite"><pre><span></span><span class="n">python</span> <span class="n">quant_post</span><span class="p">.</span><span class="n">py</span> <span class="c1">--model_path ./inference_model/MobileNet --save_path ./quant_model_train/MobileNet --model_filename model --params_filename weights</span>
</code></pre> </pre></div>
<ul> <ul>
<li><code>model_path</code>: 需要量化的模型坐在的文件夹</li> <li><code>model_path</code>: 需要量化的模型坐在的文件夹</li>
...@@ -218,23 +198,27 @@ ...@@ -218,23 +198,27 @@
<blockquote> <blockquote>
<p>使用的量化算法为<code>'KL'</code>, 使用训练集中的160张图片进行量化参数的校正。</p> <p>使用的量化算法为<code>'KL'</code>, 使用训练集中的160张图片进行量化参数的校正。</p>
</blockquote> </blockquote>
<h3 id="_8">测试精度</h3> <h3 id="_8">测试精度<a class="headerlink" href="#_8" title="Permanent link">#</a></h3>
<p>使用<a href="./eval.py">eval.py</a>脚本对量化前后的模型进行测试,得到模型的分类精度进行对比。</p> <p>使用<a href="./eval.py">eval.py</a>脚本对量化前后的模型进行测试,得到模型的分类精度进行对比。</p>
<p>首先测试量化前的模型的精度,运行以下命令:</p> <p>首先测试量化前的模型的精度,运行以下命令:</p>
<pre><code>python eval.py --model_path ./inference_model/MobileNet --model_name model --params_name weights <div class="codehilite"><pre><span></span><span class="n">python</span> <span class="n">eval</span><span class="p">.</span><span class="n">py</span> <span class="c1">--model_path ./inference_model/MobileNet --model_name model --params_name weights</span>
</code></pre> </pre></div>
<p>精度输出为:</p> <p>精度输出为:</p>
<pre><code>top1_acc/top5_acc= [0.70913923 0.89548034] <div class="codehilite"><pre><span></span><span class="n">top1_acc</span><span class="o">/</span><span class="n">top5_acc</span><span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">.</span><span class="mi">70913923</span> <span class="mi">0</span><span class="p">.</span><span class="mi">89548034</span><span class="p">]</span>
</code></pre> </pre></div>
<p>使用以下命令测试离线量化后的模型的精度:</p> <p>使用以下命令测试离线量化后的模型的精度:</p>
<pre><code>python eval.py --model_path ./quant_model_train/MobileNet <div class="codehilite"><pre><span></span><span class="n">python</span> <span class="n">eval</span><span class="p">.</span><span class="n">py</span> <span class="c1">--model_path ./quant_model_train/MobileNet</span>
</code></pre> </pre></div>
<p>精度输出为</p> <p>精度输出为</p>
<pre><code>top1_acc/top5_acc= [0.70141864 0.89086477] <div class="codehilite"><pre><span></span><span class="n">top1_acc</span><span class="o">/</span><span class="n">top5_acc</span><span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">.</span><span class="mi">70141864</span> <span class="mi">0</span><span class="p">.</span><span class="mi">89086477</span><span class="p">]</span>
</code></pre> </pre></div>
<p>从以上精度对比可以看出,对<code>mobilenet</code><code>imagenet</code>上的分类模型进行离线量化后 <code>top1</code>精度损失为<code>0.77%</code><code>top5</code>精度损失为<code>0.46%</code>. </p> <p>从以上精度对比可以看出,对<code>mobilenet</code><code>imagenet</code>上的分类模型进行离线量化后 <code>top1</code>精度损失为<code>0.77%</code><code>top5</code>精度损失为<code>0.46%</code>. </p>
...@@ -244,8 +228,10 @@ ...@@ -244,8 +228,10 @@
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../quant_aware_demo/" class="btn btn-neutral float-right" title="量化训练">Next <span class="icon icon-circle-arrow-right"></span></a>
<a href="../quant_embedding_demo/" class="btn btn-neutral" title="Embedding量化示例"><span class="icon icon-circle-arrow-left"></span> Previous</a> <a href="../.." class="btn btn-neutral" title="Home"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div> </div>
...@@ -270,15 +256,21 @@ ...@@ -270,15 +256,21 @@
<div class="rst-versions" role="note" style="cursor: pointer"> <div class="rst-versions" role="note" style="cursor: pointer">
<span class="rst-current-version" data-toggle="rst-current-version"> <span class="rst-current-version" data-toggle="rst-current-version">
<a href="https://github.com/PaddlePaddle/PaddleSlim/" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a>
<span><a href="../.." style="color: #fcfcfc;">&laquo; Previous</a></span>
<span><a href="../quant_embedding_demo/" style="color: #fcfcfc;">&laquo; Previous</a></span>
<span style="margin-left: 15px"><a href="../quant_aware_demo/" style="color: #fcfcfc">Next &raquo;</a></span>
</span> </span>
</div> </div>
<script>var base_url = '../../..';</script> <script>var base_url = '../..';</script>
<script src="../../../js/theme.js" defer></script> <script src="../../js/theme.js" defer></script>
<script src="../../../search/main.js" defer></script> <script src="../../mathjax-config.js" defer></script>
<script src="../../MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="../../search/main.js" defer></script>
</body> </body>
</html> </html>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册