<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Gaussic]]></title><description><![CDATA[Data Science & Machine Learning & Deep Learning]]></description><link>https://gaussic.com/</link><image><url>https://gaussic.com/favicon.png</url><title>Gaussic</title><link>https://gaussic.com/</link></image><generator>Ghost 4.48</generator><lastBuildDate>Thu, 18 Jun 2026 06:18:06 GMT</lastBuildDate><atom:link href="https://gaussic.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Hive实现URLEncoder和URLDecode]]></title><description><![CDATA[Hive本身不提供内建的URLEncode和URLDecode来实现url的编解码，我们可以基于编解码的原理来自己写一个UDF来实现。另一种更直接的方法是通过reflect来调用Java的URLEncode和URLDecode。]]></description><link>https://gaussic.com/hive-urlencode-urldecode/</link><guid isPermaLink="false">626558fb7d1a325e68ac2374</guid><category><![CDATA[Hive]]></category><category><![CDATA[Big Data]]></category><category><![CDATA[SQL]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Sun, 24 Apr 2022 14:15:16 GMT</pubDate><media:content url="https://gaussic.com/content/images/2022/04/hive-g7cc5e2754_1280.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://gaussic.com/content/images/2022/04/hive-g7cc5e2754_1280.png" alt="Hive&#x5B9E;&#x73B0;URLEncoder&#x548C;URLDecode"><p>Hive&#x672C;&#x8EAB;&#x4E0D;&#x63D0;&#x4F9B;&#x5185;&#x5EFA;&#x7684;URLEncode&#x548C;URLDecode&#x6765;&#x5B9E;&#x73B0;url&#x7684;&#x7F16;&#x89E3;&#x7801;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x57FA;&#x4E8E;&#x7F16;&#x89E3;&#x7801;&#x7684;&#x539F;&#x7406;&#x6765;&#x81EA;&#x5DF1;&#x5199;&#x4E00;&#x4E2A;UDF&#x6765;&#x5B9E;&#x73B0;&#x3002;</p>
<p>&#x53E6;&#x4E00;&#x79CD;&#x66F4;&#x76F4;&#x63A5;&#x7684;&#x65B9;&#x6CD5;&#x662F;&#x901A;&#x8FC7;reflect&#x6765;&#x8C03;&#x7528;Java&#x7684;URLEncode&#x548C;URLDecode&#x3002;</p>
<p>&#x793A;&#x4F8B;&#x5982;&#x4E0B;&#xFF1A;</p>
<h5 id="urlencode">URLEncode</h5>
<pre><code class="language-sql">select reflect(&quot;java.net.URLEncoder&quot;, &quot;encode&quot;,&quot;https://gaussic.com/chi2-keyword-extraction/&quot;);
</code></pre>
<p>&#x5F97;&#x5230;&#x7ED3;&#x679C;&#xFF1A;</p>
<pre><code class="language-sql">https%3A%2F%2Fgaussic.com%2Fchi2-keyword-extraction%2F
</code></pre>
<h5 id="urldecode">URLDecode</h5>
<pre><code class="language-sql">select reflect(&quot;java.net.URLDecoder&quot;, &quot;decode&quot;,&quot;https%3A%2F%2Fgaussic.com%2Fchi2-keyword-extraction%2F&quot;);
</code></pre>
<p>&#x5F97;&#x5230;&#x7ED3;&#x679C;&#xFF1A;</p>
<pre><code class="language-sql">https://gaussic.com/chi2-keyword-extraction/
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Chi2 - 高效抽取分类特征词]]></title><description><![CDATA[本文介绍使用卡方检验有效抽取行业分类关键词的方法]]></description><link>https://gaussic.com/chi2-keyword-extraction/</link><guid isPermaLink="false">6262b2e25d2e4348665021c4</guid><category><![CDATA[Python]]></category><category><![CDATA[Big Data]]></category><category><![CDATA[Data Analysis]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Wed, 21 Oct 2020 07:55:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/10/computer-1245714_1920.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://gaussic.com/content/images/2020/10/computer-1245714_1920.jpg" alt="Chi2 - &#x9AD8;&#x6548;&#x62BD;&#x53D6;&#x5206;&#x7C7B;&#x7279;&#x5F81;&#x8BCD;"><p>&#x8F6C;&#x8F7D;&#x8BF7;&#x6CE8;&#x660E;&#x51FA;&#x5904;&#xFF1A; <a href="https://gaussic.com/chi2-keyword-extraction/">https://gaussic.com/chi2-keyword-extraction/</a></p>
<p>&#x7528;&#x6734;&#x7D20;&#x8D1D;&#x53F6;&#x65AF;&#x505A;&#x6587;&#x672C;&#x5206;&#x7C7B;&#x7684;&#x539F;&#x7406;&#x662F;&#xFF0C;&#x8BA1;&#x7B97;&#x6587;&#x672C;&#x4E2D;&#x51FA;&#x73B0;&#x7684;&#x8BCD;&#x5C5E;&#x4E8E;&#x67D0;&#x4E00;&#x7C7B;&#x7684;&#x8054;&#x5408;&#x6982;&#x7387;&#x3002;</p>
<p>&#x5176;&#x4E2D;&#xFF0C;&#x4E00;&#x4E2A;&#x8BCD;&#x5728;&#x4E0D;&#x540C;&#x5206;&#x7C7B;&#x4E0B;&#x7684;&#x6982;&#x7387;&#x662F;&#x4E0D;&#x540C;&#x7684;&#xFF0C;&#x4F8B;&#x5982;&#xFF0C;&#x300C;&#x57FA;&#x91D1;&#x300D;&#x8FD9;&#x4E00;&#x8BCD;&#x5C5E;&#x4E8E;&#x300C;&#x6295;&#x8D44;&#x300D;&#x7C7B;&#x7684;&#x6982;&#x7387;&#x6BD4;&#x5C5E;&#x4E8E;&#x300C;&#x9910;&#x996E;&#x300D;&#x7C7B;&#x7684;&#x6982;&#x7387;&#x8981;&#x9AD8;&#xFF0C;&#x300C;&#x706B;&#x9505;&#x300D;&#x8FD9;&#x4E2A;&#x8BCD;&#x5219;&#x76F8;&#x53CD;&#x3002;</p>
<p>&#x90A3;&#x4E48;&#xFF0C;&#x6211;&#x4EEC;&#x662F;&#x5426;&#x53EF;&#x4EE5;&#x9884;&#x5148;&#x8BA1;&#x7B97;&#x51FA;&#x4E00;&#x4E2A;&#x5206;&#x7C7B;&#x4E0B;&#x6240;&#x6709;&#x8BCD;&#x7684;&#x6982;&#x7387;&#x5462;&#xFF1F;&#x7B54;&#x6848;&#x662F;&#xFF1A;&#x53EF;&#x4EE5;&#xFF01;</p>
<h3 id="%E8%AF%8D%E9%A2%91%E7%BB%9F%E8%AE%A1">&#x8BCD;&#x9891;&#x7EDF;&#x8BA1;</h3>
<p>&#x6211;&#x4EEC;&#x9996;&#x5148;&#x60F3;&#x5230;&#x7684;&#x662F;&#x8BCD;&#x9891;&#x3002;&#x9996;&#x5148;&#x4F7F;&#x7528;&#x5206;&#x8BCD;&#x5DE5;&#x5177;&#xFF0C;&#x5C06;&#x6587;&#x672C;&#x5207;&#x5206;&#x4E3A;&#x5408;&#x9002;&#x7684;&#x8BCD;&#x7EC4;&#x5F62;&#x5F0F;&#x3002;&#x5F53;&#x524D;&#x5DE5;&#x4E1A;&#x754C;&#x4F7F;&#x7528;&#x8F83;&#x4E3A;&#x5E7F;&#x6CDB;&#x7684;&#x662F;&#x300C;jieba&#x5206;&#x8BCD;&#x300D;&#xFF0C;&#x5B83;&#x5728;&#x4FDD;&#x969C;&#x51C6;&#x786E;&#x6027;&#x7684;&#x540C;&#x65F6;&#x4E5F;&#x80FD;&#x8FBE;&#x5230;&#x8F83;&#x5FEB;&#x7684;&#x5206;&#x8BCD;&#x901F;&#x5EA6;&#x3002;</p>
<pre><code class="language-python">import re
import jieba

def segment(sentence, cut_all=False):
    sentences = re.sub(&apos;[\n\u3000&#x3002;,&#xFF0C;&#xFF1B;\?&#xFF1F;\u00a0&#x201D;&#x201C;\(\)&#xFF08;&#xFF09;&#x3001;\-&#x2014;&#xFF1A;/&#x300A;&#x300B;&#xFF01;&#xFF5E;&#x3010;&#x3011;%\d+]&apos;, &apos; &apos;, sentence)
    sentence = [x for x in jieba.cut(sentences, cut_all=cut_all) if x != &apos; &apos;]
    return sentence
</code></pre>
<pre><code class="language-python">segment(&apos;&#x4E0A;&#x6D77;&#x661F;&#x5DF4;&#x514B;&#x5496;&#x5561;&#x7ECF;&#x8425;&#x6709;&#x9650;&#x516C;&#x53F8;&#x6DEE;&#x6D77;&#x4E2D;&#x8DEF;&#x4E94;&#x5E97;&apos;)

# &#x5206;&#x8BCD;&#x7ED3;&#x679C;&#xFF1A;
[&apos;&#x4E0A;&#x6D77;&apos;, &apos;&#x661F;&#x5DF4;&#x514B;&apos;, &apos;&#x5496;&#x5561;&apos;, &apos;&#x7ECF;&#x8425;&apos;, &apos;&#x6709;&#x9650;&#x516C;&#x53F8;&apos;, &apos;&#x6DEE;&#x6D77;&#x4E2D;&#x8DEF;&apos;, &apos;&#x4E94;&#x5E97;&apos;]
</code></pre>
<p>&#x6211;&#x4EEC;&#x4EE5;&#x300C;THUCNews &#x65B0;&#x95FB;&#x6570;&#x636E;&#x96C6;&#x300D;&#x4E3A;&#x4F8B;&#xFF0C;&#x62BD;&#x53D6;&#x8D22;&#x7ECF;&#x7C7B;5000&#x7BC7;&#x6587;&#x6863;&#xFF0C;&#x7EDF;&#x8BA1;&#x5404;&#x8BCD;&#x7684;&#x8BCD;&#x9891;&#xFF1A;</p>
<pre><code class="language-python">import os
from collections import Counter

ROOT_DIR = &apos;/Users/gaussic/data/THUCNews&apos;
category = &apos;&#x8D22;&#x7ECF;&apos;

word_cat_cnt = Counter()  # &#x8BB0;&#x5F55;&#x8BCD;&#x9891;

for i, fname in enumerate(os.listdir(os.path.join(ROOT_DIR, category)), 1):
    fname = os.path.join(ROOT_DIR, category, fname) # &#x6587;&#x4EF6;&#x540D;
    sentence = open(fname, &apos;r&apos;, encoding=&apos;utf-8&apos;, errors=&apos;ignore&apos;).read()
    word_cat_cnt.update(segment(sentence))  # &#x66F4;&#x65B0;&#x8BCD;&#x9891;
    if i == 5000:
        break
</code></pre>
<pre><code class="language-python">word_cat_cnt.most_common(30)

# &#x8F93;&#x51FA;top30&#x8BCD;
[(&apos;&#x7684;&apos;, 148410),
 (&apos;&#x57FA;&#x91D1;&apos;, 51183),
 (&apos;&#x5728;&apos;, 33436),
 (&apos;.&apos;, 30862),
 (&apos;&#x4E86;&apos;, 21543),
 (&apos;&#x5E02;&#x573A;&apos;, 20365),
 (&apos;&#x662F;&apos;, 20228),
 (&apos;&#x548C;&apos;, 18462),
 (&apos;&#x6708;&apos;, 17807),
 (&apos;&#x516C;&#x53F8;&apos;, 14630),
 (&apos;&#x4E5F;&apos;, 14405),
 (&apos;&#x5E74;&apos;, 13635),
 (&apos;&#x4E3A;&apos;, 13414),
 (&apos;&#x5C06;&apos;, 12783),
 (&apos;&#x6295;&#x8D44;&apos;, 11926),
 (&apos;&#x6709;&apos;, 11730),
 (&apos;&#x5BF9;&apos;, 11092),
 (&apos;&#x65E5;&apos;, 9663),
 (&apos;&#x4E2D;&apos;, 9377),
 (&apos;&#x671F;&#x8D27;&apos;, 9356),
 (&apos;&#x800C;&apos;, 9326),
 (&apos;&#x5143;&apos;, 8809),
 (&apos;&#x4F46;&apos;, 8460),
 (&apos;&#x4E0A;&apos;, 8081),
 (&apos;&#x4EF7;&#x683C;&apos;, 7537),
 (&apos;&#x4ECE;&apos;, 7415),
 (&apos;&#x7B49;&apos;, 6846),
 (&apos;&#x76EE;&#x524D;&apos;, 6841),
 (&apos;&#x4E0A;&#x6DA8;&apos;, 6790),
 (&apos;&#x4E2D;&#x56FD;&apos;, 6688)]
</code></pre>
<p>&#x503C;&#x5F97;&#x4E00;&#x63D0;&#x7684;&#x662F;&#xFF0C;&#x50CF;&#x300C;&#x57FA;&#x91D1;&#x3001;&#x6295;&#x8D44;&#x3001;&#x671F;&#x8D27;&#x3001;&#x4EF7;&#x683C;&#x3001;&#x4E0A;&#x6DA8;&#x300D;&#x8FD9;&#x4E9B;&#x8BCD;&#x6B63;&#x5982;&#x6211;&#x4EEC;&#x6240;&#x9884;&#x671F;&#x7684;&#x6392;&#x5728;&#x4E86;&#x524D;&#x9762;&#xFF0C;&#x5B83;&#x4EEC;&#x662F;&#x5C06;&#x4E00;&#x7BC7;&#x6587;&#x6863;&#x5212;&#x5206;&#x4E3A;&#x8D22;&#x7ECF;&#x7C7B;&#x7684;&#x91CD;&#x8981;&#x53C2;&#x8003;&#x3002;</p>
<p>&#x4F46;&#x662F;&#xFF0C;&#x50CF;&#x300C;&#x7684;&#x3001;&#x5728;&#x3001;&#x4E86;&#x3001;&#x662F;&#x3001;&#x548C;&#x300D;&#x8FD9;&#x4E9B;&#x8BCD;&#xFF0C;&#x5B83;&#x4EEC;&#x51E0;&#x4E4E;&#x51FA;&#x73B0;&#x5728;&#x6240;&#x6709;&#x7C7B;&#x578B;&#x7684;&#x6587;&#x7AE0;&#x4E2D;&#xFF0C;&#x5BF9;&#x5206;&#x7C7B;&#x4E0D;&#x63D0;&#x4F9B;&#x4EFB;&#x4F55;&#x7684;&#x53C2;&#x8003;&#x4EF7;&#x503C;&#xFF0C;&#x751A;&#x81F3;&#x4F1A;&#x5BF9;&#x673A;&#x5668;&#x5206;&#x7C7B;&#x4EA7;&#x751F;&#x6781;&#x5927;&#x7684;&#x5E72;&#x6270;&#x3002;</p>
<p>&#x89E3;&#x51B3;&#x8FD9;&#x4E00;&#x95EE;&#x9898;&#x7684;&#x4E00;&#x79CD;&#x65B9;&#x6CD5;&#x662F;&#x7EF4;&#x62A4;&#x4E00;&#x5F20;&#x8FC7;&#x6EE4;&#x8BCD;&#x8868;&#xFF0C;&#x628A;&#x4E0D;&#x9700;&#x8981;&#x7684;&#x8BCD;&#x4ECE;&#x8BCD;&#x9891;&#x6392;&#x5E8F;&#x4E2D;&#x8FC7;&#x6EE4;&#x6389;&#xFF0C;&#x81EA;&#x7136;&#x8BED;&#x8A00;&#x5904;&#x7406;&#x79F0;&#x5B83;&#x4EEC;&#x4E3A;&#x300C;&#x505C;&#x7528;&#x8BCD;&#x300D;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x968F;&#x7740;&#x6570;&#x636E;&#x91CF;&#x7684;&#x589E;&#x5927;&#xFF0C;&#x6240;&#x9700;&#x8981;&#x8FC7;&#x6EE4;&#x7684;&#x8BCD;&#x4F1A;&#x8D8A;&#x6765;&#x8D8A;&#x591A;&#xFF0C;&#x4EBA;&#x5DE5;&#x5E72;&#x9884;&#x7684;&#x6210;&#x672C;&#x4F1A;&#x8D8A;&#x6765;&#x8D8A;&#x9AD8;&#xFF0C;&#x663E;&#x7136;&#x4E0D;&#x5229;&#x4E8E;&#x540E;&#x671F;&#x7684;&#x7EF4;&#x62A4;&#x3002;</p>
<h3 id="tf-idf%E5%85%B3%E9%94%AE%E8%AF%8D%E6%8A%BD%E5%8F%96">TF-IDF&#x5173;&#x952E;&#x8BCD;&#x62BD;&#x53D6;</h3>
<p>&#x53E6;&#x4E00;&#x79CD;&#x65B9;&#x6CD5;&#xFF0C;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x901A;&#x5E38;&#x4F7F;&#x7528;&#x5230;&#x7684;TF-IDF&#x5173;&#x952E;&#x8BCD;&#x62BD;&#x53D6;&#x7B97;&#x6CD5;&#x3002;&#x5B83;&#x7684;&#x539F;&#x7406;&#x5F88;&#x7B80;&#x5355;&#xFF1A;</p>
<ul>
<li>&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x8BCD;&#x5728;&#x67D0;&#x4E2A;&#x5206;&#x7C7B;&#x4E0B;&#x51FA;&#x73B0;&#x7684;&#x9891;&#x7387;&#x5F88;&#x9AD8;&#xFF0C;&#x540C;&#x65F6;&#x5728;&#x6240;&#x6709;&#x6587;&#x6863;&#x51FA;&#x73B0;&#x7684;&#x9891;&#x7387;&#x4E5F;&#x5F88;&#x9AD8;&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x4E2A;&#x8BCD;&#x5927;&#x6982;&#x7387;&#x662F;&#x6CA1;&#x6709;&#x610F;&#x4E49;&#x7684;&#xFF0C;&#x6B63;&#x5982;&#x524D;&#x9762;&#x51FA;&#x73B0;&#x7684;&#x300C;&#x7684;&#x3001;&#x5728;&#x3001;&#x4E86;&#x300D;&#x7B49;&#xFF1B;</li>
<li>&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x8BCD;&#x5728;&#x67D0;&#x4E2A;&#x5206;&#x7C7B;&#x4E0B;&#x51FA;&#x73B0;&#x7684;&#x9891;&#x7387;&#x5F88;&#x9AD8;&#xFF0C;&#x800C;&#x5728;&#x5176;&#x4ED6;&#x7C7B;&#x4E2D;&#x51FA;&#x73B0;&#x7684;&#x9891;&#x7387;&#x5F88;&#x4F4E;&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x4E2A;&#x8BCD;&#x5BF9;&#x4E8E;&#x8FD9;&#x4E2A;&#x884C;&#x4E1A;&#x5F88;&#x5173;&#x952E;&#xFF0C;&#x5982;&#x300C;&#x8D22;&#x7ECF;&#x300D;&#x7C7B;&#x4E2D;&#x7684;&#x300C;&#x57FA;&#x91D1;&#x3001;&#x6295;&#x8D44;&#x300D;&#xFF0C;&#x300C;&#x4F53;&#x80B2;&#x300D;&#x7C7B;&#x4E2D;&#x7684;&#x300C;&#x7BEE;&#x7403;&#x3001;&#x6BD4;&#x8D5B;&#x300D;&#x7B49;&#xFF1B;</li>
<li>&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x8BCD;&#x5728;&#x6240;&#x6709;&#x7684;&#x5206;&#x7C7B;&#x4E0B;&#x51FA;&#x73B0;&#x7684;&#x9891;&#x7387;&#x90FD;&#x5F88;&#x4F4E;&#xFF0C;&#x90A3;&#x4E48;&#x5B83;&#x4E3A;&#x5206;&#x7C7B;&#x5E26;&#x6765;&#x7684;&#x53C2;&#x8003;&#x4EF7;&#x503C;&#x4E0D;&#x5927;&#xFF0C;&#x53EF;&#x4EE5;&#x9002;&#x5F53;&#x5254;&#x9664;&#xFF0C;&#x5982;&#x751F;&#x50FB;&#x8BCD;&#x3001;&#x4E2A;&#x522B;&#x4EBA;&#x540D;&#x7B49;&#x3002;</li>
</ul>
<p>&#x6709;&#x5173;TF-IDF&#x7684;&#x539F;&#x7406;&#x4E0E;&#x5B9E;&#x73B0;&#x53EF;&#x4EE5;&#x770B;&#x8FD9;&#x7BC7;&#xFF1A;<a href="https://gaussic.com/tf-idf-keyword/">&#x57FA;&#x4E8E;&#x7279;&#x5B9A;&#x8BED;&#x6599;&#x5E93;&#x7684; TF-IDF &#x5173;&#x952E;&#x8BCD;&#x63D0;&#x53D6;&#x5B9E;&#x73B0;</a></p>
<p>&#x663E;&#x800C;&#x6613;&#x89C1;&#x7684;&#xFF0C;&#x8FD9;&#x4E00;&#x7ED3;&#x679C;&#x76F8;&#x6BD4;&#x8BCD;&#x9891;&#x7EDF;&#x8BA1;&#x6709;&#x4E86;&#x6781;&#x5927;&#x7684;&#x63D0;&#x5347;&#x3002;&#x9996;&#x5148;&#xFF0C;&#x505C;&#x7528;&#x8BCD;&#x95EE;&#x9898;&#x5F97;&#x5230;&#x4E86;&#x6781;&#x5927;&#x7A0B;&#x5EA6;&#x7684;&#x89E3;&#x51B3;&#x3002;&#x5176;&#x6B21;&#xFF0C;&#x4E00;&#x4E9B;&#x4F4E;&#x9891;&#x8BCD;&#x7684;&#x6743;&#x91CD;&#x5F97;&#x5230;&#x4E86;&#x63D0;&#x5347;&#xFF0C;&#x5982;&#x300C;ETF&#x3001;QDII&#x3001;A&#x80A1;&#x300D;&#x4E09;&#x4E2A;&#x8BCD;&#x9891;&#x8F83;&#x4F4E;&#x4F46;&#x975E;&#x5E38;&#x660E;&#x663E;&#x7684;&#x8D22;&#x7ECF;&#x7C7B;&#x8BCD;&#x3002;</p>
<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x90E8;&#x5206;&#x8BCD;&#x53EF;&#x4EE5;&#x540C;&#x65F6;&#x662F;&#x5176;&#x4ED6;&#x5206;&#x7C7B;&#x4E0B;&#x7684;&#x5173;&#x952E;&#x8BCD;&#xFF0C;&#x5982;&#x300C;&#x516C;&#x53F8;&#x3001;&#x5428;&#x3001;&#x5143;&#x3001;&#x7ECF;&#x7406;&#x3001;&#x5408;&#x7EA6;&#x3001;&#x5927;&#x8C46;&#x300D;&#x7B49;&#x3002;&#x5355;&#x7EAF;&#x5C06;&#x5B83;&#x4EEC;&#x89C6;&#x4F5C;&#x67D0;&#x4E00;&#x884C;&#x4E1A;&#x7684;&#x5173;&#x952E;&#x8BCD;&#x5BB9;&#x6613;&#x9020;&#x6210;&#x5206;&#x7C7B;&#x7684;&#x6DF7;&#x6DC6;&#x3002;&#x9700;&#x8981;&#x9002;&#x5F53;&#x964D;&#x4F4E;&#x5B83;&#x4EEC;&#x7684;&#x6743;&#x91CD;&#x3002;</p>
<h3 id="chi2%E5%8D%A1%E6%96%B9%E6%A3%80%E9%AA%8C">Chi2 - &#x5361;&#x65B9;&#x68C0;&#x9A8C;</h3>
<p>&#x5361;&#x65B9;&#x68C0;&#x9A8C;&#x7684;&#x672C;&#x8D28;&#xFF0C;&#x662F;&#x68C0;&#x9A8C;&#x4E24;&#x4E2A;&#x53D8;&#x91CF;&#x4E4B;&#x95F4;&#x6709;&#x6CA1;&#x6709;&#x5173;&#x7CFB;&#x3002;</p>
<p>&#x5728;&#x6587;&#x672C;&#x5206;&#x7C7B;&#x7684;&#x7279;&#x5F81;&#x9009;&#x62E9;&#x9636;&#x6BB5;&#xFF0C;&#x4E00;&#x822C;&#x4F7F;&#x7528;&#x300C;&#x8BCD;t&#x4E0E;&#x7C7B;&#x522B;c&#x4E0D;&#x76F8;&#x5173;&#x300D;&#x6765;&#x505A;&#x539F;&#x5047;&#x8BBE;&#xFF0C;&#x8BA1;&#x7B97;&#x51FA;&#x7684;&#x5361;&#x65B9;&#x503C;&#x8D8A;&#x5927;&#xFF0C;&#x8BF4;&#x660E;&#x5BF9;&#x539F;&#x5047;&#x8BBE;&#x7684;&#x504F;&#x79BB;&#x8D8A;&#x5927;&#xFF0C;&#x6211;&#x4EEC;&#x8D8A;&#x503E;&#x5411;&#x4E8E;&#x8BA4;&#x4E3A;&#x539F;&#x5047;&#x8BBE;&#x7684;&#x53CD;&#x9762;&#x60C5;&#x51B5;&#x662F;&#x6B63;&#x786E;&#x7684;&#x3002;</p>
<p>&#x9009;&#x62E9;&#x7684;&#x8FC7;&#x7A0B;&#x4E3A;&#x6BCF;&#x4E2A;&#x8BCD;&#x8BA1;&#x7B97;&#x5B83;&#x4E0E;&#x7C7B;&#x522B;c&#x7684;&#x5F00;&#x65B9;&#x503C;&#xFF0C;&#x4ECE;&#x5927;&#x5230;&#x5C0F;&#x6392;&#x4E2A;&#x5E8F;&#xFF0C;&#x53D6;&#x524D;k&#x4E2A;&#x5373;&#x53EF;&#x3002;</p>
<p>&#x4EE5;&#x4E0A;&#x9762;&#x7684;&#x300C;&#x57FA;&#x91D1;&#x300D;&#x4E3A;&#x4F8B;&#xFF0C;&#x6211;&#x4EEC;&#x8003;&#x8651;&#x5B83;&#x4E0E;&#x300C;&#x8D22;&#x7ECF;&#x300D;&#x7C7B;&#x7684;&#x76F8;&#x5173;&#x6027;&#x3002;</p>
<table>
<thead>
<tr>
<th></th>
<th>1. &#x5C5E;&#x4E8E;&#x300C;&#x8D22;&#x7ECF;&#x300D;&#x7C7B;</th>
<th>2. &#x4E0D;&#x5C5E;&#x4E8E;&#x300C;&#x8D22;&#x7ECF;&#x300D;&#x7C7B;</th>
</tr>
</thead>
<tbody>
<tr>
<td>1. &#x5305;&#x542B;&#x300C;&#x57FA;&#x91D1;&#x300D;</td>
<td>5356 (A)</td>
<td>2500 (B)</td>
</tr>
<tr>
<td>2. &#x4E0D;&#x5305;&#x542B;&#x300C;&#x57FA;&#x91D1;&#x300D;</td>
<td>4644 (C)</td>
<td>127500 (D)</td>
</tr>
</tbody>
</table>
<p>&#x57FA;&#x4E8E;&#x539F;&#x5047;&#x8BBE;&#xFF0C;&#x300C;&#x8D22;&#x7ECF;&#x300D;&#x7C7B;&#x6587;&#x7AE0;&#x4E2D;&#x5305;&#x542B;&#x300C;&#x57FA;&#x91D1;&#x300D;&#x8FD9;&#x4E00;&#x8BCD;&#x7684;&#x6BD4;&#x4F8B;&#x5E94;&#x8BE5;&#x4E0E;&#x6240;&#x6709;&#x6587;&#x6863;&#x4E2D;&#x5305;&#x542B;&#x300C;&#x57FA;&#x91D1;&#x300D;&#x7684;&#x6BD4;&#x4F8B;&#x76F8;&#x540C;&#xFF0C;&#x56E0;&#x6B64;&#xFF0C;A&#x7684;&#x7406;&#x8BBA;&#x503C;&#x5E94;&#x4E3A;&#xFF1A;</p>
<p>$$<br>
E_{11} = (A+C)\frac{A+B}{N}<br>
$$</p>
<p>&#x5B9E;&#x9645;&#x503C;&#x4E0E;&#x7406;&#x8BBA;&#x503C;&#x7684;&#x5DEE;&#x503C;&#x4E3A;&#xFF1A;</p>
<p>$$<br>
D_{11} = \frac{(A-E_{11})^2}{E_{11}}<br>
$$</p>
<p>&#x5206;&#x522B;&#x8BA1;&#x7B97;&#x8868;&#x683C;&#x4E2D;4&#x79CD;&#x60C5;&#x51B5;&#x7684;&#x5DEE;&#x503C; $D_{11}, D_{12}, D_{21}, D_{22}$ &#xFF0C;&#x6C42;&#x548C;&#x5373;&#x4E3A;&#x300C;&#x57FA;&#x91D1;&#x300D;&#x4E0E;&#x300C;&#x8D22;&#x7ECF;&#x300D;&#x7C7B;&#x6587;&#x7AE0;&#x7684;&#x5361;&#x65B9;&#x7ED3;&#x679C;&#xFF1A;</p>
<p>$$<br>
\chi^2{(&#x57FA;&#x91D1;, &#x8D22;&#x7ECF;)} = \frac{N(AD-BC)^2}{(A+B)(C+D)(A+C)(B+D)}<br>
$$</p>
<p>&#x5176;&#x4E2D;&#xFF0C;N &#x662F;&#x603B;&#x6587;&#x6863;&#x6570;&#xFF0C;A+C &#x548C; B+D &#x5BF9;&#x5E94;&#x8D22;&#x7ECF;&#x7C7B;&#x548C;&#x975E;&#x8D22;&#x7ECF;&#x7C7B;&#x7684;&#x6587;&#x6863;&#x6570;&#xFF0C;&#x5728;&#x8BA1;&#x7B97;&#x67D0;&#x4E2A;&#x8BCD;&#x5C5E;&#x4E8E;&#x67D0;&#x4E2A;&#x7C7B;&#x522B;&#x65F6;&#xFF0C;&#x5B83;&#x4EEC;&#x662F;&#x56FA;&#x5B9A;&#x503C;&#xFF0C;&#x53EF;&#x4EE5;&#x5FFD;&#x7565;&#x3002;</p>
<p>&#x56E0;&#x6B64;&#x7ED3;&#x679C;&#x7B80;&#x5316;&#x4E3A;&#xFF1A;</p>
<p>$$<br>
\chi^2{(&#x57FA;&#x91D1;, &#x8D22;&#x7ECF;)} = \frac{(AD-BC)^2}{(A+B)(C+D)}<br>
$$</p>
<p>&#x53EF;&#x89C1;&#xFF0C;&#x5F53;$(AD-BC)^2$&#x8D8A;&#x5927;&#xFF0C;$\chi^2$&#x4E5F;&#x8D8A;&#x5927;&#xFF0C;&#x5F53;&#x524D;&#x8BCD;&#x8D8A;&#x6709;&#x53EF;&#x80FD;&#x5C5E;&#x4E8E;&#x5F53;&#x524D;&#x7C7B;&#x522B;&#x7684;&#x5173;&#x952E;&#x8BCD;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x7EE7;&#x7EED;&#x4F7F;&#x7528;&#x300C;THUCNews&#x300D;&#x5B9E;&#x64CD;&#x4E00;&#x4E0B;&#x3002;</p>
<p>&#x9996;&#x5148;&#xFF0C;&#x4ECE;&#x6BCF;&#x4E2A;&#x7C7B;&#x522B;&#x8F7D;&#x5165;5000&#x7BC7;&#x6587;&#x6863;&#xFF0C;&#x5E76;&#x7EDF;&#x8BA1;&#x4EE5;&#x4E0B;&#x4E09;&#x4E2A;&#x503C;&#xFF1A;</p>
<pre><code class="language-python">from collections import defaultdict, Counter

categories = [&apos;&#x65F6;&#x5C1A;&apos;, &apos;&#x5BB6;&#x5C45;&apos;, &apos;&#x6559;&#x80B2;&apos;, &apos;&#x80A1;&#x7968;&apos;, &apos;&#x5A31;&#x4E50;&apos;, &apos;&#x5F69;&#x7968;&apos;, &apos;&#x793E;&#x4F1A;&apos;, 
              &apos;&#x623F;&#x4EA7;&apos;, &apos;&#x661F;&#x5EA7;&apos;, &apos;&#x79D1;&#x6280;&apos;, &apos;&#x8D22;&#x7ECF;&apos;, &apos;&#x65F6;&#x653F;&apos;, &apos;&#x6E38;&#x620F;&apos;, &apos;&#x4F53;&#x80B2;&apos;]

doc_cat_cnt = defaultdict(int)       # &#x6BCF;&#x7C7B;&#x6587;&#x6863;&#x6570;
word_tot_cnt = Counter()             # &#x6BCF;&#x4E2A;&#x8BCD;&#x51FA;&#x73B0;&#x7684;&#x6587;&#x6863;&#x6570;
word_cat_cnt = defaultdict(Counter)  # &#x6BCF;&#x4E2A;&#x8BCD;&#x5728;&#x6BCF;&#x4E2A;&#x5206;&#x7C7B;&#x4E0B;&#x51FA;&#x73B0;&#x7684;&#x6587;&#x6863;&#x6570;
for cat in categories:
    for fname in os.listdir(os.path.join(ROOT_DIR, cat))[:5000]:
        doc = open(os.path.join(ROOT_DIR, cat, fname), &apos;r&apos;, encoding=&apos;utf-8&apos;, errors=&apos;ignore&apos;).read()
        doc = set(segment(doc))  # &#x6CE8;&#x610F;&#xFF0C;&#x5728;chi2&#x4E2D;&#xFF0C;&#x6BCF;&#x4E2A;&#x8BCD;&#x5728;&#x6BCF;&#x4E2A;&#x6587;&#x6863;&#x4E2D;&#x53EA;&#x7EDF;&#x8BA1;&#x4E00;&#x6B21;
        word_tot_cnt.update(doc)
        word_cat_cnt[cat].update(doc)
        doc_cat_cnt[cat] += 1
</code></pre>
<p>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x4F7F;&#x7528;pandas&#x6765;&#x6279;&#x91CF;&#x8BA1;&#x7B97;&#x5361;&#x65B9;&#x503C;&#xFF1A;</p>
<pre><code class="language-python">import pandas as pd
import numpy as np

# &#x8BCD;-&#x6587;&#x6863;&#x6570;
word_tot_df = pd.DataFrame(list(word_tot_cnt.items()), columns=[&apos;word&apos;, &apos;tot_freq&apos;])  

# &#x8BCD;-&#x5206;&#x7C7B;-&#x6587;&#x6863;&#x6570;
word_cat_df = []
for cat in categories:
    cur_cat_df = pd.DataFrame(list(word_cat_cnt[cat].items()), columns=[&apos;word&apos;, &apos;cat_freq&apos;])
    cur_cat_df[&apos;cat&apos;] = cat
    word_cat_df.append(cur_cat_df)
word_cat_df = pd.concat(word_cat_df, ignore_index=True)

# &#x53CC;&#x8868;&#x8FDE;&#x63A5;
word_cat_df = word_cat_df.merge(word_tot_df, on=[&apos;word&apos;], how=&apos;inner&apos;)
word_cat_df[&apos;doc_cnt&apos;] = word_cat_df[&apos;cat&apos;].map(doc_cat_cnt)
</code></pre>
<pre><code class="language-python">word_cat_df[word_cat_df[&apos;word&apos;]==&apos;&#x57FA;&#x91D1;&apos;]
</code></pre>
<table>
<thead>
<tr>
<th></th>
<th>word</th>
<th>cat_freq</th>
<th>cat</th>
<th>tot_freq</th>
<th>doc_cnt</th>
</tr>
</thead>
<tbody>
<tr>
<td>164871</td>
<td>&#x57FA;&#x91D1;</td>
<td>6</td>
<td>&#x65F6;&#x5C1A;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164872</td>
<td>&#x57FA;&#x91D1;</td>
<td>36</td>
<td>&#x5BB6;&#x5C45;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164873</td>
<td>&#x57FA;&#x91D1;</td>
<td>56</td>
<td>&#x6559;&#x80B2;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164874</td>
<td>&#x57FA;&#x91D1;</td>
<td>593</td>
<td>&#x80A1;&#x7968;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164875</td>
<td>&#x57FA;&#x91D1;</td>
<td>90</td>
<td>&#x5A31;&#x4E50;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164876</td>
<td>&#x57FA;&#x91D1;</td>
<td>82</td>
<td>&#x5F69;&#x7968;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164877</td>
<td>&#x57FA;&#x91D1;</td>
<td>40</td>
<td>&#x793E;&#x4F1A;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164878</td>
<td>&#x57FA;&#x91D1;</td>
<td>120</td>
<td>&#x623F;&#x4EA7;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164879</td>
<td>&#x57FA;&#x91D1;</td>
<td>11</td>
<td>&#x661F;&#x5EA7;</td>
<td>3974</td>
<td>3578</td>
</tr>
<tr>
<td>164880</td>
<td>&#x57FA;&#x91D1;</td>
<td>109</td>
<td>&#x79D1;&#x6280;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164881</td>
<td>&#x57FA;&#x91D1;</td>
<td>2707</td>
<td>&#x8D22;&#x7ECF;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164882</td>
<td>&#x57FA;&#x91D1;</td>
<td>63</td>
<td>&#x65F6;&#x653F;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164883</td>
<td>&#x57FA;&#x91D1;</td>
<td>44</td>
<td>&#x6E38;&#x620F;</td>
<td>3974</td>
<td>5000</td>
</tr>
<tr>
<td>164884</td>
<td>&#x57FA;&#x91D1;</td>
<td>17</td>
<td>&#x4F53;&#x80B2;</td>
<td>3974</td>
<td>5000</td>
</tr>
</tbody>
</table>
<pre><code class="language-python">N = sum(doc_cat_cnt.values()) # &#x603B;&#x6587;&#x6863;&#x6570;

def get_chi2(x):
    A = x[&apos;cat_freq&apos;]
    B = x[&apos;tot_freq&apos;] - x[&apos;cat_freq&apos;]
    C = x[&apos;doc_cnt&apos;] - x[&apos;cat_freq&apos;]
    D = N - x[&apos;tot_freq&apos;] - x[&apos;doc_cnt&apos;] + x[&apos;cat_freq&apos;]
    return  np.round((A*D - B*C)**2 / (A+B) / (C+D), 4)

# &#x8BA1;&#x7B97;chi2&#x503C;
word_cat_df[&apos;chi2&apos;] = word_cat_df.apply(get_chi2, axis=1)

# chi2&#x539F;&#x59CB;&#x503C;&#x8F83;&#x5927;&#xFF0C;&#x53EF;&#x4F7F;&#x7528;min-max&#x9010;&#x884C;&#x4E1A;&#x5F52;&#x4E00;&#x5316;
cat_max = dict(word_cat_df.groupby(&apos;cat&apos;)[&apos;chi2&apos;].max())
cat_min = dict(word_cat_df.groupby(&apos;cat&apos;)[&apos;chi2&apos;].min())

def get_chi2_norm(x):
    return np.round((x[&apos;chi2&apos;] - cat_min[x[&apos;cat&apos;]]) / (cat_max[x[&apos;cat&apos;]] - cat_min[x[&apos;cat&apos;]]), 4)

# &#x8BA1;&#x7B97;chi2_norm&#x503C;
word_cat_df[&apos;chi2_norm&apos;] = word_cat_df.apply(get_chi2_norm, axis=1)

# &#x6309;&#x7167;&#x884C;&#x4E1A;&#x548C;chi2&#x9006;&#x5E8F;&#x6392;&#x5217;
word_cat_df.sort_values(by=[&apos;cat&apos;, &apos;chi2&apos;], ascending=False, inplace=True)
</code></pre>
<p>&#x8F93;&#x51FA;4&#x7C7B;&#x65B0;&#x95FB;&#x7684;TOP20&#x5173;&#x952E;&#x8BCD;:</p>
<p><img src="https://gaussic.com/content/images/2020/10/chi2-screen1.png" alt="Chi2 - &#x9AD8;&#x6548;&#x62BD;&#x53D6;&#x5206;&#x7C7B;&#x7279;&#x5F81;&#x8BCD;" loading="lazy"><br>
<img src="https://gaussic.com/content/images/2020/10/chi2_screen3.png" alt="Chi2 - &#x9AD8;&#x6548;&#x62BD;&#x53D6;&#x5206;&#x7C7B;&#x7279;&#x5F81;&#x8BCD;" loading="lazy"><br>
<img src="https://gaussic.com/content/images/2020/10/chi2_screen4.png" alt="Chi2 - &#x9AD8;&#x6548;&#x62BD;&#x53D6;&#x5206;&#x7C7B;&#x7279;&#x5F81;&#x8BCD;" loading="lazy"><br>
<img src="https://gaussic.com/content/images/2020/10/chi2_screen2.png" alt="Chi2 - &#x9AD8;&#x6548;&#x62BD;&#x53D6;&#x5206;&#x7C7B;&#x7279;&#x5F81;&#x8BCD;" loading="lazy"></p>
<p>&#x76F8;&#x6BD4;TF-IDF&#xFF0C;Chi2&#x5361;&#x65B9;&#x68C0;&#x9A8C;&#x66F4;&#x5927;&#x7A0B;&#x5EA6;&#x7684;&#x8F83;&#x4F4E;&#x4E86;&#x7C7B;&#x522B;&#x6DF7;&#x6DC6;&#x8BCD;&#x7684;&#x6743;&#x91CD;&#xFF0C;&#x5E76;&#x4E14;&#x4E00;&#x4E9B;&#x6574;&#x4F53;&#x8BCD;&#x9891;&#x8F83;&#x4F4E;&#x4F46;&#x5728;&#x5F53;&#x524D;&#x884C;&#x4E1A;&#x51FA;&#x73B0;&#x6B21;&#x6570;&#x8F83;&#x9AD8;&#x7684;&#x8BCD;&#x7684;&#x6743;&#x91CD;&#x5F97;&#x5230;&#x4E86;&#x63D0;&#x5347;&#xFF0C;&#x8FD9;&#x4F7F;&#x6211;&#x4EEC;&#x66F4;&#x5BB9;&#x6613;&#x53D1;&#x73B0;&#x4E00;&#x4E9B;&#x5206;&#x7C7B;&#x4E2D;&#x7684;&#x65B0;&#x8BCD;&#x3002;</p>
<p>&#x503C;&#x5F97;&#x4E00;&#x63D0;&#x7684;&#x662F;&#xFF0C;&#x7531;&#x4E8E;Chi2&#x53EA;&#x7EDF;&#x8BA1;&#x8BCD;&#x6240;&#x51FA;&#x73B0;&#x7684;&#x6587;&#x6863;&#x6570;&#xFF0C;&#x800C;&#x4E0D;&#x8003;&#x8651;&#x5728;&#x6BCF;&#x4E00;&#x7BC7;&#x6587;&#x6863;&#x4E2D;&#x51FA;&#x73B0;&#x7684;&#x6B21;&#x6570;&#xFF0C;&#x8FD9;&#x53EF;&#x80FD;&#x4F1A;&#x5C06;&#x4F4E;&#x9891;&#x8BCD;&#x7684;&#x6743;&#x91CD;&#x8FC7;&#x5EA6;&#x653E;&#x5927;&#xFF0C;&#x5F71;&#x54CD;&#x5BF9;&#x9AD8;&#x9891;&#x8BCD;&#x7684;&#x5224;&#x65AD;&#x3002;</p>
<p>&#x5F53;&#x7136;&#xFF0C;&#x5728;&#x4E00;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x5982;&#x77ED;&#x6587;&#x672C;&#x5206;&#x7C7B;&#xFF0C;Chi2&#x7684;&#x4F4E;&#x9891;&#x8BCD;&#x7F3A;&#x9677;&#x95EE;&#x9898;&#x4FBF;&#x4E0D;&#x590D;&#x5B58;&#x5728;&#x3002;</p>
<p>&#x4F8B;&#x5982;&#x5546;&#x6237;&#x540D;&#x79F0;&#x5206;&#x6790;&#xFF0C;&#x5982;&#x4F55;&#x4ECE;&#x591A;&#x4E2A;&#x884C;&#x4E1A;&#x7684;&#x5343;&#x4E07;&#x7EA7;&#x5546;&#x6237;&#x540D;&#x5F55;&#x4E2D;&#xFF0C;&#x62BD;&#x53D6;&#x5404;&#x4E2A;&#x884C;&#x4E1A;&#x7684;&#x5173;&#x952E;&#x8BCD;&#xFF0C;Chi2&#x4E0D;&#x5931;&#x4E3A;&#x4E00;&#x79CD;&#x53CA;&#x5176;&#x6709;&#x6548;&#x7684;&#x65B9;&#x6CD5;&#x3002;</p>
<p>&#x5728;&#x62BD;&#x53D6;&#x5B8C;&#x5546;&#x6237;&#x5173;&#x952E;&#x8BCD;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x5546;&#x6237;&#x884C;&#x4E1A;&#x8FDB;&#x4E00;&#x6B65;&#x7EC6;&#x5206;&#xFF0C;&#x5982;&#x9910;&#x996E;&#x7EE7;&#x7EED;&#x5212;&#x5206;&#x4E3A;&#x706B;&#x9505;&#x3001;&#x751C;&#x54C1;&#x3001;&#x996E;&#x54C1;&#x3001;&#x4E2D;&#x9910;&#x3001;&#x897F;&#x9910;&#x7B49;&#x7B49;&#xFF0C;&#x751A;&#x81F3;&#x53EF;&#x4EE5;&#x6316;&#x6398;&#x51FA;&#x5927;&#x91CF;&#x7684;&#x54C1;&#x724C;&#x540D;&#x79F0;&#x3002;</p>
<p>&#x8BD5;&#x60F3;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x62E5;&#x6709;&#x5927;&#x91CF;&#x7684;&#x5BA2;&#x6237;&#x4EA4;&#x6613;&#x6570;&#x636E;&#xFF0C;&#x4F7F;&#x7528;&#x884C;&#x4E1A;&#x5173;&#x952E;&#x8BCD;&#x62BD;&#x53D6;&#x65B9;&#x6CD5;&#x5BF9;&#x5BA2;&#x6237;&#x7684;&#x4EA4;&#x6613;&#x5546;&#x6237;&#x4FE1;&#x606F;&#x8FDB;&#x884C;&#x7EC6;&#x5206;&#x540E;&#xFF0C;&#x662F;&#x5426;&#x5C31;&#x80FD;&#x5145;&#x5206;&#x6316;&#x6398;&#x5230;&#x5BA2;&#x6237;&#x7684;&#x6D88;&#x8D39;&#x504F;&#x597D;&#xFF0C;&#x800C;&#x8FDB;&#x884C;&#x66F4;&#x52A0;&#x5B9A;&#x5236;&#x5316;&#x7684;&#x63A8;&#x8350;&#x5462;&#xFF1F;</p>
<p>&#x7B54;&#x6848;&#x662F;&#x4E0D;&#x8A00;&#x800C;&#x55BB;&#x7684;&#x3002;</p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x6CE8;&#x660E;&#x51FA;&#x5904;&#xFF1A; <a href="https://gaussic.com/chi2-keyword-extraction/">https://gaussic.com/chi2-keyword-extraction/</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[WGS84 / BD09 / GCJ02 / MapBar 经纬度坐标互转]]></title><description><![CDATA[Geolocataion conversion between WGS84, BD09 and GCJ02.

WGS84 / BD09 / GCJ02 / MapBar 经纬度坐标互转。]]></description><link>https://gaussic.com/geo-conversion/</link><guid isPermaLink="false">6262acd75d2e43486650209b</guid><category><![CDATA[LBS]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Thu, 09 May 2019 04:17:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/map-of-the-world-2401458_1280.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/map-of-the-world-2401458_1280.jpg" alt="WGS84 / BD09 / GCJ02 / MapBar &#x7ECF;&#x7EAC;&#x5EA6;&#x5750;&#x6807;&#x4E92;&#x8F6C;"><p>Geolocataion conversion between WGS84, BD09 and GCJ02.</p>
<p>WGS84 / BD09 / GCJ02 / MapBar &#x7ECF;&#x7EAC;&#x5EA6;&#x5750;&#x6807;&#x4E92;&#x8F6C;&#x3002;</p>
<ul>
<li>WGS84: GPS coordinates for Google Earth (GPS &#x5750;&#x6807;&#xFF0C;&#x8C37;&#x6B4C;&#x5730;&#x7403;&#x4F7F;&#x7528;)</li>
<li>GCJ02: national coordinate system developed by China (&#x56FD;&#x6D4B;&#x5C40;&#x5750;&#x6807;&#xFF0C;&#x8C37;&#x6B4C;&#x4E2D;&#x56FD;&#x5730;&#x56FE;&#x3001;&#x817E;&#x8BAF;&#x5730;&#x56FE;&#x3001;&#x9AD8;&#x5FB7;&#x5730;&#x56FE;&#x4F7F;&#x7528;)</li>
<li>BD09: Baidu coordinates (&#x767E;&#x5EA6;&#x5750;&#x6807;&#x7CFB;&#xFF0C;&#x767E;&#x5EA6;&#x5730;&#x56FE;&#x4F7F;&#x7528;)</li>
<li>MapBar: MapBar coordinates (&#x56FE;&#x5427;&#x5750;&#x6807;&#x7CFB;&#xFF0C;&#x56FE;&#x5427;&#x5730;&#x56FE;&#x4F7F;&#x7528;)</li>
</ul>
<!-- -->
<p>Test website: <a href="http://gpsspg.com/maps.htm">http://gpsspg.com/maps.htm</a></p>
<p>Author: Gaussic</p>
<p>Date: 2019-05-09</p>
<p>Github &#x94FE;&#x63A5;&#xFF1A;<a href="https://github.com/gaussic/geo_convert/blob/master/converter.py">gaussic/geo_convert</a></p>
<p>&#x5168;&#x90E8;&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code class="language-python"># coding: utf-8

&quot;&quot;&quot;
Geolocataion converting between WGS84, BD09 and GCJ02.
WGS84 / BD09 / GCJ02 / MapBar &#x7ECF;&#x7EAC;&#x5EA6;&#x5750;&#x6807;&#x4E92;&#x8F6C;&#x3002;
- WGS84: GPS coordinates for Google Earth (GPS &#x5750;&#x6807;&#xFF0C;&#x8C37;&#x6B4C;&#x5730;&#x7403;&#x4F7F;&#x7528;)
- GCJ02: national coordinate system developed by China (&#x56FD;&#x6D4B;&#x5C40;&#x5750;&#x6807;&#xFF0C;&#x8C37;&#x6B4C;&#x4E2D;&#x56FD;&#x5730;&#x56FE;&#x3001;&#x817E;&#x8BAF;&#x5730;&#x56FE;&#x3001;&#x9AD8;&#x5FB7;&#x5730;&#x56FE;&#x4F7F;&#x7528;)
- BD09: Baidu coordinates (&#x767E;&#x5EA6;&#x5750;&#x6807;&#x7CFB;&#xFF0C;&#x767E;&#x5EA6;&#x5730;&#x56FE;&#x4F7F;&#x7528;)
- MapBar: MapBar coordinates (&#x56FE;&#x5427;&#x5750;&#x6807;&#x7CFB;&#xFF0C;&#x56FE;&#x5427;&#x5730;&#x56FE;&#x4F7F;&#x7528;)
Test website: http://gpsspg.com/maps.htm
Author: Gaussic
Date:   2019-05-09
&quot;&quot;&quot;

import math

PI = math.pi
PIX = math.pi * 3000 / 180
EE = 0.00669342162296594323
A = 6378245.0


def bd09_to_gcj02(lng, lat):
    &quot;&quot;&quot;BD09 -&gt; GCJ02&quot;&quot;&quot;
    x, y =  lng - 0.0065, lat - 0.006
    z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * PIX)
    theta = math.atan2(y, x) - 0.000003 * math.cos(x * PIX)
    lng, lat = z * math.cos(theta), z * math.sin(theta)
    return lng, lat


def gcj02_to_bd09(lng, lat):
    &quot;&quot;&quot;GCJ02 -&gt; BD09&quot;&quot;&quot;
    z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * PIX)
    theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * PIX)
    lng, lat = z * math.cos(theta) + 0.0065, z * math.sin(theta) + 0.006
    return lng, lat


def gcj02_to_wgs84(lng, lat):
    &quot;&quot;&quot;GCJ02 -&gt; WGS84&quot;&quot;&quot;
    if out_of_china(lng, lat):
        return lng, lat
    dlat = transform_lat(lng - 105.0, lat - 35.0)
    dlng = transform_lng(lng - 105.0, lat - 35.0)
    radlat = lat / 180.0 * PI
    magic = math.sin(radlat)
    magic = 1 - EE * magic * magic
    sqrtmagic = math.sqrt(magic)
    dlat = (dlat * 180.0) / ((A * (1 - EE)) / (magic * sqrtmagic) * PI)
    dlng = (dlng * 180.0) / (A / sqrtmagic * math.cos(radlat) * PI)
    lng, lat = lng - dlng, lat - dlat
    return lng, lat


def wgs84_to_gcj02(lng, lat):
    &quot;&quot;&quot;WGS84 -&gt; GCJ02&quot;&quot;&quot;
    if out_of_china(lng, lat):
        return lng, lat
    dlat = transform_lat(lng - 105.0, lat - 35.0)
    dlng = transform_lng(lng - 105.0, lat - 35.0)
    radlat = lat / 180.0 * PI
    magic = math.sin(radlat)
    magic = 1 - EE * magic * magic
    sqrtmagic = math.sqrt(magic)
    dlat = (dlat * 180.0) / ((A * (1 - EE)) / (magic * sqrtmagic) * PI)
    dlng = (dlng * 180.0) / (A / sqrtmagic * math.cos(radlat) * PI)
    lng, lat = lng + dlng, lat + dlat
    return lng, lat


def mapbar_to_wgs84(lng, lat):
    &quot;&quot;&quot;MapBar -&gt; WGS84&quot;&quot;&quot;
    lng = lng * 100000.0 % 36000000
    lat = lat * 100000.0 % 36000000
    lng1 = int(lng - math.cos(lat / 100000.0) * lng / 18000.0 - math.sin(lng / 100000.0) * lat / 9000.0) 
    lat1 = int(lat - math.sin(lat / 100000.0) * lng / 18000.0 - math.cos(lng / 100000.0) * lat / 9000.0)
    lng2 = int(lng - math.cos(lat1 / 100000.0) * lng1 / 18000.0 - math.sin(lng1 / 100000.0) * lat1 / 9000.0 + (1 if lng &gt; 0 else -1))
    lat2 = int(lat - math.sin(lat1 / 100000.0) * lng1 / 18000.0 - math.cos(lng1 / 100000.0) * lat1 / 9000.0 + (1 if lat &gt; 0 else -1)) 
    lng, lat = lng2 / 100000.0, lat2 / 100000.0
    return lng, lat


def transform_lat(lng, lat):
    &quot;&quot;&quot;GCJ02 latitude transformation&quot;&quot;&quot;
    ret = -100 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
    ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * math.sin(2.0 * lng * PI)) * 2.0 / 3.0
    ret += (20.0 * math.sin(lat * PI) + 40.0 * math.sin(lat / 3.0 * PI)) * 2.0 / 3.0
    ret += (160.0 * math.sin(lat / 12.0 * PI) + 320.0 * math.sin(lat * PI / 30.0)) * 2.0 / 3.0
    return ret


def transform_lng(lng, lat):
    &quot;&quot;&quot;GCJ02 longtitude transformation&quot;&quot;&quot;
    ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
    ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * math.sin(2.0 * lng * PI)) * 2.0 / 3.0
    ret += (20.0 * math.sin(lng * PI) + 40.0 * math.sin(lng / 3.0 * PI)) * 2.0 / 3.0
    ret += (150.0 * math.sin(lng / 12.0 * PI) + 300.0 * math.sin(lng / 30.0 * PI)) * 2.0 / 3.0
    return ret


def out_of_china(lng, lat):
    &quot;&quot;&quot;No offset when coordinate out of China.&quot;&quot;&quot;
    if lng &lt; 72.004 or lng &gt; 137.8437:
        return True
    if lat &lt; 0.8293 or lat &gt; 55.8271:
        return True
    return False


def bd09_to_wgs84(lng, lat):
    &quot;&quot;&quot;BD09 -&gt; WGS84&quot;&quot;&quot;
    lng, lat = bd09_to_gcj02(lng, lat)
    lng, lat = gcj02_to_wgs84(lng, lat)
    return lng, lat


def wgs84_to_bd09(lng, lat):
    &quot;&quot;&quot;WGS84 -&gt; BD09&quot;&quot;&quot;
    lng, lat = wgs84_to_gcj02(lng, lat)
    lng, lat = gcj02_to_bd09(lng, lat)
    return lng, lat


def mapbar_to_gcj02(lng, lat):
    &quot;&quot;&quot;MapBar -&gt; GCJ02&quot;&quot;&quot;
    lng, lat = mapbar_to_wgs84(lng, lat)
    lng, lat = wgs84_to_gcj02(lng, lat)
    return lng, lat


def mapbar_to_bd09(lng, lat):
    &quot;&quot;&quot;MapBar -&gt; BD09&quot;&quot;&quot;
    lng, lat = mapbar_to_wgs84(lng, lat)
    lng, lat = wgs84_to_bd09(lng, lat)
    return lng, lat


if __name__ == &apos;__main__&apos;:
    blng, blat = 121.4681891220,31.1526609317
    print(&apos;BD09:&apos;, (blng, blat))
    print(&apos;BD09 -&gt; GCJ02:&apos;, bd09_to_gcj02(blng, blat))
    print(&apos;BD09 -&gt; WGS84:&apos;,bd09_to_wgs84(blng, blat))
    wlng, wlat = 121.45718237717077, 31.14846209914084
    print(&apos;WGS84:&apos;, (wlng, wlat))
    print(&apos;WGS84 -&gt; GCJ02:&apos;, wgs84_to_gcj02(wlng, wlat))
    print(&apos;WGS84 -&gt; BD09:&apos;, wgs84_to_bd09(wlng, wlat))
    mblng, mblat = 121.4667323772, 31.1450420991
    print(&apos;MapBar:&apos;, (mblng, mblat))
    print(&apos;MapBar -&gt; WGS84:&apos;, mapbar_to_wgs84(mblng, mblat))
    print(&apos;MapBar -&gt; GCJ02:&apos;, mapbar_to_gcj02(mblng, mblat))
    print(&apos;MapBar -&gt; BD09:&apos;, mapbar_to_bd09(mblng, mblat))
</code></pre>
<!--kg-card-end: markdown-->
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[从零开始做歌词生成器 - 1 - 歌词清洗与分析]]></title><description><![CDATA[上一篇中详述了歌词的抓取部分，大约抓取到了 3 万 7 千多篇歌词，未经过任何清洗。在这一篇中，需要对歌词做一些简单的清洗和分析工作。]]></description><link>https://gaussic.com/lyric-generation-2/</link><guid isPermaLink="false">6262ac945d2e43486650208e</guid><category><![CDATA[Gensim]]></category><category><![CDATA[TF-IDF]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Mon, 22 Jan 2018 20:32:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/streets-1284394_1280.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://gaussic.com/content/images/2020/01/streets-1284394_1280.jpg" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 1 - &#x6B4C;&#x8BCD;&#x6E05;&#x6D17;&#x4E0E;&#x5206;&#x6790;"><p>&#x8F6C;&#x8F7D;&#x8BF7;&#x6CE8;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/lyric-generation-2/">https://gaussic.com/lyric-generation-2/</a></p>
<p>&#x63A5;&#x4E0A;&#x4E00;&#x7BC7;&#xFF1A;<a href="https://gaussic.com/lyric-generation-1/">&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91; 3 &#x4E07;&#x9996;&#x6B4C;&#x8BCD;</a></p>
<p>&#x4E0A;&#x4E00;&#x7BC7;&#x4E2D;&#x8BE6;&#x8FF0;&#x4E86;&#x6B4C;&#x8BCD;&#x7684;&#x6293;&#x53D6;&#x90E8;&#x5206;&#xFF0C;&#x5927;&#x7EA6;&#x6293;&#x53D6;&#x5230;&#x4E86; 3 &#x4E07; 7 &#x5343;&#x591A;&#x7BC7;&#x6B4C;&#x8BCD;&#xFF0C;&#x672A;&#x7ECF;&#x8FC7;&#x4EFB;&#x4F55;&#x6E05;&#x6D17;&#x3002;&#x5728;&#x8FD9;&#x4E00;&#x7BC7;&#x4E2D;&#xFF0C;&#x9700;&#x8981;&#x5BF9;&#x6B4C;&#x8BCD;&#x505A;&#x4E00;&#x4E9B;&#x7B80;&#x5355;&#x7684;&#x6E05;&#x6D17;&#x548C;&#x5206;&#x6790;&#x5DE5;&#x4F5C;&#x3002;</p>
<p>&#x4EE3;&#x7801;&#x6682;&#x65F6;&#x653E;&#x5728;&#x8FD9;&#x4E2A; repo &#x91CC;&#xFF0C;&#x5230;&#x540E;&#x9762;&#x6574;&#x5408;&#x5230;&#x5B8C;&#x6574;&#x7684;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF1A;<a href="https://github.com/gaussic/crawl_scripts/tree/master/lyric_crawler">gaussic/crawl_scripts</a></p>
<p>&#x73AF;&#x5883;&#x4F9D;&#x8D56;&#xFF1A;</p>
<blockquote>
<p>jieba&#x3001;gensim&#x3001;pandas</p>
</blockquote>
<h4 id="%E5%89%8D%E8%A8%80">&#x524D;&#x8A00;</h4>
<p>&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x89C1;&#xFF0C;&#x8FD9;&#x4E9B;&#x6B4C;&#x8BCD;&#x4E2D;&#x5305;&#x542B;&#x4E86;&#x4E2D;&#x3001;&#x97E9;&#x3001;&#x65E5;&#x3001;&#x82F1;&#x56DB;&#x79CD;&#x8BED;&#x8A00;&#xFF0C;&#x4E2D;&#x6587;&#x8FD8;&#x5206;&#x7E41;&#x3001;&#x7B80;&#x3002;&#x4EE5;&#x53CA;&#x65F6;&#x95F4;&#x7EBF;&#x3001;&#x5DE5;&#x4F5C;&#x4EBA;&#x5458;&#x7B49;&#x7B49;&#x3002;&#x7531;&#x4E8E;&#x662F;&#x9488;&#x5BF9;&#x4E2D;&#x6587;&#x7684;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x8FC7;&#x6EE4;&#x6389;&#x5927;&#x91CF;&#x7684;&#x6587;&#x672C;&#x3002;</p>
<p><img src="https://gaussic.com/content/images/2020/01/lyric-1-1.jpg" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 1 - &#x6B4C;&#x8BCD;&#x6E05;&#x6D17;&#x4E0E;&#x5206;&#x6790;" loading="lazy"></p>
<p>&#x5173;&#x4E8E;&#x65F6;&#x95F4;&#x7EBF;&#x3001;&#x5DE5;&#x4F5C;&#x4EBA;&#x5458;&#xFF0C;&#x57FA;&#x672C;&#x90FD;&#x6709;&#x56FA;&#x5B9A;&#x7684;&#x6A21;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<strong>&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;</strong>&#x53BB;&#x9664;&#x3002;</p>
<p>&#x5173;&#x4E8E;&#x8BED;&#x8A00;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6709;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x65B9;&#x6848;&#xFF0C;&#x628A;&#x5916;&#x6587;&#x6B4C;&#x624B;&#x4ECE;&#x5E93;&#x4E2D;&#x5220;&#x9664;&#xFF0C;&#x8FD9;&#x6837;&#x505A;&#x6CA1;&#x6709;&#x529E;&#x6CD5;&#x6392;&#x9664;&#x6709;&#x4E9B;&#x534E;&#x8BED;&#x6B4C;&#x624B;&#x5531;&#x7684;&#x5916;&#x6587;&#x6B4C;&#x66F2;&#xFF0C;&#x4EE5;&#x53CA;&#x4E00;&#x4E9B;&#x5E26;&#x6709;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#x7684;&#x6B4C;&#x66F2;&#xFF0C;&#x6CBB;&#x6807;&#x4E0D;&#x6CBB;&#x672C;&#x3002;&#x53E6;&#x4E00;&#x4E2A;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x662F;&#x6839;&#x636E;<strong>&#x4E2D;&#x6587;&#x5B57;&#x7B26;&#x533A;&#x95F4;</strong>&#xFF0C;&#x7528;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x6765;&#x5904;&#x7406;&#xFF0C;&#x8FD9;&#x6837;&#x4F3C;&#x4E4E;&#x66F4;&#x52A0;&#x5408;&#x60C5;&#x5408;&#x7406;&#x3002;</p>
<p>&#x6B64;&#x5916;&#xFF0C;&#x4E3A;&#x4E86;&#x7F29;&#x5C0F;&#x8BCD;&#x6C47;&#x8868;&#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x51CF;&#x5C11;&#x6A21;&#x578B;&#x53C2;&#x6570;&#xFF0C;&#x5C06;&#x7E41;&#x4F53;&#x5B57;&#x8F6C;&#x6362;&#x4E3A;&#x7B80;&#x4F53;&#x5B57;&#xFF0C;&#x8FD9;&#x4E2A;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<strong>&#x7E41;&#x7B80;&#x5BF9;&#x7167;&#x8868;</strong>&#x5B8C;&#x6210;&#x3002;</p>
<p>&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x540C;&#x4E00;&#x4E2A;&#x6B4C;&#x624B;&#x7684;&#x4E00;&#x9996;&#x6B4C;&#x4F1A;&#x6709;&#x591A;&#x4E2A;&#x4E0D;&#x540C;&#x7684;&#x7248;&#x672C;&#xFF08;Remix&#xFF0C;Live &#x7B49;&#x7B49;&#xFF09;&#xFF0C;&#x4F46;&#x662F;&#x6B4C;&#x8BCD;&#x662F;&#x76F8;&#x4F3C;&#x7684;&#xFF0C;&#x9700;&#x8981;&#x5C3D;&#x91CF;&#x7684;&#x53EA;&#x4FDD;&#x7559;&#x4E00;&#x4E2A;&#x7248;&#x672C;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x53BB;&#x91CD;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x8FD9;&#x4E2A;&#x6B65;&#x9AA4;&#x662F;&#x53EF;&#x9009;&#x7684;&#xFF0C;&#x4FDD;&#x5B58;&#x4E00;&#x5B9A;&#x7684;&#x91CD;&#x590D;&#x5BF9;&#x6A21;&#x578B;&#x5176;&#x5B9E;&#x5F71;&#x54CD;&#x5E76;&#x4E0D;&#x5927;&#x3002;&#x5BF9;&#x4E8E;&#x53BB;&#x91CD;&#xFF0C;&#x9700;&#x8981;&#x8BA1;&#x7B97;&#x5404;<strong>&#x6587;&#x6863;&#x76F8;&#x4F3C;&#x5EA6;</strong>&#xFF0C;&#x7136;&#x540E;&#x518D;&#x53BB;&#x9664;&#x76F8;&#x4F3C;&#x5EA6;&#x9AD8;&#x7684;&#x6587;&#x6863;&#x3002;</p>
<p>&#x5173;&#x4E8E;&#x4EE5;&#x4E0A;&#x6B65;&#x9AA4;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x6211;&#x4EEC;&#x9010;&#x6B65;&#x53D9;&#x8FF0;&#x3002;</p>
<h4 id="%E5%88%9D%E6%AD%A5%E6%B8%85%E6%B4%97">&#x521D;&#x6B65;&#x6E05;&#x6D17;</h4>
<p>&#x5927;&#x90E8;&#x5206;&#x7684;&#x65F6;&#x95F4;&#x8F74;&#x548C;&#x989D;&#x5916;&#x4FE1;&#x606F;&#xFF0C;&#x88AB;&#x5305;&#x5728; <code>[]</code> &#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x628A;&#x8FD9;&#x4E00;&#x90E8;&#x5206;&#x76F4;&#x63A5;&#x53BB;&#x9664;&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x8FD8;&#x6709;&#x4E00;&#x5DE5;&#x4F5C;&#x4EBA;&#x5458;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x57FA;&#x672C;&#xFF08;&#x5E76;&#x975E;&#x5168;&#x90E8;&#xFF09;&#x90FD;&#x6709;&#x56FA;&#x5B9A;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x51E0;&#x4E2A;&#x5173;&#x952E;&#x8BCD;&#x53BB;&#x9664;&#x5927;&#x90E8;&#x5206;&#x3002;</p>
<p>&#x5173;&#x4E8E;&#x8BED;&#x8A00;&#x5224;&#x65AD;&#xFF0C;&#x4E2D;&#x6587;&#x5B57;&#x7B26;&#x533A;&#x95F4;&#x662F; <code>\u4e00-\u9fa5</code>&#xFF0C;&#x7EDF;&#x8BA1;&#x7B26;&#x5408;&#x8BE5;&#x533A;&#x95F4;&#x5185;&#x5B57;&#x7B26;&#x6570;&#x91CF;&#xFF0C;&#x5982;&#x679C;&#x8D85;&#x8FC7; 8 &#x6210;&#x90FD;&#x662F;&#x4E2D;&#x6587;&#xFF0C;&#x5219;&#x5224;&#x65AD;&#x4E3A;&#x4E2D;&#x6587;&#x3002;&#x8FD9;&#x4E2A;&#x767E;&#x5206;&#x6BD4;&#x53EF;&#x4EE5;&#x8C03;&#x6574;&#xFF0C;&#x56E0;&#x4E3A;&#x8FD8;&#x5B58;&#x5728;&#x4E00;&#x4E9B;&#x53CC;&#x8BED;&#x6B4C;&#x8BCD;&#x3002;</p>
<p>&#x4F7F;&#x7528;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#xFF0C;&#x521D;&#x6B65;&#x6E05;&#x6D17;&#x7684;&#x51FD;&#x6570;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-python">def open_file(filename, mode=&apos;r&apos;):
    return open(filename, mode=mode, encoding=&apos;utf-8&apos;, errors=&apos;ignore&apos;)


def is_chinese(text):
    text = &apos;&apos;.join([x.strip() for x in text.split(&apos;\n&apos;)])
    res = &apos; &apos;.join([r for r in re.findall(r&quot;[\u4e00-\u9fa5]+&quot;, text)])  # &#x4E2D;&#x6587;&#x5B57;&#x7B26;&#x533A;&#x95F4;
    return len(res) &gt;= 0.8 * len(text)  # 8&#x6210;&#x4EE5;&#x4E0A;&#x662F;&#x4E2D;&#x6587;


def clean_text(filename):
    text = open_file(filename).read()
    text = re.sub(r&quot;\[.*\]&quot;, &quot;&quot;, text)  # &#x8FC7;&#x6EE4;&#x65F6;&#x95F4;&#x8F74;
    text = re.sub(r&quot;&#x4F5C;&#x8BCD;.*\n&quot;, &quot;&quot;, text)  # &#x8FC7;&#x6EE4;&#x6389;&#x5DE5;&#x4F5C;&#x4EBA;&#x5458;
    text = re.sub(r&quot;&#x4F5C;&#x66F2;.*\n&quot;, &quot;&quot;, text)
    text = re.sub(r&quot;&#x7F16;&#x66F2;.*\n&quot;, &quot;&quot;, text)
    text = re.sub(r&quot;&#x6F14;&#x5531;.*\n&quot;, &quot;&quot;, text)
    text = re.sub(r&quot;&#x5236;&#x4F5C;&#x4EBA;.*\n&quot;, &quot;&quot;, text).strip()
    return text
</code></pre>
<h4 id="%E7%B9%81%E7%AE%80%E8%BD%AC%E6%8D%A2">&#x7E41;&#x7B80;&#x8F6C;&#x6362;</h4>
<p>&#x90E8;&#x5206;&#x7684;&#x7CA4;&#x8BED;&#x6B4C;&#x7E41;&#x4F53;&#x5C45;&#x591A;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x5C06;&#x7E41;&#x4F53;&#x8F6C;&#x6362;&#x4E3A;&#x7B80;&#x4F53;&#xFF0C;&#x964D;&#x4F4E;&#x8BCD;&#x6C47;&#x8868;&#x5927;&#x5C0F;&#x3002;<br></p>
<p>&#x603B;&#x7ED3;&#x4E86;&#x4E00;&#x5F20;&#x5BF9;&#x7167;&#x8868;&#xFF0C;&#x683C;&#x5F0F;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-python">&#x700B;	&#x6C88;
&#x756B;	&#x5212;
&#x937E;	&#x949F;
&#x9766;	&#x817C;
&#x9918;	&#x4F59;
&#x9BF0;	&#x9C87;
&#x9E7C;	&#x78B1;
&#x380F;	&#x37C6;
...
</code></pre>
<p>&#x6211;&#x4EEC;&#x9700;&#x8981;&#x8BFB;&#x53D6;&#x8FD9;&#x5F20;&#x8868;&#xFF0C;&#x518D;&#x5C06;&#x521D;&#x7B5B;&#x540E;&#x7684;&#x6587;&#x672C;&#x8F6C;&#x6362;&#x4E3A;&#x7B80;&#x4F53;&#xFF0C;&#x9700;&#x8981;&#x4E24;&#x4E2A;&#x8F85;&#x52A9;&#x51FD;&#x6570;&#xFF1A;</p>
<pre><code class="language-python">def read_convert_words(filename):
    &quot;&quot;&quot;&#x8BFB;&#x53D6;&#x7E41;&#x7B80;&#x5B57;&#x4F53;&#x8F6C;&#x6362;&#x8868;&quot;&quot;&quot;
    tr_to_cn = {}
    with open_file(filename) as f:
        for line in f:
            key, value = line.strip().split()
            tr_to_cn[key] = value
    return tr_to_cn


def convert_tr_to_cn(sentence, tr_to_cn):
    &quot;&quot;&quot;&#x7E41;&#x7B80;&#x8F6C;&#x6362;&quot;&quot;&quot;
    cn_s = &apos;&apos;
    for x in sentence:
        if x in tr_to_cn:
            x = tr_to_cn[x]
        cn_s += x
    return cn_s
</code></pre>
<p>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x5C31;&#x662F;&#x904D;&#x5386;&#x6240;&#x6709;&#x76EE;&#x5F55;&#x4E0B;&#x7684;&#x6240;&#x6709;&#x6B4C;&#x8BCD;&#x6587;&#x6863;&#xFF0C;&#x7136;&#x540E;&#x4E00;&#x7247;&#x7247;&#x5904;&#x7406;&#x518D;&#x8F6C;&#x5B58;&#xFF1A;</p>
<pre><code class="language-python">base_dir = &quot;data&quot;
new_dir = &quot;data_clean&quot;   # &#x4FDD;&#x5B58;&#x5230;&#x65B0;&#x7684;&#x76EE;&#x5F55;&#x4E0B;
if os.path.exists(new_dir):
    shutil.rmtree(new_dir)
os.mkdir(new_dir)

cnt = 0   # &#x7F16;&#x53F7;
tr_to_cn = read_convert_words(&apos;tr-cn.txt&apos;)
for cur_dir in os.walk(base_dir):  # &#x904D;&#x5386;&#x6240;&#x6709;&#x6587;&#x6863;
    for filename in cur_dir[2]:
        try:
            file_dir = os.path.join(cur_dir[0], filename)
            data = clean_text(file_dir)

            if is_chinese(data) and len(data) &gt;= 200:  # &#x4E2D;&#x6587;&#xFF0C;200&#x5B57;&#x7B26;&#x4EE5;&#x4E0A;
                data = convert_tr_to_cn(data, tr_to_cn)   # &#x8F6C;&#x6362;&#x4E3A;&#x7B80;&#x4F53;

                filename = convert_tr_to_cn(filename, tr_to_cn)

                filename = &apos;&apos;.join(filename.split(&apos;.&apos;)[:-1])
                new_file = filename + &apos; - &apos; + str(cnt) + &apos;.txt&apos; # &#x9632;&#x6B62;&#x91CD;&#x540D;&#x8986;&#x76D6;&#xFF0C;&#x6253;&#x4E2A;&#x7F16;&#x53F7;
                open_file(os.path.join(new_dir, new_file), &apos;w&apos;).write(data)  # &#x6C47;&#x603B;&#x5199;&#x5165;&#x65B0;&#x76EE;&#x5F55;
                cnt += 1
        except:
            pass
</code></pre>
<p>&#x8FD9;&#x91CC;&#x53EA;&#x4FDD;&#x7559;&#x6E05;&#x6D17;&#x4E4B;&#x540E; 200 &#x5B57;&#x7B26;&#x4EE5;&#x4E0A;&#x7684;&#x6B4C;&#x8BCD;&#xFF0C;&#x5904;&#x7406;&#x5B8C;&#x6BD5;&#x5927;&#x7EA6;&#x5269;&#x4E0B; 16000 &#x591A;&#x7BC7;&#x3002;</p>
<p>&#x7ECF;&#x8FC7;&#x521D;&#x7B5B;&#x540E;&#x548C;&#x7E41;&#x7B80;&#x8F6C;&#x6362;&#x540E;&#x7684;&#x793A;&#x4F8B;&#x5982;&#x4E0B;&#xFF1A;</p>
<p>![lyric-1-2.jpg])(<a href="https://gaussic.com/content/images/2020/01/lyric-1-2.jpg">https://gaussic.com/content/images/2020/01/lyric-1-2.jpg</a>)</p>
<p>&#x76F8;&#x6BD4;&#x539F;&#x59CB;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5DF2;&#x7ECF;&#x5E72;&#x51C0;&#x4E86;&#x8BB8;&#x591A;&#x3002;</p>
<h4 id="%E6%AD%8C%E8%AF%8D%E5%8E%BB%E9%87%8D">&#x6B4C;&#x8BCD;&#x53BB;&#x91CD;</h4>
<p>&#x63A5;&#x4E0B;&#x6765;&#x8FD8;&#x9700;&#x8981;&#x5904;&#x7406;&#x6B4C;&#x8BCD;&#x91CD;&#x590D;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x67E5;&#x770B;&#x5269;&#x4E0B;&#x7684;&#x6587;&#x6863;&#xFF0C;&#x53D1;&#x73B0;&#x91CD;&#x590D;&#x60C5;&#x51B5;&#x8FD8;&#x662F;&#x6BD4;&#x8F83;&#x4E25;&#x91CD;&#x7684;&#xFF0C;&#x4EC5;&#x9648;&#x5955;&#x8FC5;&#x7684;&#x4E00;&#x9996; <strong>K&#x6B4C;&#x4E4B;&#x738B;</strong> &#x5C31;&#x51FA;&#x73B0;&#x4E86; 10 &#x6B21;&#x4EE5;&#x4E0A;&#x3002;</p>
<p>&#x53BB;&#x91CD;&#x7684;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x601D;&#x8DEF;&#x662F;&#x63D0;&#x53D6;&#x6240;&#x6709;&#x6587;&#x6863;&#x7684; <strong>TF-IDF</strong> &#x7279;&#x5F81;&#x5411;&#x91CF;&#x3002;&#x7136;&#x540E;&#x518D;&#x9010;&#x4E2A;&#x8BA1;&#x7B97;&#x6BCF;&#x4E00;&#x7BC7;&#x6587;&#x6863;&#x7684;&#x7279;&#x5F81;&#x5411;&#x91CF;&#x4E0E;&#x5176;&#x4ED6;&#x6240;&#x6709;&#x6587;&#x6863;&#x7684;&#x76F8;&#x4F3C;&#x5EA6;&#x3002;&#x5982;&#x679C;&#x76F8;&#x4F3C;&#x5EA6;&#x6700;&#x9AD8;&#x7684;&#x4E24;&#x7BC7;&#x6587;&#x6863;&#x7684;&#x76F8;&#x4F3C;&#x5EA6;&#x5C0F;&#x4E8E;&#x6240;&#x8BBE;&#x9608;&#x503C;&#xFF0C;&#x90A3;&#x4E48;&#x8BF4;&#x660E;&#x8FD9;&#x7BC7;&#x6587;&#x6863;&#x6CA1;&#x6709;&#x51FA;&#x73B0;&#x8FC7;&#x3002;</p>
<p>&#x6709;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x662F;&#xFF0C;&#x8FD9;&#x4E2A;&#x7B97;&#x6CD5;&#x7684;&#x590D;&#x6742;&#x5EA6;&#x662F; $O(n^2)$&#xFF0C;1.6 &#x4E07;&#x6587;&#x6863;&#x8BA1;&#x7B97;&#x91CF;&#x8FC7;&#x4EBF;&#xFF0C;&#x5916;&#x52A0;&#x6BCF;&#x7BC7;&#x6587;&#x6863;&#x7684;&#x76F8;&#x4F3C;&#x5EA6;&#x5BF9;&#x6BD4;&#x8FD8;&#x9700;&#x8981;&#x4E00;&#x5B9A;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x603B;&#x4F53;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x8BDD;&#x8D39;&#x6570;&#x5C0F;&#x65F6;&#x3002;<br></p>
<p>&#x53E6;&#x5916;&#x4E00;&#x79CD;&#x5FEB;&#x901F;&#x7684;&#x6D77;&#x91CF;&#x6587;&#x6863;&#x5339;&#x914D;&#x65B9;&#x6CD5;&#xFF0C;Simhash&#xFF0C;&#x6D4B;&#x8BD5;&#x4E4B;&#x540E;&#xFF0C;&#x53D1;&#x73B0;&#x901F;&#x5EA6;&#x867D;&#x7136;&#x5FEB;&#xFF0C;&#x4F46;&#x662F;&#x6548;&#x679C;&#x5E76;&#x4E0D;&#x8BA9;&#x4EBA;&#x6EE1;&#x610F;&#x3002;<br></p>
<p>&#x518D;&#x6B21;&#x5206;&#x6790;&#x6570;&#x636E;&#xFF0C;&#x628A;&#x6587;&#x6863;&#x6309;&#x540D;&#x79F0;&#x6392;&#x5E8F;&#x540E;&#xFF0C;&#x7EC8;&#x4E8E;&#x627E;&#x5230;&#x4E86;&#x4F18;&#x5316;&#x65B9;&#x6CD5;&#xFF1A;</p>
<p><img src="https://gaussic.com/content/images/2020/01/lyric-1-3.jpg" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 1 - &#x6B4C;&#x8BCD;&#x6E05;&#x6D17;&#x4E0E;&#x5206;&#x6790;" loading="lazy"></p>
<p>&#x4F9D;&#x6B21;&#x6253;&#x5F00;&#x540D;&#x79F0;&#x76F8;&#x4F3C;&#x7684;&#x6587;&#x6863;&#xFF0C;&#x53D1;&#x73B0;&#x5176;&#x4E2D;&#x7684;&#x5185;&#x5BB9;&#x662F;&#x51E0;&#x4E4E;&#x76F8;&#x540C;&#x7684;&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x6211;&#x4EEC;&#x6BCF;&#x6B21;&#x53EA;&#x8981;&#x5BF9;&#x6BD4;&#x540D;&#x79F0;&#x76F8;&#x8FD1;&#x7684;&#x51E0;&#x7BC7;&#x6587;&#x6863;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#xFF0C;&#x8FD9;&#x6837; $O(n^2)$ &#x53D8;&#x6210;&#x4E86; $O(n*k)$&#xFF0C;&#x4F18;&#x5316;&#x76F8;&#x5F53;&#x663E;&#x8457;&#x3002;</p>
<p>&#x5728; <a href="https://www.oreilly.com/learning/how-do-i-compare-document-similarity-using-python">How do I compare document similarity using Python?</a> &#x4E00;&#x6587;&#x4E2D;&#x7ED9;&#x51FA;&#x4E86;&#x4E00;&#x4E2A;&#x4F7F;&#x7528; gensim &#x5B9E;&#x73B0;&#x6587;&#x6863;&#x76F8;&#x4F3C;&#x5EA6;&#x8BA1;&#x7B97;&#x7684;&#x5B9E;&#x4F8B;&#x3002;&#x7531;&#x4E8E;&#x8981;&#x540C;&#x65F6;&#x5904;&#x7406;&#x591A;&#x7BC7;&#x6587;&#x6863;&#xFF0C;&#x5728;&#x6B64;&#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x4E86;&#x8FDB;&#x4E00;&#x6B65;&#x7684;&#x5C01;&#x88C5;&#xFF1A;</p>
<pre><code class="language-python"># coding: utf-8

import os
import sys
import gensim
import shutil


def open_file(filename, mode=&apos;r&apos;):
    return open(filename, mode=mode, encoding=&apos;utf-8&apos;, errors=&apos;ignore&apos;)


class DocSimilarity(object):

    def __init__(self, in_dir):
        &quot;&quot;&quot;&#x8BFB;&#x53D6;&#x6240;&#x6709;&#x6B4C;&#x8BCD;&quot;&quot;&quot;
        self.lyrics = []  # &#x6240;&#x6709;&#x6B4C;&#x8BCD;
        self.fnames = []  # &#x6240;&#x6709;&#x6587;&#x4EF6;&#x540D;
        for fname in sorted(os.listdir(in_dir)):  # &#x6392;&#x5E8F;&#xFF0C;&#x8BA9;&#x5185;&#x5BB9;&#x76F8;&#x4F3C;&#x7684;&#x66F4;&#x52A0;&#x9760;&#x8FD1;
            self.fnames.append(fname)
            self.lyrics.append(list(open_file(os.path.join(in_dir, fname)).read()))

        print(&quot;&#x539F;&#x6B4C;&#x8BCD;&#x603B;&#x6570;:&quot;, len(self.lyrics))
        self.corpus_pr()

    def corpus_pr(self):
        &quot;&quot;&quot;gensim&#x6587;&#x6863;tf_idf&#x8BA1;&#x7B97;&quot;&quot;&quot;
        dictionary = gensim.corpora.Dictionary(self.lyrics)  # &#x6587;&#x6863;&#x8BCD;&#x6C47;&#x8868;
        corpus = [dictionary.doc2bow(lyric) for lyric in self.lyrics]  # &#x6587;&#x6863;BOW&#x7279;&#x5F81;&#x5411;&#x91CF;
        tf_idf = gensim.models.TfidfModel(corpus)
        corpus = list(tf_idf[corpus])  # &#x6587;&#x6863;TF-IDF&#x7279;&#x5F81;

        self.vocab_size = len(dictionary)
        self.corpus = corpus
        print(&quot;&#x6587;&#x6863;TF-IDF&#x7279;&#x5F81;&#x8BA1;&#x7B97;&#x5B8C;&#x6BD5;&#x3002;&quot;)

    def remove_sim(self, out_dir, max_similarity=0.2, last_k=20):
        &quot;&quot;&quot;&#x79FB;&#x9664;&#x76F8;&#x4F3C;&#x6587;&#x6863;&#xFF0C;&#x4FDD;&#x5B58;&#x5230;&#x65B0;&#x76EE;&#x5F55;&quot;&quot;&quot;
        if os.path.exists(out_dir):
            shutil.rmtree(out_dir)
        os.mkdir(out_dir)

        cnt, yes = 1, 1
        c_corpus = [self.corpus[0]]  # &#x7B2C;0&#x7BC7;&#x76F4;&#x63A5;&#x653E;&#x5165;
        open_file(os.path.join(out_dir, self.fnames[0]), &apos;w&apos;).write(&apos;&apos;.join(self.lyrics[0]))

        for i in range(1, len(self.corpus)):
            try:
                # &#x6CE8;&#x610F;&#xFF0C;&#x53EA;&#x5BF9;&#x6BD4;last_k&#x7BC7;&#x6587;&#x6863;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x6240;&#x6709;&#x6B4C;&#x8BCD;
                sims = gensim.similarities.Similarity(&apos;/Users/gaussic/&apos;,
                                                      c_corpus[-last_k:],
                                                      num_features=self.vocab_size)
                if sims[self.corpus[i]].max() &lt; max_similarity:  # &#x5982;&#x679C;&#x6700;&#x76F8;&#x4F3C;&#x6587;&#x672C;&#x7684;&#x76F8;&#x4F3C;&#x5EA6;&#x5C0F;&#x4E8E;&#x9608;&#x503C;
                    c_corpus.append(self.corpus[i])
                    open_file(os.path.join(out_dir, self.fnames[i]), &apos;w&apos;).write(&apos;&apos;.join(self.lyrics[i]))
                    yes += 1
                cnt += 1
            except:
                pass
            if cnt % 2000 == 0:
                print(&apos;&#x5DF2;&#x5904;&#x7406;&#xFF1A;&apos;, cnt, &apos;&#x4FDD;&#x7559;&#xFF1A;&apos;, yes)
        print(&quot;&#x4FDD;&#x7559;&#x6B4C;&#x8BCD;&#x6570;&#xFF1A;&quot;, yes)


if __name__ == &apos;__main__&apos;:
    data_dir = sys.argv[1]
    docsim = DocSimilarity(data_dir)
    # &#x5BF9;&#x6BD4;&#x524D;20&#x7BC7;&#x6587;&#x6863;&#xFF0C;&#x76F8;&#x4F3C;&#x5EA6;&#x4F4E;&#x4E8E;0.2
    docsim.remove_sim(&apos;data_unique&apos;, max_similarity=0.2, last_k=20)
</code></pre>
<p>&#x8FD0;&#x884C;&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#xFF0C;&#x539F;&#x5148;&#x7684; 1.6 &#x4E07;&#x6587;&#x6863;&#x7ECF;&#x8FC7;&#x53BB;&#x91CD;&#x540E;&#x5269;&#x4F59;&#x7EA6; 5800 &#x7BC7;&#xFF0C;&#x4E14;&#x7528;&#x65F6;&#x4E0D;&#x5230; 5 &#x5206;&#x949F;&#xFF0C;&#x6548;&#x679C;&#x63D0;&#x5347;&#x663E;&#x8457;&#x3002;</p>
<h4 id="%E6%95%B4%E5%90%88%E6%89%80%E6%9C%89%E6%AD%8C%E8%AF%8D">&#x6574;&#x5408;&#x6240;&#x6709;&#x6B4C;&#x8BCD;</h4>
<p>&#x5728;&#x7ECF;&#x8FC7;&#x4EE5;&#x4E0A;&#x6E05;&#x6D17;&#x4E4B;&#x540E;&#xFF0C;&#x6570;&#x636E;&#x5E94;&#x8BE5;&#x7B97;&#x6BD4;&#x8F83;&#x5E72;&#x51C0;&#x4E86;&#x3002;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x540E;&#x9762;&#x7684;&#x8BAD;&#x7EC3;&#x548C;&#x6D4B;&#x8BD5;&#xFF0C;&#x73B0;&#x5728;&#x628A;&#x6240;&#x6709;&#x72EC;&#x7ACB;&#x7684;&#x6587;&#x6863;&#x5206;&#x8BCD;&#x5E76;&#x6574;&#x5408;&#x5230;&#x4E00;&#x4E2A;&#x6587;&#x6863;&#x4E2D;&#xFF0C;&#x505A;&#x8FDB;&#x4E00;&#x6B65;&#x7684;&#x9884;&#x5904;&#x7406;&#x3002;</p>
<p><strong>&#x5206;&#x8BCD;&#x4F7F;&#x7528;jieba&#x5206;&#x8BCD;&#x5DE5;&#x5177;&#xFF0C;&#x6BCF;&#x4E00;&#x884C;&#x5206;&#x8BCD;&#x540E;&#xFF0C;&#x6BCF;&#x4E2A;&#x8BCD;&#x4EE5;&#x7A7A;&#x683C;&#x9694;&#x5F00;</strong>&#x3002;</p>
<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684; 3 &#x70B9;&#x662F;:</p>
<ol>
<li>&#x90E8;&#x5206;&#x6B4C;&#x8BCD;&#x524D;&#x90E8;&#x548C;&#x540E;&#x90E8;&#x4ECD;&#x7136;&#x6709;&#x4E00;&#x4E9B;&#x566A;&#x58F0;&#xFF0C;&#x8003;&#x8651;&#x76F4;&#x63A5;&#x6254;&#x6389;&#x524D; 3 &#x884C;&#x548C;&#x540E; 3 &#x884C;&#x3002;</li>
<li>&#x5206;&#x8BCD;&#x540E;&#x5217;&#x8868;&#x4E2D;&#x5B58;&#x5728;&#x5927;&#x91CF;&#x7A7A;&#x683C;&#x548C;&#x7A7A;&#x5B57;&#x7B26;&#xFF0C;&#x53EF;&#x4EE5;&#x7ED3;&#x5408; <code>join()</code> &#x548C; <code>split()</code> &#x53BB;&#x9664;&#x3002;</li>
<li>&#x4E00;&#x884C;&#x6B4C;&#x8BCD;&#x592A;&#x957F;&#x548C;&#x592A;&#x77ED;&#x90FD;&#x4F1A;&#x5BF9;&#x6A21;&#x578B;&#x7684;&#x8BAD;&#x7EC3;&#x9020;&#x6210;&#x4E00;&#x5B9A;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x56E0;&#x800C;&#x53EA;&#x4FDD;&#x7559;&#x9002;&#x5F53;&#x957F;&#x5EA6;&#x7684;&#x884C;&#x3002;</li>
</ol>
<!-- -->
<pre><code class="language-python">import os
import jieba

jieba.enable_parallel(10)  # &#x5E76;&#x884C;&#x5206;&#x8BCD;

base_dir = &apos;data_unique&apos;


def open_file(filename, mode=&apos;r&apos;):
    return open(filename, mode=mode, encoding=&apos;utf-8&apos;, errors=&apos;ignore&apos;)


def lyric_group():
    lyric_full = open_file(&apos;lyric_full.txt&apos;, &apos;w&apos;)
    for fname in sorted(os.listdir(base_dir)):
        data = open_file(os.path.join(base_dir, fname)).readlines()
        if len(data) &lt;= 6:  # &#x6B4C;&#x8BCD;&#x592A;&#x77ED;&#xFF0C;&#x4E0D;&#x8981;
            continue
        lyric = []
        for line in data[3:-3]:  # &#x524D;3&#x884C;&#x540E;&#x4E09;&#x884C;&#x90FD;&#x4E0D;&#x8981;
            cur_line = list(jieba.cut(line.strip().lower()))
            if len(cur_line) &gt;= 30:  # &#x592A;&#x957F;&#x4E0D;&#x8981;
                continue
            lyric.extend(&apos; &apos;.join(cur_line).split())
            if len(lyric) &gt;= 5:
                lyric_full.write(&apos; &apos;.join(lyric) + &apos;\n&apos;)
                lyric = []
        lyric_full.write(&apos;\n&apos;)  # &#x6BCF;&#x9996;&#x6B4C;&#x8BCD;&#x7528;&#x7A7A;&#x884C;&#x9694;&#x5F00;

    lyric_full.close()
</code></pre>
<p>&#x6574;&#x5408;&#x540E;&#x7684;&#x6B4C;&#x8BCD;&#x7247;&#x6BB5;&#x793A;&#x4F8B;&#xFF1A;</p>
<blockquote>
<p>&#x5269;&#x4E0B; &#x7834;&#x6298;&#x53F7; &#x6709;&#x4E9B; &#x4EBA; &#x4EC0;&#x4E48; &#x90FD; &#x4E0D; &#x77E5;&#x9053;</p>
<p>&#x597D;&#x50CF; &#x4E00;&#x4E2A; &#x4EBA; &#x5DE8;&#x5927; &#x7684; &#x95EE;&#x53F7;</p>
<p>&#x6211; &#x4E5F; &#x4E0D; &#x6653;&#x5F97; &#x4ED6;&#x4EEC; &#x5982;&#x4F55;&#x662F;&#x597D;</p>
<p>&#x6211; &#x53EA;&#x6709; &#x7948;&#x7977; &#x4E0D;&#x7528; &#x522B;&#x7684; &#x6807;&#x70B9; &#x548C; &#x7B26;&#x53F7;</p>
<p>&#x53EA; &#x9700;&#x8981; &#x4E00;&#x4E2A; &#x611F;&#x53F9;&#x53F7; &#x4E0D;&#x7231; &#x4EC0;&#x4E48; &#x5929;&#x8352; &#x548C; &#x5730; &#x8001;</p>
<p>&#x6700; &#x559C;&#x6B22; &#x4E00;&#x4E2A; &#x611F;&#x53F9;&#x53F7; &#x4E0D;&#x7BA1; &#x4EC0;&#x4E48; &#x4F1F;&#x5927; &#x548C; &#x6E3A;&#x5C0F;</p>
<p>&#x53EA;&#x8981; &#x53EA;&#x8981; &#x51FA;&#x4E4E;&#x610F;&#x6599; &#x611F;&#x53F9; &#x6211; &#x7684; &#x5947;&#x5999;</p>
<p>&#x6709;&#x4E9B; &#x4EBA;&#x6709; &#x4E00;&#x53CC; &#x602A; &#x7709;&#x6BDB;</p>
<p>&#x76B1; &#x8D77;&#x6765; &#x597D;&#x50CF; &#x4E00;&#x5BF9; &#x62EC;&#x53F7;</p>
<p>&#x4ED6;&#x4EEC; &#x8D8A; &#x70E6;&#x607C; &#x770B;&#x6765; &#x8D8A;&#x662F; &#x53EF;&#x7B11;</p>
<p>oh ~ ~ &#x6709;&#x4E9B; &#x4EBA; &#x4E0D;&#x5F53; &#x4E3B;&#x89D2;</p>
<p>&#x5728; &#x4EBA;&#x5BB6; &#x7684; &#x6545;&#x4E8B; &#x5F53; &#x9017;&#x53F7;</p>
<p>&#x4E0D; &#x6653;&#x5F97; &#x65F6;&#x5019; &#x4E0D; &#x65E9;</p>
<p>&#x6211; &#x53EA;&#x6709; &#x7948;&#x7977; &#x4E0D;&#x7528; &#x522B;&#x7684; &#x6807;&#x70B9; &#x548C; &#x7B26;&#x53F7;</p>
<p>&#x53EA; &#x9700;&#x8981; &#x4E00;&#x4E2A; &#x611F;&#x53F9;&#x53F7; &#x4E0D;&#x7231; &#x4EC0;&#x4E48; &#x5929;&#x8352; &#x548C; &#x5730; &#x8001;</p>
<p>&#x6700; &#x559C;&#x6B22; &#x4E00;&#x4E2A; &#x611F;&#x53F9;&#x53F7; &#x4E0D;&#x7BA1; &#x4EC0;&#x4E48; &#x4F1F;&#x5927; &#x548C; &#x6E3A;&#x5C0F;</p>
<p>&#x53EA;&#x8981; &#x53EA;&#x8981; &#x51FA;&#x4E4E;&#x610F;&#x6599; &#x611F;&#x53F9; &#x6211; &#x7684; &#x5947;&#x5999;</p>
<p>&#x4E0D;&#x8BBA; &#x604B;&#x7231; &#x8FD8;&#x662F; &#x5F00;&#x73A9;&#x7B11; &#x8FD9; &#x662F; &#x627E; &#x4E00;&#x65F6; &#x70ED;&#x95F9;</p>
<p>&#x6211;&#x8981; &#x522B;&#x4EBA; &#x770B;&#x5230; &#x4E5F; &#x4F1A; &#x8BF4;&#x4E0D;&#x5F97; &#x4E86;</p>
<p>&#x4E0D;&#x7528; &#x522B;&#x7684; &#x6807;&#x70B9; &#x548C; &#x7B26;&#x53F7;</p>
<p>&#x53EA; &#x9700;&#x8981; &#x4E00;&#x4E2A; &#x611F;&#x53F9;&#x53F7; &#x4E0D;&#x7231; &#x4EC0;&#x4E48; &#x5929;&#x8352; &#x548C; &#x5730; &#x8001;</p>
</blockquote>
<h4 id="%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90">&#x6570;&#x636E;&#x5206;&#x6790;</h4>
<p>&#x8FD9;&#x4E00;&#x6B65;&#x7684;&#x6570;&#x636E;&#x5206;&#x6790;&#xFF0C;&#x540C;&#x6837;&#x4E3A;&#x6784;&#x5EFA;&#x6A21;&#x578B;&#x65F6;&#x7684;&#x53C2;&#x6570;&#x9009;&#x62E9;&#x670D;&#x52A1;&#x3002;</p>
<p>&#x9996;&#x5148;&#x662F;&#x603B;&#x8BCD;&#x6570;&#x548C;&#x8BCD;&#x6C47;&#x91CF;&#xFF1A;</p>
<pre><code class="language-python">from collections import Counter
lyrics = open_file(&apos;lyric_full.txt&apos;).read().strip().replace(&apos;\n&apos;, &apos; &apos;).split()
counter = Counter(lyrics)
count_pairs = counter.most_common()

print(&quot;&#x603B;&#x8BCD;&#x6570;:&quot;, len(lyrics))
print(&quot;&#x8BCD;&#x6C47;&#x91CF;:&quot;, len(counter))
print(&quot;&#x9AD8;&#x9891;&#x8BCD;:&quot;, count_pairs[:10])
</code></pre>
<p>&#x8F93;&#x51FA;&#xFF1A;</p>
<pre><code class="language-python">&#x603B;&#x8BCD;&#x6570;: 1011164
&#x8BCD;&#x6C47;&#x91CF;: 49280
&#x9AD8;&#x9891;&#x8BCD;: [(&apos;&#x7684;&apos;, 48193), (&apos;&#x6211;&apos;, 44841), (&apos;&#x4F60;&apos;, 41828), (&apos;&#x5728;&apos;, 12436), (&apos;&#x662F;&apos;, 11583), (&apos;&#x4E86;&apos;, 10560), (&apos;&#x7231;&apos;, 8357), (&apos;&#x4E0D;&apos;, 7975), (&apos;&#x90FD;&apos;, 7203), (&apos;&#x6709;&apos;, 6621)]
</code></pre>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x8BCD;&#x6570;&#x8FBE;&#x5230;&#x4E86; 100 &#x4E07;&#x4EE5;&#x4E0A;&#xFF0C;&#x8BCD;&#x6C47;&#x91CF;&#x63A5;&#x8FD1; 5 &#x4E07;&#xFF0C;&#x524D; 10 &#x9AD8;&#x9891;&#x8BCD;&#x65E0;&#x7591;&#x5C31;&#x662F;&#x6C49;&#x8BED;&#x5E38;&#x7528;&#x5B57;&#x3002;&#x8FDB;&#x4E00;&#x6B65;&#x89C2;&#x5BDF;&#xFF1A;</p>
<pre><code class="language-python">print(count_pairs[5000])
print(count_pairs[10000])
print(count_pairs[20000])
print(count_pairs[40000])
</code></pre>
<p>&#x8F93;&#x51FA;&#xFF1A;</p>
<pre><code class="language-python">(&apos;&#x6293;&#x4E0D;&#x4F4F;&apos;, 20)
(&apos;&#x522B;&#x7231;&apos;, 8)
(&apos;&#x8DDD;&apos;, 3)
(&apos;&#x4E25;&#x91CD;&#x6027;&apos;, 1)
</code></pre>
<p>&#x6392;&#x884C; 1 &#x4E07;&#x7684;&#x8BCD;&#x51FA;&#x73B0; 8 &#x6B21;&#xFF0C;2 &#x4E07;&#x7684;&#x8BCD;&#x51FA;&#x73B0; 3 &#x6B21;&#xFF0C;&#x800C; 4 &#x4E07;&#x4EE5;&#x540E;&#x7684;&#x8BCD;&#x53EA;&#x51FA;&#x73B0;&#x4E86; 1 &#x8BCD;&#x3002;&#x9700;&#x8981;&#x77E5;&#x9053;&#xFF0C;&#x6211;&#x4EEC;&#x7684;&#x603B;&#x8BCD;&#x91CF;&#x662F; 100 &#x4E07;&#x4EE5;&#x4E0A;&#xFF0C;&#x8FD9;&#x4E9B;&#x8BCD;&#x9891;&#x592A;&#x4F4E;&#x7684;&#x8BCD;&#x5BF9;&#x6A21;&#x578B;&#x7684;&#x5F71;&#x54CD;&#x662F;&#x5FAE;&#x4E0D;&#x8DB3;&#x9053;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x5C06; 1 &#x4E07;&#x4EE5;&#x540E;&#x7684;&#x8FD9;&#x4E9B;&#x8BCD;&#x66FF;&#x6362;&#x6210; <code>&amp;lt;unk&amp;gt;</code> &#x6807;&#x5FD7;&#xFF0C;&#x8BCD;&#x6C47;&#x8868;&#x7684;&#x51CF;&#x5C0F;&#x5927;&#x5927;&#x964D;&#x4F4E;&#x4E86;&#x6A21;&#x578B;&#x590D;&#x6742;&#x6027;&#x3002;</p>
<pre><code class="language-python">unk = 0
for i in range(10000, len(counter)):
    unk += count_pairs[i][1]
print(&quot;UNK&#x6240;&#x5360;&#x767E;&#x5206;&#x6BD4;&#xFF1A;{:.3}%&quot;.format(unk / len(lyrics) * 100))
</code></pre>
<p>&#x53D6;&#x8BCD;&#x6C47;&#x8868;&#x5927;&#x5C0F;&#x4E3A; 1 &#x4E07;&#xFF0C;UNK &#x6240;&#x5360;&#x767E;&#x5206;&#x6BD4;&#x7EA6;&#x4E3A; 9%&#xFF0C;&#x53EF;&#x4EE5;&#x8FDB;&#x4E00;&#x6B65;&#x5730;&#x5220;&#x9664;&#x90E8;&#x5206;&#x6570;&#x636E;&#x6765;&#x51CF;&#x5C0F;&#x8FD9;&#x4E2A;&#x91CF;&#x3002;</p>
<pre><code class="language-python">count_pairs = counter.most_common(10000)
words, _ = list(zip(*count_pairs))
ws = set(words)    # &#x524D;1&#x4E07;&#x4E2A;&#x8BCD;

lyrics = []
for line in open_file(&apos;lyric_full.txt&apos;):
    line = line.strip().split()
    if len(line) == 0:
        continue
    if len([x for x in line if x not in ws]) &lt;= 0.3 * len(line):
        lyrics.append(line)
print(len(lyrics))
</code></pre>
<p>&#x5728;&#x53EA;&#x53D6; 1 &#x4E07;&#x8BCD;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8FC7;&#x6EE4;&#x6389; unk &#x6BD4;&#x4F8B;&#x8D85;&#x8FC7; 0.3 &#x7684;&#x884C;&#xFF0C;&#x5F97;&#x5230; 12.5 &#x4E07;&#x884C;&#x6B4C;&#x8BCD;&#x3002;</p>
<pre><code class="language-python">import pandas as pd

lengths = list(map(len, lyrics))
lengths = pd.DataFrame(lengths, columns=[&apos;lengths&apos;])
print(lengths.describe())
&#x8F93;&#x51FA;&#xFF1A;
             lengths
count  125940.000000
mean        7.424782
std         2.089210
min         5.000000
25%         6.000000
50%         7.000000
75%         9.000000
max        29.000000
</code></pre>
<p>&#x603B;&#x884C;&#x6570;&#x4E3A; 125940&#xFF0C;&#x6BCF;&#x884C;&#x5E73;&#x5747;&#x957F;&#x5EA6; 7.42&#xFF0C;&#x6700;&#x5C0F;&#x957F;&#x5EA6;&#x4E3A; 5&#xFF0C;&#x6700;&#x5927;&#x4E3A; 29&#xFF0C;75% &#x7684;&#x884C;&#x957F;&#x5EA6;&#x4E3A; 9&#x3002;</p>
<p>&#x6709;&#x4E00;&#x4E9B;&#x6A21;&#x578B;&#x5728;&#x6279;&#x5904;&#x7406;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x5B9A;&#x957F;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x628A;&#x6BCF;&#x884C; pad &#x6210;&#x56FA;&#x5B9A;&#x7684;&#x957F;&#x5EA6;&#xFF0C;&#x4E0D;&#x8DB3;&#x7684;&#x8865; 0&#xFF0C;&#x592A;&#x957F;&#x7684;&#x88C1;&#x526A;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5F97;&#x51FA;&#xFF0C;&#x628A;&#x957F;&#x5EA6;&#x5B9A;&#x4E3A; 10 &#x5DE6;&#x53F3;&#x4F1A;&#x6BD4;&#x8F83;&#x5408;&#x7406;&#x3002;</p>
<p>&#x8FD9;&#x4E00;&#x4E9B;&#x5206;&#x6790;&#xFF0C;&#x4E0D;&#x4F3C;&#x4EA7;&#x54C1;&#x6C6A;&#x6240;&#x5F3A;&#x8C03;&#x7684;&#x60C5;&#x7EEA;&#x3001;&#x60C5;&#x8282;&#x3001;&#x60C5;&#x6000;&#xFF0C;&#x4F46;&#x90FD;&#x662F;&#x5BF9;&#x4E8E;&#x53C2;&#x6570;&#x8BBE;&#x7F6E;&#x975E;&#x5E38;&#x6709;&#x610F;&#x4E49;&#x7684;&#x5206;&#x6790;&#xFF0C;&#x5728;&#x540E;&#x9762;&#x7684;&#x7AE0;&#x8282;&#x4F1A;&#x7528;&#x5230;&#x3002;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x7684;&#x76EE;&#x7684;&#x4E0D;&#x5355;&#x5355;&#x662F;&#x901A;&#x8FC7;&#x7B80;&#x5355;&#x7684;&#x8BCD;&#x9891;&#x7EDF;&#x8BA1;&#x6765;&#x627E;&#x5230;&#x6B4C;&#x624B;&#x7684; pattern&#xFF0C;&#x800C;&#x662F;&#x8981;&#x521B;&#x9020;&#x51FA;&#x4E00;&#x4E2A;&#x80FD;&#x591F;&#x5199;&#x51FA;&#x517C;&#x5177;&#x5404;&#x5BB6;&#x98CE;&#x683C;&#x7684;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668;&#x3002;</p>
<p>&#x4EE3;&#x7801;&#x6682;&#x65F6;&#x653E;&#x5728;&#x8FD9;&#x4E2A; repo &#x91CC;&#xFF0C;&#x5230;&#x540E;&#x9762;&#x6574;&#x5408;&#x5230;&#x5B8C;&#x6574;&#x7684;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF1A;<a href="https://github.com/gaussic/crawl_scripts/tree/master/lyric_crawler">gaussic/crawl_scripts</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[从零开始做歌词生成器 - 0 - 抓取网易云 3 万首歌词]]></title><description><![CDATA[本篇和接下来的几篇文章，将从零开始，记录数据的抓取、清洗与分析，到歌词生成模型的构建、训练与分析过程。]]></description><link>https://gaussic.com/lyric-generation-1/</link><guid isPermaLink="false">6262ac125d2e43486650207d</guid><category><![CDATA[Deep Learning]]></category><category><![CDATA[Crawler]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Mon, 15 Jan 2018 23:00:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/piano-1655558_1280.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/piano-1655558_1280.jpg" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91; 3 &#x4E07;&#x9996;&#x6B4C;&#x8BCD;"><p>&#x672C;&#x7BC7;&#x548C;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x51E0;&#x7BC7;&#x6587;&#x7AE0;&#xFF0C;&#x5C06;&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#xFF0C;&#x8BB0;&#x5F55;&#x6570;&#x636E;&#x7684;&#x6293;&#x53D6;&#x3001;&#x6E05;&#x6D17;&#x4E0E;&#x5206;&#x6790;&#xFF0C;&#x5230;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x6A21;&#x578B;&#x7684;&#x6784;&#x5EFA;&#x3001;&#x8BAD;&#x7EC3;&#x4E0E;&#x5206;&#x6790;&#x8FC7;&#x7A0B;&#x3002;</p>
<p>&#x8981;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668;&#xFF0C;&#x9996;&#x5148;&#x5F97;&#x6709;&#x4E30;&#x5BCC;&#x7684;&#x6570;&#x636E;&#x3002;&#x82B1;&#x4E86;&#x70B9;&#x65F6;&#x95F4;&#x5728;&#x7F51;&#x6613;&#x4E91;&#x97F3;&#x4E50;&#x7F51;&#x9875;&#x7248;&#x4E0A;&#x9762;&#x6478;&#x7D22;&#xFF0C;&#x6700;&#x540E;&#x627E;&#x5230;&#x4E86;&#x51E0;&#x4E2A;&#x9875;&#x9762;&#xFF0C;&#x51E0;&#x4E2A; API&#xFF0C;&#x7EC8;&#x4E8E;&#x628A;&#x4E00;&#x6574;&#x5957;&#x7684;&#x6D41;&#x7A0B;&#x6574;&#x7406;&#x4E86;&#x51FA;&#x6765;&#x3002;</p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x6CE8;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/lyric-generation-1/">&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91;3&#x4E07;&#x9996;&#x6B4C;&#x8BCD;</a></p>
<h4 id="%E6%8A%93%E5%8F%96%E6%B5%81%E7%A8%8B%E5%88%86%E6%9E%90">&#x6293;&#x53D6;&#x6D41;&#x7A0B;&#x5206;&#x6790;</h4>
<p>&#x9996;&#x5148;&#x662F;&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#xFF1A;<a href="http://music.163.com/#/discover/artist">&#x7F51;&#x6613;&#x4E91;&#x97F3;&#x4E50;</a></p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/lyric-0-1.jpg" class="kg-image" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91; 3 &#x4E07;&#x9996;&#x6B4C;&#x8BCD;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x57FA;&#x672C;&#x4E0A;&#x628A;&#x70ED;&#x95E8;&#x7684;&#x6B4C;&#x624B;&#x90FD;&#x6DB5;&#x76D6;&#x4E86;&#xFF0C;&#x5982;&#x679C;&#x89C9;&#x5F97;&#x4E0D;&#x6EE1;&#x8DB3;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x70B9;&#x5DE6;&#x8FB9;&#x7684;&#x5206;&#x680F;&#xFF0C;&#x80FD;&#x627E;&#x5230;&#x66F4;&#x591A;&#x7684;&#x6B4C;&#x624B;&#x3002;<br></p>
<p>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x4EE5;&#x5468;&#x8463;&#x4E3A;&#x4F8B;&#xFF0C;&#x70B9;&#x51FB;&#x8FDB;&#x5165;&#x5468;&#x8463;&#x7684;&#x9875;&#x9762;&#xFF1A;<a href="http://music.163.com/#/artist?id=6452">&#x5468;&#x6770;&#x4F26; - &#x7F51;&#x6613;&#x4E91;</a></p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/lyric-0-2.jpg" class="kg-image" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91; 3 &#x4E07;&#x9996;&#x6B4C;&#x8BCD;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x5468;&#x8463;&#x9875;&#x9762;&#x7684;&#x94FE;&#x63A5;&#x4E3A;&#xFF1A;</p>
<pre><code>http://music.163.com/#/artist?id=6452
</code></pre>
<p>&#x6BCF;&#x4E2A;&#x6B4C;&#x624B;&#x90FD;&#x6709;&#x552F;&#x4E00;&#x7684; id&#xFF0C;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A; id &#x5C31;&#x80FD;&#x627E;&#x5230;&#x6B4C;&#x624B;&#x7684;&#x9875;&#x9762;&#x3002;&#x4E0D;&#x8FC7;&#x5982;&#x679C;&#x53EA;&#x6293;&#x8FD9;&#x4E2A;&#x94FE;&#x63A5;&#x7684;&#x8BDD;&#xFF0C;&#x6211;&#x4EEC;&#x53EA;&#x80FD;&#x6293;&#x53D6;&#x5230; 50 &#x9996;&#x6B4C;&#x3002;&#x70B9;&#x51FB;&#x6240;&#x6709;&#x4E13;&#x8F91;&#xFF0C;&#x53D1;&#x73B0;&#x6BCF;&#x9875;&#x5217;&#x51FA;&#x4E86; 12 &#x5F20;&#x4E13;&#x8F91;&#x3002;&#x4E13;&#x8F91;&#x9875;&#x9762;&#x7684;&#x94FE;&#x63A5;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>http://music.163.com/#/artist/album?id=6452
</code></pre>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x53C2;&#x6570;&#x4F9D;&#x7136;&#x662F;&#x6B4C;&#x624B;&#x7684; id&#x3002;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/lyric-0-3.jpg" class="kg-image" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91; 3 &#x4E07;&#x9996;&#x6B4C;&#x8BCD;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x4E3A;&#x4E86;&#x4E0D;&#x5904;&#x7406;&#x5206;&#x9875;&#xFF0C;&#x53EF;&#x4EE5;&#x518D;&#x4F20;&#x4E00;&#x4E2A; <code>limit</code> &#x53C2;&#x6570;&#xFF1A;</p>
<pre><code>http://music.163.com/#/artist/album?id=6452&amp;limit=100
</code></pre>
<p>&#x8FD9;&#x6837;&#xFF0C;&#x6240;&#x6709;&#x7684;&#x4E13;&#x8F91;&#x90FD;&#x5728;&#x4E00;&#x4E2A;&#x9875;&#x9762;&#x663E;&#x793A;&#x3002;&#x518D;&#x70B9;&#x51FB;&#x8FDB;&#x5165;&#x4E00;&#x5F20;&#x4E13;&#x8F91;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/lyric-0-4.jpg" class="kg-image" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91; 3 &#x4E07;&#x9996;&#x6B4C;&#x8BCD;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x4E13;&#x8F91;&#x9875;&#x9762;&#x94FE;&#x63A5;&#x4E3A;&#xFF1A;</p>
<pre><code>http://music.163.com/#/album?id=34720827
</code></pre>
<p>&#x6BCF;&#x4E00;&#x5F20;&#x4E13;&#x8F91;&#x90FD;&#x6709;&#x552F;&#x4E00;&#x7684; id&#x3002;&#x5728;&#x70B9;&#x51FB;&#x8FDB;&#x5165;&#x4E00;&#x9996;&#x6B4C;&#xFF0C;&#x53D1;&#x73B0;&#x6B4C;&#x4E5F;&#x662F;&#x7531; id &#x8868;&#x793A;&#x7684;&#x3002;</p>
<pre><code>http://music.163.com/#/song?id=415792916
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/lyric-0-5.jpg" class="kg-image" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91; 3 &#x4E07;&#x9996;&#x6B4C;&#x8BCD;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x8FD9;&#x6837;&#xFF0C;&#x6574;&#x4E2A;&#x7684;&#x601D;&#x8DEF;&#x5C31;&#x6E05;&#x6670;&#x4E86;&#xFF0C;&#x5148;&#x6293;&#x53D6;&#x6240;&#x6709;&#x70ED;&#x95E8;&#x6B4C;&#x624B;&#x7684; id&#xFF0C;&#x518D;&#x6839;&#x636E;&#x6B4C;&#x624B; id &#x6293;&#x53D6;&#x5176;&#x4E13;&#x8F91;&#x5217;&#x8868;&#xFF0C;&#x518D;&#x6839;&#x636E;&#x6BCF;&#x4E00;&#x5F20;&#x4E13;&#x8F91;&#x7684; id &#x6293;&#x53D6;&#x8BE5;&#x4E13;&#x8F91;&#x4E0B;&#x6240;&#x6709;&#x6B4C;&#x66F2; id&#xFF0C;&#x518D;&#x6839;&#x636E;&#x6B4C;&#x66F2; id &#x6293;&#x53D6;&#x8BE5;&#x6B4C;&#x66F2;&#x7684;&#x6B4C;&#x8BCD;&#x3002;<br></p>
<p>&#x6574;&#x4E2A;&#x4ECE;&#x6B4C;&#x624B;&#x5230;&#x6B4C;&#x8BCD;&#x662F;&#x4E00;&#x4E2A;&#x6811;&#x5F62;&#x7ED3;&#x6784;&#x3002;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/lyric-0-6.jpg" class="kg-image" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91; 3 &#x4E07;&#x9996;&#x6B4C;&#x8BCD;"></figure>
<!--kg-card-begin: markdown-->
<h4 id="%E6%8A%93%E5%8F%96%E4%BB%A3%E7%A0%81">&#x6293;&#x53D6;&#x4EE3;&#x7801;</h4>
<p>&#x641E;&#x660E;&#x767D;&#x8FD9;&#x4E2A;&#x6D41;&#x7A0B;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x5C31;&#x662F;&#x6293;&#x53D6;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x76EE;&#x6807;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x628A;&#x8FD9;&#x4E9B;&#x70ED;&#x95E8;&#x6B4C;&#x624B;&#x7684;&#x6240;&#x6709;&#x6B4C;&#x5168;&#x90E8;&#x6293;&#x53D6;&#x4E0B;&#x6765;&#x3002;</p>
<p><strong>&#x73AF;&#x5883;&#x4F9D;&#x8D56;</strong>&#xFF1A;python 3&#xFF0C;requests 2&#xFF0C;BeautifulSoup 4&#x3002;</p>
<p>requests &#x6293;&#x53D6;&#x51FD;&#x6570;&#x53CA;&#x5176;&#x4ED6;&#x914D;&#x7F6E;&#xFF1A;</p>
<pre><code class="language-python">import os
import json
import requests
from bs4 import BeautifulSoup

base_url = &quot;http://music.163.com&quot;
start_url = base_url + &quot;/artist/album?id={}&amp;limit=100&quot;  # &#x6839;&#x636E;&#x6B4C;&#x624B;&#x7684;id&#xFF0C;&#x6293;&#x53D6;&#x5176;&#x4E13;&#x8F91;&#x5217;&#x8868;
song_url = base_url + &quot;/api/song/lyric?id={}&amp;lv=1&amp;kv=1&amp;tv=-1&quot;  # &#x6839;&#x636E;&#x6B4C;&#x66F2;&#x7684;id&#xFF0C;&#x6293;&#x53D6;&#x6B4C;&#x8BCD;

headers = {
    &quot;User-Agent&quot;: &quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 &quot;
                  &quot;(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36&quot;,
    &quot;Referer&quot;: &quot;http://music.163.com&quot;,
    &quot;Host&quot;: &quot;music.163.com&quot;
}


def get_html(url):  # requests&#x6293;&#x53D6;
    resp = requests.get(url, headers=headers)
    html = str(resp.content, encoding=&apos;utf-8&apos;, errors=&apos;ignore&apos;)
    return html
</code></pre>
<p>&#x9996;&#x5148;&#x6293;&#x53D6;&#x6B4C;&#x624B; id &#x5217;&#x8868;&#xFF0C;&#x4FDD;&#x5B58;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x6CE8;&#x610F;&#x5230;&#x8FD9;&#x662F;&#x4E00;&#x4E2A; API&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x662F; JSON &#x6570;&#x636E;&#xFF0C;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x7F51;&#x9875;&#x94FE;&#x63A5;&#x662F;&#x65E0;&#x6548;&#x7684;&#xFF1A;</p>
<pre><code class="language-python">def find_artist_ids():
    &quot;&quot;&quot;&#x53EA;&#x80FD;&#x62FF;&#x5230;&#x524D;100&#x4F4D;&#x7684;&#x6B4C;&#x624B;ID&quot;&quot;&quot;
    url = &apos;http://music.163.com/api/artist/top?limit=100&amp;offset=0&apos;
    html = get_html(url)
    artists = json.loads(html)[&apos;artists&apos;]
    with open(&apos;artists.txt&apos;, &apos;w&apos;, encoding=&apos;utf-8&apos;, errors=&apos;ignore&apos;) as fa:
        for artist in artists:
            artist_name = artist[&apos;name&apos;].strip().replace(&quot; &quot;, &quot;_&quot;)
            fa.write(artist_name + &apos; &apos; + str(artist[&apos;id&apos;]) + &apos;\n&apos;)
</code></pre>
<p>&#x8FD9;&#x6837;&#xFF0C;100 &#x4F4D;&#x6B4C;&#x624B; id &#x5C31;&#x4FDD;&#x5B58;&#x5230;&#x4E86; artists.txt &#x4E2D;&#xFF1A;</p>
<pre><code>&#x5468;&#x6770;&#x4F26; 6452
&#x9648;&#x5955;&#x8FC5; 2116
&#x859B;&#x4E4B;&#x8C26; 5781
BIGBANG 126339
&#x6797;&#x4FCA;&#x6770; 3684
Maroon_5 96266
&#x738B;&#x83F2; 9621
&#x674E;&#x8363;&#x6D69; 4292
G.E.M.&#x9093;&#x7D2B;&#x68CB; 7763
&#x5F20;&#x5B66;&#x53CB; 6460
&#x6768;&#x5B97;&#x7EAC; 6066
&#x8BB8;&#x5DCD; 5770
&#x8521;&#x5065;&#x96C5; 7214
Adele 46487
Bruno_Mars 178059
Coldplay 89365
...
</code></pre>
<p>&#x8FD9;&#x5176;&#x4E2D;&#x5305;&#x542B;&#x4E2D;&#x65E5;&#x97E9;&#x6B27;&#x7F8E;&#x5404;&#x79CD;&#x8BED;&#x8A00;&#x6B4C;&#x624B;&#xFF0C;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x9700;&#x8981;&#x81EA;&#x884C;&#x589E;&#x5220;&#x6B4C;&#x624B;&#xFF08;&#x6BD4;&#x5982;&#x8FD9;&#x51E0;&#x7BC7;&#x5C31;&#x53EA;&#x5173;&#x6CE8;&#x4E2D;&#x6587;&#xFF09;&#xFF0C;&#x4E0D;&#x8FC7;&#x8FD9;&#x7BC7;&#x4E2D;&#xFF0C;&#x5148;&#x628A;&#x5168;&#x90E8;&#x90FD;&#x6293;&#x4E0B;&#x6765;&#x3002;</p>
<p>&#x7136;&#x540E;&#x5C31;&#x662F;&#x6293;&#x53D6;&#x7684;&#x6838;&#x5FC3;&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code class="language-python">def crawl_lyrics(art_id):
    &quot;&quot;&quot;&#x6293;&#x53D6;&#x4E00;&#x6574;&#x4E2A;&#x6B4C;&#x624B;&#x7684;&#x6240;&#x6709;&#x6B4C;&#x8BCD;&quot;&quot;&quot;
    html = get_html(start_url.format(art_id))  # &#x5148;&#x6293;&#x8BE5;&#x6B4C;&#x624B;&#x7684;&#x4E13;&#x8F91;&#x5217;&#x8868;
    soup = BeautifulSoup(html, &apos;lxml&apos;)

    artist = soup.find(&apos;h2&apos;, id=&apos;artist-name&apos;).text.strip().replace(&apos; &apos;, &apos;_&apos;)
    artist_dir = &apos;data/&apos; + artist
    if not os.path.exists(artist_dir):  # &#x6B4C;&#x624B;&#x76EE;&#x5F55;
        os.mkdir(artist_dir)
    print(&quot;&#x6B4C;&#x624B;&#x540D;&#xFF1A;&quot;, artist)

    albums = soup.find(&apos;ul&apos;, class_=&apos;m-cvrlst&apos;).find_all(&apos;a&apos;, class_=&apos;msk&apos;)  # &#x4E13;&#x8F91;&#x5217;&#x8868;
    for album in albums:
        html = get_html(base_url + album.get(&apos;href&apos;))  # &#x518D;&#x6293;&#x53D6;&#x8BE5;&#x4E13;&#x8F91;&#x4E0B;&#x6B4C;&#x66F2;&#x5217;&#x8868;
        soup = BeautifulSoup(html, &apos;lxml&apos;)

        album_title = soup.find(&apos;h2&apos;, class_=&apos;f-ff2&apos;).text.strip().replace(&apos; &apos;, &apos;_&apos;).replace(&apos;/&apos;, &apos;_&apos;)  # &apos;/&apos;&#x4F1A;&#x5F71;&#x54CD;&#x76EE;&#x5F55;
        album_dir = os.path.join(artist_dir, album_title)
        if not os.path.exists(album_dir):  # &#x4E13;&#x8F91;&#x76EE;&#x5F55;
            os.mkdir(album_dir)
        print(&quot;  &quot; + artist + &quot;---&quot; + album_title)

        links = soup.find(&apos;ul&apos;, class_=&apos;f-hide&apos;).find_all(&apos;a&apos;)  # &#x6B4C;&#x66F2;&#x5217;&#x8868;
        for link in links:
            song_name = link.text.strip().replace(&apos; &apos;, &apos;_&apos;).replace(&apos;/&apos;, &apos;_&apos;)
            song_id = link.get(&apos;href&apos;).split(&apos;=&apos;)[1]
            html = get_html(song_url.format(song_id))  # &#x6293;&#x53D6;&#x6B4C;&#x8BCD;

            try:  # &#x5B58;&#x5728;&#x65E0;&#x6B4C;&#x8BCD;&#x7684;&#x6B4C;&#x66F2;&#xFF0C;&#x76F4;&#x63A5;&#x5FFD;&#x7565;
                lyric_json = json.loads(html)
                lyric_text = lyric_json[&apos;lrc&apos;][&apos;lyric&apos;]

                open(os.path.join(album_dir, song_name + &apos;.txt&apos;), &apos;w&apos;, encoding=&apos;utf-8&apos;).write(lyric_text)
                print(&quot;    &quot; + song_name + &quot;, URL: &quot; + song_url.format(song_id))
            except:
                print(&quot;    &quot; + song_name + &quot;: &#x65E0;&#x6B4C;&#x8BCD;, URL: &quot; + song_url.format(song_id))
        print()
</code></pre>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x6574;&#x4E2A;&#x4EE3;&#x7801;&#x7684;&#x6838;&#x5FC3;&#x5C31;&#x662F;&#x4E09;&#x5C42;&#x7ED3;&#x6784;&#x3002;&#x4FDD;&#x5B58;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4E5F;&#x662F;&#x6309;&#x7167;&#x5C42;&#x7EA7;&#x7ED3;&#x6784;&#x6765;&#x4FDD;&#x5B58;&#x7684;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x5F00;&#x59CB;&#x6293;&#x53D6;&#xFF1A;</p>
<pre><code class="language-python">with open(&apos;artists.txt&apos;, &apos;r&apos;, encoding=&apos;utf-8&apos;) as f:
    for line in f:
        art_id = line.strip().split()[1]
        crawl_lyrics(art_id)
</code></pre>
<p>&#x6574;&#x4E2A;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x52A0;&#x4E0A;&#x7A7A;&#x884C;&#xFF0C;&#x52A0;&#x4E0A;&#x8F93;&#x51FA;&#x63D0;&#x793A;&#xFF0C;&#x52A0;&#x4E0A;&#x5F02;&#x5E38;&#x5904;&#x7406;&#xFF0C;&#x4E0D;&#x5230; 80 &#x884C;&#x3002;&#x6293;&#x53D6;&#x5230;&#x7684;&#x793A;&#x4F8B;&#x5982;&#x4E0B;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/lyric-0-7.jpg" class="kg-image" alt="&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91; 3 &#x4E07;&#x9996;&#x6B4C;&#x8BCD;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x6574;&#x4E2A; 100 &#x540D;&#x6B4C;&#x624B;&#xFF0C;&#x5927;&#x6982; 3 &#x4E07; 7 &#x5343;&#x591A;&#x9996;&#xFF0C;&#x672A;&#x7ECF;&#x8FC7;&#x4EFB;&#x4F55;&#x6E05;&#x6D17;&#xFF0C;&#x5F53;&#x7136;&#x6709;&#x5F88;&#x591A;&#x91CD;&#x590D;&#xFF0C;&#x6BD4;&#x5982;&#x8BF4;&#x5305;&#x542B;&#x4E00;&#x4E9B; live &#x7684;&#x6B4C;&#x8BCD;&#x3002;&#x5149;&#x9648;&#x5955;&#x8FC5;&#x4E00;&#x4E2A;&#x4EBA;&#x5C31;&#x6709; 1370 &#x591A;&#x9996;&#x3002;</p>
<p>&#x4EE3;&#x7801;&#x6682;&#x65F6;&#x653E;&#x5728;&#x8FD9;&#x4E2A; repo &#x91CC;&#xFF0C;&#x5230;&#x540E;&#x9762;&#x6574;&#x5408;&#x5230;&#x5B8C;&#x6574;&#x7684;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF1A;<a href="https://github.com/gaussic/crawl_scripts/tree/master/lyric_crawler">gaussic/crawl_scripts</a></p>
<p>&#x5982;&#x679C;&#x9700;&#x8981;&#x73B0;&#x6210;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x6211;&#x5728;&#x767E;&#x5EA6;&#x4E91;&#x4E0A;&#x9762;&#x5206;&#x4EAB;&#x4E86;&#x4E00;&#x4EFD;&#xFF1A;</p>
<p>&#x94FE;&#x63A5;:<a href="https://pan.baidu.com/s/1o9NNDjG">https://pan.baidu.com/s/1o9NNDjG</a> &#x5BC6;&#x7801;:0xe1</p>
<p><strong>&#x63D0;&#x793A;&#xFF1A;</strong></p>
<p>&#x8FD0;&#x884C;&#x7684;&#x4EE3;&#x7801;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53D1;&#x73B0;&#x534A;&#x8DEF;&#x4E0A;&#x65AD;&#x4E86;&#xFF0C;&#x4F30;&#x8BA1;&#x662F;&#x901F;&#x5EA6;&#x592A;&#x5FEB;&#x88AB;&#x7981;&#x6B62;&#x8BBF;&#x95EE;&#x4E86;&#xFF0C;&#x4E00;&#x4E2A;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x662F;&#xFF0C;&#x628A;&#x6293;&#x5B8C;&#x7684;&#x6B4C;&#x624B;&#x4ECE; artists.txt &#x653E;&#x5230;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x7B49;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#xFF0C;&#x91CD;&#x65B0;&#x8FD0;&#x884C;&#x628A;&#x5269;&#x4E0B;&#x7684;&#x6293;&#x4E86;&#x3002;&#x53E6;&#x4E00;&#x4E2A;&#x65B9;&#x6848;&#x662F;&#xFF0C;&#x52A0;&#x4EE3;&#x7406;&#xFF0C;&#x8FD9;&#x6837;&#x6BD4;&#x8F83;&#x6709;&#x6548;&#xFF0C;&#x4E0D;&#x8FC7;&#x901F;&#x5EA6;&#x6BD4;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x7A0D;&#x6162;&#x3002;&#x7ECF;&#x8FC7;&#x6D4B;&#x8BD5;&#xFF0C;&#x4E24;&#x8005;&#x65F6;&#x95F4;&#x67E5;&#x4E0D;&#x4E86;&#x592A;&#x591A;&#x3002;</p>
<p>&#x4E0B;&#x4E00;&#x7BC7;&#x518D;&#x53D9;&#x8FF0;&#xFF0C;&#x5982;&#x4F55;&#x505A;&#x4E00;&#x4E9B;&#x6570;&#x636E;&#x6E05;&#x6D17;&#x4E0E;&#x7B80;&#x5355;&#x7684;&#x5206;&#x6790;&#x3002;</p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x6CE8;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/lyric-generation-1/">&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x505A;&#x6B4C;&#x8BCD;&#x751F;&#x6210;&#x5668; - 0 - &#x6293;&#x53D6;&#x7F51;&#x6613;&#x4E91;3&#x4E07;&#x9996;&#x6B4C;&#x8BCD;</a></p>
<!--kg-card-end: markdown-->
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Latex 技巧汇总]]></title><description><![CDATA[总结 Latex 使用过程中的一些小技巧，如中文处理、单元格操作等等。]]></description><link>https://gaussic.com/latex-tech/</link><guid isPermaLink="false">6262ab8e5d2e43486650206d</guid><category><![CDATA[Latex]]></category><category><![CDATA[Writing]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Sat, 04 Nov 2017 21:20:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/norway-4766392_1280.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<h4 id="%E4%B8%AD%E8%8B%B1%E6%96%87%E9%BB%98%E8%AE%A4%E5%AD%97%E4%BD%93">&#x4E2D;&#x82F1;&#x6587;&#x9ED8;&#x8BA4;&#x5B57;&#x4F53;</h4>
<img src="https://gaussic.com/content/images/2020/01/norway-4766392_1280.jpg" alt="Latex &#x6280;&#x5DE7;&#x6C47;&#x603B;"><p>&#x4F7F;&#x7528; XeLatex + xeCJK &#x5305;</p>
<p>setmainfont &#x8BBE;&#x7F6E;&#x4E3B;&#x5B57;&#x4F53;&#xFF0C;&#x5373;&#x82F1;&#x6587;&#x5B57;&#x4F53;</p>
<p>setCJKmainfont &#x4E2D;&#x6587;&#x5B57;&#x4F53;</p>
<pre><code>\usepackage{xeCJK}
\setmainfont{Times New Roman}
\setCJKmainfont[BoldFont=Hei]{Hei}
\setCJKmonofont{Hei}
\parindent 2em
</code></pre>
<h4 id="%E5%90%88%E5%B9%B6%E5%8D%95%E5%85%83%E6%A0%BC">&#x5408;&#x5E76;&#x5355;&#x5143;&#x683C;</h4>
<p>&#x8F6C;&#x81EA;&#xFF1A;<a href="http://blog.csdn.net/wzxlovesy/article/details/69063271">http://blog.csdn.net/wzxlovesy/article/details/69063271</a></p>
<p><strong>&#x5408;&#x5E76;&#x4E00;&#x884C;&#x591A;&#x5217;&#x5355;&#x5143;&#x683C;</strong></p>
<p>&#x5408;&#x5E76; 1 &#x884C;&#x591A;&#x5217;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>\multicolumn{cols}{pos}{text}</code> &#x6765;&#x5B9E;&#x73B0;</p>
<pre><code>\documentclass[a4paper,12pt]{report}
\usepackage[UTF8,nopunct]{ctex}

\begin{document}

\begin{table}
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline
		\multicolumn{2}{|c|}{&#x5408;&#x5E76;&#x4E00;&#x884C;&#x4E24;&#x5217;} &amp; &#x4E09; &amp; &#x56DB; \\
		\hline
		1 &amp; 2 &amp; 3 &amp; 4 \\
		\hline
	\end{tabular}
\end{table}

\end{document}
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/latex-1.jpeg" class="kg-image" alt="Latex &#x6280;&#x5DE7;&#x6C47;&#x603B;"></figure>
<!--kg-card-begin: markdown-->
<p><strong>&#x5408;&#x5E76;&#x591A;&#x884C;&#x4E00;&#x5217;&#x5355;&#x5143;&#x683C;</strong></p>
<p>&#x5408;&#x5E76;&#x591A;&#x884C; 1 &#x5217;&#x5355;&#x5143;&#x683C;&#x53EF;&#x4EE5;&#x7528; <code>multirow</code> &#x5305;&#x4E2D;&#x7684; <code>\multirow{rows}{width}{text}</code> &#x6765;&#x5B9E;&#x73B0;</p>
<p>&#x6CE8;&#x610F;&#x8FD9;&#x91CC;&#x7684;&#x7B2C;2&#x4E2A;&#x53C2;&#x6570;&#x662F; <code>{width}</code>&#xFF0C;&#x4E0E; <code>\multicolumn</code> &#x7B2C; 2 &#x4E2A;&#x53C2;&#x6570;&#x4E0D;&#x540C;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x786E;&#x5B9A; <code>{width}</code> &#x9700;&#x8981;&#x586B;&#x4EC0;&#x4E48;&#xFF0C;&#x5C31;&#x5C06;&#x5176;&#x66FF;&#x6362;&#x4E3A; *&#xFF0C;&#x5982;&#x4EE3;&#x7801;&#x4E2D;&#x6240;&#x793A;</p>
<blockquote>
<p>&#x6CE8;&#x610F;&#xFF1A;&#x4E0B;&#x8FF0;&#x4EE3;&#x7801;&#x4E2D;&#x7B2C; 2 &#x884C;&#x8868;&#x683C;&#x7B2C; 1 &#x5217;&#x586B;&#x5165;&#x4E86; ~&#xFF0C;&#x8FD9;&#x4E2A;&#x7B26;&#x53F7;&#x653E;&#x5728;&#x8FD9;&#x91CC;&#x8868;&#x793A;&#x8FD9;&#x4E2A;&#x5355;&#x5143;&#x683C;&#x4EC0;&#x4E48;&#x90FD;&#x4E0D;&#x586B;&#xFF0C;&#x4F46;&#x662F;&#x4E00;&#x5B9A;&#x8981;&#x4FDD;&#x7559;&#x8FD9;&#x4E2A;&#x7A7A;&#x4F4D;&#xFF0C;&#x4E0D;&#x7136;&#x4F1A;&#x4EA7;&#x751F;&#x6587;&#x5B57;&#x53E0;&#x52A0;&#x4E0E;&#x8868;&#x683C;&#x4E0D;&#x5BF9;&#x9F50;&#xFF0C;&#x5404;&#x4F4D;&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x5C1D;&#x8BD5;&#xFF0C;&#x6682;&#x65F6;&#x4E0D;&#x5728;&#x8FD9;&#x91CC;&#x6F14;&#x793A;&#x6548;&#x679C;&#xFF0C;&#x4EE5;&#x514D;&#x6DF7;&#x6DC6;&#x3002;</p>
</blockquote>
<pre><code>\documentclass[a4paper,12pt]{report}
\usepackage[UTF8,nopunct]{ctex}
\usepackage{multirow}

\begin{document}

\begin{table}
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline
		\multirow{2}*{&#x5408;&#x5E76;&#x4E24;&#x884C;&#x4E00;&#x5217;} &amp; &#x4E8C; &amp; &#x4E09; &amp; &#x56DB; \\
		~ &amp; 2 &amp; 3 &amp; 4 \\
		\hline
	\end{tabular}
\end{table}

\end{document}
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/latex-2.jpeg" class="kg-image" alt="Latex &#x6280;&#x5DE7;&#x6C47;&#x603B;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x6CE8;&#x610F;&#x5230;&#x8FD9;&#x91CC;&#x5E76;&#x6CA1;&#x6709;&#x8FDB;&#x884C;&#x5212;&#x7EBF;&#xFF0C;&#x5982;&#x679C;&#x76F4;&#x63A5;&#x5728;&#x7B2C; 1 &#x884C;&#x548C;&#x7B2C; 2 &#x884C;&#x4E4B;&#x95F4;&#x63D2;&#x5165;&#x4E00;&#x4E2A; <code>\hline</code>&#xFF0C;&#x8FD9;&#x6761;&#x5212;&#x7EBF;&#x4F1A;&#x7A7F;&#x8FC7;&#x7B2C; 1 &#x4E2A;&#x5355;&#x5143;&#x683C;</p>
<pre><code>\begin{table}
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline
		\multirow{2}*{&#x5408;&#x5E76;&#x4E24;&#x884C;&#x4E00;&#x5217;} &amp; &#x4E8C; &amp; &#x4E09; &amp; &#x56DB; \\
		~ &amp; 2 &amp; 3 &amp; 4 \\
		\hline
	\end{tabular}
\end{table}
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/latex-3.jpeg" class="kg-image" alt="Latex &#x6280;&#x5DE7;&#x6C47;&#x603B;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x89E3;&#x51B3;&#x65B9;&#x6CD5;&#x662F;&#x5212;&#x4E00;&#x6761;&#x4ECE;&#x7B2C; 2 &#x5217;&#x5F00;&#x59CB;&#x5230;&#x672B;&#x5C3E;&#x7684;&#x6A2A;&#x7EBF;&#xFF0C;&#x4F7F;&#x7528;&#x547D;&#x4EE4; <code>\cline{start-end}</code></p>
<pre><code>\begin{table}
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline
		\multirow{2}*{&#x5408;&#x5E76;&#x4E24;&#x884C;&#x4E00;&#x5217;} &amp; &#x4E8C; &amp; &#x4E09; &amp; &#x56DB; \\
		\cline{2-4}
		~ &amp; 2 &amp; 3 &amp; 4 \\
		\hline
	\end{tabular}
\end{table}
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/latex-4.jpeg" class="kg-image" alt="Latex &#x6280;&#x5DE7;&#x6C47;&#x603B;"></figure>
<!--kg-card-begin: markdown-->
<p><strong>&#x5408;&#x5E76;&#x591A;&#x884C;&#x591A;&#x5217;&#x5355;&#x5143;&#x683C;</strong></p>
<p>&#x5408;&#x5E76;&#x591A;&#x884C;&#x591A;&#x5217;&#x6709;&#x591A;&#x79CD;&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;&#xFF0C;&#x8FD9;&#x91CC;&#x4EC5;&#x63D0;&#x4F9B;&#x4E00;&#x79CD;&#x4E2A;&#x4EBA;&#x4F7F;&#x7528;&#x611F;&#x89C9;&#x6BD4;&#x8F83;&#x65B9;&#x4FBF;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x5373;&#x7EC4;&#x5408; <code>\multicomumn</code> &#x548C; <code>\multirow</code> &#x6765;&#x5B9E;&#x73B0;</p>
<p>&#x4F8B;&#x5982;&#x6211;&#x4EEC;&#x8981;&#x63D2;&#x5165;&#x4E00;&#x4E2A;&#x5408;&#x5E76; 2 &#x884C; 2 &#x5217;&#x7684;&#x5355;&#x5143;&#x683C;</p>
<pre><code>\documentclass[a4paper,12pt]{report}
\usepackage[UTF8,nopunct]{ctex}
\usepackage{multirow}

\begin{document}

\begin{table}
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline
		\multicolumn{2}{|c|}{\multirow{2}*{&#x5408;&#x5E76;&#x4E24;&#x884C;&#x4E24;&#x5217;}}  &amp; &#x4E09; &amp; &#x56DB; \\
		\cline{3-4}
		\multicolumn{2}{|c|}{~} &amp; 3 &amp; 4 \\
		\hline
	\end{tabular}
\end{table}

\end{document}
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/latex-5.jpeg" class="kg-image" alt="Latex &#x6280;&#x5DE7;&#x6C47;&#x603B;"></figure>
<!--kg-card-begin: markdown-->
<blockquote>
<p>&#x6CE8;&#x610F;&#xFF1A;&#x8FD9;&#x91CC;&#x5728;&#x7B2C;&#x4E8C;&#x884C;&#x91C7;&#x7528; <code>\multicolumn</code> &#x6765;&#x8FDB;&#x884C;&#x7A7A;&#x767D;&#x5360;&#x4F4D;&#xFF0C;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x4E00;&#x4E9B;&#x5947;&#x602A;&#x7684;&#x5212;&#x7EBF;&#x884C;&#x4E3A;&#xFF0C;&#x5982;&#x679C;&#x76F4;&#x63A5;&#x91C7;&#x7528; <code>~ &amp;amp; ~ &amp;amp; ...</code> &#x7684;&#x65B9;&#x5F0F;&#x6765;&#x5360;&#x4F4D;&#xFF0C;&#x4F1A;&#x53D7;&#x5230;&#x8868;&#x683C;&#x5212;&#x7EBF;&#x65B9;&#x5F0F; <code>{|c|c|c|c|}</code> &#x7684;&#x5F71;&#x54CD;&#x800C;&#x591A;&#x5212;&#x4E00;&#x6761;&#x7AD6;&#x7EBF;&#xFF0C;&#x5982;&#x4E0B;</p>
</blockquote>
<pre><code>\begin{table}
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline
		\multicolumn{2}{|c|}{\multirow{2}*{&#x5408;&#x5E76;&#x4E24;&#x884C;&#x4E24;&#x5217;}}  &amp; &#x4E09; &amp; &#x56DB; \\
		\cline{3-4}
		~ &amp; ~ &amp; 3 &amp; 4 \\
		\hline
	\end{tabular}
\end{table}
</code></pre>
<!--kg-card-end: markdown-->
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[CNN与RNN中文文本分类-基于TensorFlow实现]]></title><description><![CDATA[本章旨在使用TensorFlow API实现卷积神经网络与循环神经网络文本分类。]]></description><link>https://gaussic.com/text-classification-cnn-rnn/</link><guid isPermaLink="false">626173b75d2e434866501f8f</guid><category><![CDATA[TensorFlow]]></category><category><![CDATA[CNN]]></category><category><![CDATA[RNN]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Tue, 29 Aug 2017 16:28:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/IMG_1246.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/IMG_1246.jpeg" alt="CNN&#x4E0E;RNN&#x4E2D;&#x6587;&#x6587;&#x672C;&#x5206;&#x7C7B;-&#x57FA;&#x4E8E;TensorFlow&#x5B9E;&#x73B0;"><p>&#x4EE3;&#x7801;&#x5730;&#x5740;&#xFF1A;<a href="https://github.com/gaussic/text-classification-cnn-rnn">GitHub - gaussic/text-classification-cnn-rnn</a></p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x6CE8;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/text-classification-cnn-rnn/">CNN &#x4E0E; RNN &#x4E2D;&#x6587;&#x6587;&#x672C;&#x5206;&#x7C7B; - &#x57FA;&#x4E8E; TensorFlow &#x5B9E;&#x73B0;</a></p>
<p>CNN &#x505A;&#x53E5;&#x5B50;&#x5206;&#x7C7B;&#x7684;&#x8BBA;&#x6587;&#x53EF;&#x4EE5;&#x53C2;&#x770B;: <a href="https://arxiv.org/abs/1408.5882">Convolutional Neural Networks for Sentence Classification</a></p>
<p>&#x8FD8;&#x53EF;&#x4EE5;&#x53BB;&#x8BFB; dennybritz &#x7684;&#x535A;&#x5BA2;&#xFF1A;<a href="http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/">Implementing a CNN for Text Classification in TensorFlow</a></p>
<p>&#x4EE5;&#x53CA;&#x5B57;&#x7B26;&#x7EA7; CNN &#x7684;&#x8BBA;&#x6587;&#xFF1A;<a href="https://arxiv.org/abs/1509.01626">Character-level Convolutional Networks for Text Classification</a></p>
<p>&#x5982;&#x4ECA;&#xFF0C;TensorFlow &#x5927;&#x7248;&#x672C;&#x5DF2;&#x7ECF;&#x5347;&#x7EA7;&#x5230;&#x4E86; 1.3&#xFF0C;&#x5BF9;&#x5F88;&#x591A;&#x7684;&#x7F51;&#x7EDC;&#x5C42;&#x5B9E;&#x73B0;&#x4E86;&#x66F4;&#x9AD8;&#x5C42;&#x6B21;&#x7684;&#x5C01;&#x88C5;&#x548C;&#x5B9E;&#x73B0;&#xFF0C;&#x751A;&#x81F3;&#x8FD8;&#x6574;&#x5408;&#x4E86;&#x5982; Keras &#x8FD9;&#x6837;&#x4F18;&#x79C0;&#x7684;&#x4E00;&#x4E9B;&#x9AD8;&#x5C42;&#x6B21;&#x6846;&#x67B6;&#xFF0C;&#x4F7F;&#x5F97;&#x5176;&#x6613;&#x7528;&#x6027;&#x5927;&#x5927;&#x63D0;&#x5347;&#x3002;&#x76F8;&#x6BD4;&#x65E9;&#x8D77;&#x7684;&#x5E95;&#x5C42;&#x4EE3;&#x7801;&#xFF0C;&#x5982;&#x4ECA;&#x7684;&#x5B9E;&#x73B0;&#x66F4;&#x52A0;&#x7B80;&#x6D01;&#x548C;&#x4F18;&#x96C5;&#x3002;</p>
<p>&#x672C;&#x6587;&#x662F;&#x57FA;&#x4E8E; TensorFlow &#x5728;&#x4E2D;&#x6587;&#x6570;&#x636E;&#x96C6;&#x4E0A;&#x7684;&#x7B80;&#x5316;&#x5B9E;&#x73B0;&#xFF0C;&#x4F7F;&#x7528;&#x4E86;&#x5B57;&#x7B26;&#x7EA7; CNN &#x548C; RNN &#x5BF9;&#x4E2D;&#x6587;&#x6587;&#x672C;&#x8FDB;&#x884C;&#x5206;&#x7C7B;&#xFF0C;&#x8FBE;&#x5230;&#x4E86;&#x8F83;&#x597D;&#x7684;&#x6548;&#x679C;&#x3002;</p>
<h3 id>&#x6570;&#x636E;&#x96C6;</h3>
<p>&#x672C;&#x6587;&#x91C7;&#x7528;&#x4E86;&#x6E05;&#x534E; NLP &#x7EC4;&#x63D0;&#x4F9B;&#x7684; THUCNews &#x65B0;&#x95FB;&#x6587;&#x672C;&#x5206;&#x7C7B;&#x6570;&#x636E;&#x96C6;&#x7684;&#x4E00;&#x4E2A;&#x5B50;&#x96C6;&#xFF08;&#x539F;&#x59CB;&#x7684;&#x6570;&#x636E;&#x96C6;&#x5927;&#x7EA6; 74 &#x4E07;&#x7BC7;&#x6587;&#x6863;&#xFF0C;&#x8BAD;&#x7EC3;&#x8D77;&#x6765;&#x9700;&#x8981;&#x82B1;&#x8F83;&#x957F;&#x7684;&#x65F6;&#x95F4;&#xFF09;&#x3002;&#x6570;&#x636E;&#x96C6;&#x8BF7;&#x81EA;&#x884C;&#x5230; <a href="http://thuctc.thunlp.org/">THUCTC&#xFF1A;&#x4E00;&#x4E2A;&#x9AD8;&#x6548;&#x7684;&#x4E2D;&#x6587;&#x6587;&#x672C;&#x5206;&#x7C7B;&#x5DE5;&#x5177;&#x5305;</a> &#x4E0B;&#x8F7D;&#xFF0C;&#x8BF7;&#x9075;&#x5FAA;&#x6570;&#x636E;&#x63D0;&#x4F9B;&#x65B9;&#x7684;&#x5F00;&#x6E90;&#x534F;&#x8BAE;&#x3002;</p>
<p>&#x672C;&#x6B21;&#x8BAD;&#x7EC3;&#x4F7F;&#x7528;&#x4E86;&#x5176;&#x4E2D;&#x7684; 10 &#x4E2A;&#x5206;&#x7C7B;&#xFF0C;&#x6BCF;&#x4E2A;&#x5206;&#x7C7B; 6500 &#x6761;&#x6570;&#x636E;&#x3002;</p>
<p>&#x7C7B;&#x522B;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>&#x4F53;&#x80B2;, &#x8D22;&#x7ECF;, &#x623F;&#x4EA7;, &#x5BB6;&#x5C45;, &#x6559;&#x80B2;, &#x79D1;&#x6280;, &#x65F6;&#x5C1A;, &#x65F6;&#x653F;, &#x6E38;&#x620F;, &#x5A31;&#x4E50;
</code></pre>
<p>&#x8FD9;&#x4E2A;&#x5B50;&#x96C6;&#x53EF;&#x4EE5;&#x5728;&#x6B64;&#x4E0B;&#x8F7D;&#xFF1A;&#x94FE;&#x63A5;: <a href="http://pan.baidu.com/s/1bpq9Eub">http://pan.baidu.com/s/1bpq9Eub</a> &#x5BC6;&#x7801;:ycyw</p>
<p>&#x6570;&#x636E;&#x96C6;&#x5212;&#x5206;&#x5982;&#x4E0B;&#xFF1A;</p>
<ul>
<li>&#x8BAD;&#x7EC3;&#x96C6;: 5000*10</li>
<li>&#x9A8C;&#x8BC1;&#x96C6;: 500*10</li>
<li>&#x6D4B;&#x8BD5;&#x96C6;: 1000*10</li>
</ul>
<!-- -->
<p>&#x4ECE;&#x539F;&#x6570;&#x636E;&#x96C6;&#x751F;&#x6210;&#x5B50;&#x96C6;&#x7684;&#x8FC7;&#x7A0B;&#x8BF7;&#x53C2;&#x770B; <code>helper</code> &#x4E0B;&#x7684;&#x4E24;&#x4E2A;&#x811A;&#x672C;&#x3002;&#x5176;&#x4E2D;&#xFF0C;<code>copy_data.sh</code> &#x7528;&#x4E8E;&#x4ECE;&#x6BCF;&#x4E2A;&#x5206;&#x7C7B;&#x62F7;&#x8D1D; 6500 &#x4E2A;&#x6587;&#x4EF6;&#xFF0C;<code>cnews_group.py</code> &#x7528;&#x4E8E;&#x5C06;&#x591A;&#x4E2A;&#x6587;&#x4EF6;&#x6574;&#x5408;&#x5230;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x4E2D;&#x3002;&#x6267;&#x884C;&#x8BE5;&#x6587;&#x4EF6;&#x540E;&#xFF0C;&#x5F97;&#x5230;&#x4E09;&#x4E2A;&#x6570;&#x636E;&#x6587;&#x4EF6;&#xFF1A;</p>
<ul>
<li>cnews.train.txt: &#x8BAD;&#x7EC3;&#x96C6; (50000 &#x6761;)</li>
<li>cnews.val.txt: &#x9A8C;&#x8BC1;&#x96C6; (5000 &#x6761;)</li>
<li>cnews.test.txt: &#x6D4B;&#x8BD5;&#x96C6; (10000 &#x6761;)</li>
</ul>
<!-- -->
<h3 id>&#x9884;&#x5904;&#x7406;</h3>
<p><code>data/cnews_loader.py</code> &#x4E3A;&#x6570;&#x636E;&#x7684;&#x9884;&#x5904;&#x7406;&#x6587;&#x4EF6;&#x3002;</p>
<ul>
<li><code>read_file()</code>: &#x8BFB;&#x53D6;&#x6587;&#x4EF6;&#x6570;&#x636E;;</li>
<li><code>build_vocab()</code>: &#x6784;&#x5EFA;&#x8BCD;&#x6C47;&#x8868;&#xFF0C;&#x4F7F;&#x7528;&#x5B57;&#x7B26;&#x7EA7;&#x7684;&#x8868;&#x793A;&#xFF0C;&#x8FD9;&#x4E00;&#x51FD;&#x6570;&#x4F1A;&#x5C06;&#x8BCD;&#x6C47;&#x8868;&#x5B58;&#x50A8;&#x4E0B;&#x6765;&#xFF0C;&#x907F;&#x514D;&#x6BCF;&#x4E00;&#x6B21;&#x91CD;&#x590D;&#x5904;&#x7406;;</li>
<li><code>read_vocab()</code>: &#x8BFB;&#x53D6;&#x4E0A;&#x4E00;&#x6B65;&#x5B58;&#x50A8;&#x7684;&#x8BCD;&#x6C47;&#x8868;&#xFF0C;&#x8F6C;&#x6362;&#x4E3A; <code>{&#x8BCD;&#xFF1A;id}</code> &#x8868;&#x793A;;</li>
<li><code>read_category()</code>: &#x5C06;&#x5206;&#x7C7B;&#x76EE;&#x5F55;&#x56FA;&#x5B9A;&#xFF0C;&#x8F6C;&#x6362;&#x4E3A; <code>{&#x7C7B;&#x522B;: id}</code> &#x8868;&#x793A;;</li>
<li><code>to_words()</code>: &#x5C06;&#x4E00;&#x6761;&#x7531; id &#x8868;&#x793A;&#x7684;&#x6570;&#x636E;&#x91CD;&#x65B0;&#x8F6C;&#x6362;&#x4E3A;&#x6587;&#x5B57;;</li>
<li><code>preocess_file()</code>: &#x5C06;&#x6570;&#x636E;&#x96C6;&#x4ECE;&#x6587;&#x5B57;&#x8F6C;&#x6362;&#x4E3A;&#x56FA;&#x5B9A;&#x957F;&#x5EA6;&#x7684; id &#x5E8F;&#x5217;&#x8868;&#x793A;;</li>
<li><code>batch_iter()</code>: &#x4E3A;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x8BAD;&#x7EC3;&#x51C6;&#x5907;&#x7ECF;&#x8FC7; shuffle &#x7684;&#x6279;&#x6B21;&#x7684;&#x6570;&#x636E;&#x3002;</li>
</ul>
<!-- -->
<p>&#x7ECF;&#x8FC7;&#x6570;&#x636E;&#x9884;&#x5904;&#x7406;&#xFF0C;&#x6570;&#x636E;&#x7684;&#x683C;&#x5F0F;&#x5982;&#x4E0B;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>Data</th>
<th>Shape</th>
<th>Data</th>
<th>Shape</th>
</tr>
</thead>
<tbody>
<tr>
<td>x_train</td>
<td>[50000, 600]</td>
<td>y_train</td>
<td>[50000, 10]</td>
</tr>
<tr>
<td>x_val</td>
<td>[5000, 600]</td>
<td>y_val</td>
<td>[5000, 10]</td>
</tr>
<tr>
<td>x_test</td>
<td>[10000, 600]</td>
<td>y_test</td>
<td>[10000, 10]</td>
</tr>
</tbody>
</table>
<h3 id="cnn">CNN &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</h3>
<h4 id>&#x914D;&#x7F6E;&#x9879;</h4>
<p>CNN &#x53EF;&#x914D;&#x7F6E;&#x7684;&#x53C2;&#x6570;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF0C;&#x5728; <code>cnn_model.py</code> &#x4E2D;&#x3002;</p>
<pre><code class="language-python">class TCNNConfig(object):
    &quot;&quot;&quot;CNN&#x914D;&#x7F6E;&#x53C2;&#x6570;&quot;&quot;&quot;

    embedding_dim = 64      # &#x8BCD;&#x5411;&#x91CF;&#x7EF4;&#x5EA6;
    seq_length = 600        # &#x5E8F;&#x5217;&#x957F;&#x5EA6;
    num_classes = 10        # &#x7C7B;&#x522B;&#x6570;
    num_filters = 128        # &#x5377;&#x79EF;&#x6838;&#x6570;&#x76EE;
    kernel_size = 5         # &#x5377;&#x79EF;&#x6838;&#x5C3A;&#x5BF8;
    vocab_size = 5000       # &#x8BCD;&#x6C47;&#x8868;&#x8FBE;&#x5C0F;

    hidden_dim = 128        # &#x5168;&#x8FDE;&#x63A5;&#x5C42;&#x795E;&#x7ECF;&#x5143;

    dropout_keep_prob = 0.5 # dropout&#x4FDD;&#x7559;&#x6BD4;&#x4F8B;
    learning_rate = 1e-3    # &#x5B66;&#x4E60;&#x7387;

    batch_size = 64         # &#x6BCF;&#x6279;&#x8BAD;&#x7EC3;&#x5927;&#x5C0F;
    num_epochs = 10         # &#x603B;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;

    print_per_batch = 100    # &#x6BCF;&#x591A;&#x5C11;&#x8F6E;&#x8F93;&#x51FA;&#x4E00;&#x6B21;&#x7ED3;&#x679C;
    save_per_batch = 10      # &#x6BCF;&#x591A;&#x5C11;&#x8F6E;&#x5B58;&#x5165;tensorboard
</code></pre>
<h4 id="cnn">CNN &#x6A21;&#x578B;</h4>
<p>&#x5177;&#x4F53;&#x53C2;&#x770B; <code>cnn_model.py</code> &#x7684;&#x5B9E;&#x73B0;&#x3002;</p>
<p>&#x5927;&#x81F4;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/text-classification-cnn-rnn-1.png" class="kg-image" alt="CNN&#x4E0E;RNN&#x4E2D;&#x6587;&#x6587;&#x672C;&#x5206;&#x7C7B;-&#x57FA;&#x4E8E;TensorFlow&#x5B9E;&#x73B0;"></figure>
<!--kg-card-begin: markdown-->
<h4 id>&#x8BAD;&#x7EC3;&#x4E0E;&#x9A8C;&#x8BC1;</h4>
<p>&#x8FD0;&#x884C; <code>python run_cnn.py train</code>&#xFF0C;&#x53EF;&#x4EE5;&#x5F00;&#x59CB;&#x8BAD;&#x7EC3;&#x3002;</p>
<blockquote>
<p>&#x82E5;&#x4E4B;&#x524D;&#x8FDB;&#x884C;&#x8FC7;&#x8BAD;&#x7EC3;&#xFF0C;&#x8BF7;&#x628A; tensorboard/textcnn &#x5220;&#x9664;&#xFF0C;&#x907F;&#x514D; TensorBoard &#x591A;&#x6B21;&#x8BAD;&#x7EC3;&#x7ED3;&#x679C;&#x91CD;&#x53E0;&#x3002;</p>
</blockquote>
<pre><code class="language-python">Configuring CNN model...
Configuring TensorBoard and Saver...
Loading training and validation data...
Time usage: 0:00:14
Training and evaluating...
Epoch: 1
Iter:      0, Train Loss:    2.3, Train Acc:  10.94%, Val Loss:    2.3, Val Acc:   8.92%, Time: 0:00:01 *
Iter:    100, Train Loss:   0.88, Train Acc:  73.44%, Val Loss:    1.2, Val Acc:  68.46%, Time: 0:00:04 *
Iter:    200, Train Loss:   0.38, Train Acc:  92.19%, Val Loss:   0.75, Val Acc:  77.32%, Time: 0:00:07 *
Iter:    300, Train Loss:   0.22, Train Acc:  92.19%, Val Loss:   0.46, Val Acc:  87.08%, Time: 0:00:09 *
Iter:    400, Train Loss:   0.24, Train Acc:  90.62%, Val Loss:    0.4, Val Acc:  88.62%, Time: 0:00:12 *
Iter:    500, Train Loss:   0.16, Train Acc:  96.88%, Val Loss:   0.36, Val Acc:  90.38%, Time: 0:00:15 *
Iter:    600, Train Loss:  0.084, Train Acc:  96.88%, Val Loss:   0.35, Val Acc:  91.36%, Time: 0:00:17 *
Iter:    700, Train Loss:   0.21, Train Acc:  93.75%, Val Loss:   0.26, Val Acc:  92.58%, Time: 0:00:20 *
Epoch: 2
Iter:    800, Train Loss:   0.07, Train Acc:  98.44%, Val Loss:   0.24, Val Acc:  94.12%, Time: 0:00:23 *
Iter:    900, Train Loss:  0.092, Train Acc:  96.88%, Val Loss:   0.27, Val Acc:  92.86%, Time: 0:00:25
Iter:   1000, Train Loss:   0.17, Train Acc:  95.31%, Val Loss:   0.28, Val Acc:  92.82%, Time: 0:00:28
Iter:   1100, Train Loss:    0.2, Train Acc:  93.75%, Val Loss:   0.23, Val Acc:  93.26%, Time: 0:00:31
Iter:   1200, Train Loss:  0.081, Train Acc:  98.44%, Val Loss:   0.25, Val Acc:  92.96%, Time: 0:00:33
Iter:   1300, Train Loss:  0.052, Train Acc: 100.00%, Val Loss:   0.24, Val Acc:  93.58%, Time: 0:00:36
Iter:   1400, Train Loss:    0.1, Train Acc:  95.31%, Val Loss:   0.22, Val Acc:  94.12%, Time: 0:00:39
Iter:   1500, Train Loss:   0.12, Train Acc:  98.44%, Val Loss:   0.23, Val Acc:  93.58%, Time: 0:00:41
Epoch: 3
Iter:   1600, Train Loss:    0.1, Train Acc:  96.88%, Val Loss:   0.26, Val Acc:  92.34%, Time: 0:00:44
Iter:   1700, Train Loss:  0.018, Train Acc: 100.00%, Val Loss:   0.22, Val Acc:  93.46%, Time: 0:00:47
Iter:   1800, Train Loss:  0.036, Train Acc: 100.00%, Val Loss:   0.28, Val Acc:  92.72%, Time: 0:00:50
No optimization for a long time, auto-stopping...
</code></pre>
<p>&#x5728;&#x9A8C;&#x8BC1;&#x96C6;&#x4E0A;&#x7684;&#x6700;&#x4F73;&#x6548;&#x679C;&#x4E3A; 94.12%&#xFF0C;&#x4E14;&#x53EA;&#x7ECF;&#x8FC7;&#x4E86; 3 &#x8F6E;&#x8FED;&#x4EE3;&#x5C31;&#x5DF2;&#x7ECF;&#x505C;&#x6B62;&#x3002;</p>
<p>&#x51C6;&#x786E;&#x7387;&#x548C;&#x8BEF;&#x5DEE;&#x5982;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/text-classification-cnn-rnn-2.png" class="kg-image" alt="CNN&#x4E0E;RNN&#x4E2D;&#x6587;&#x6587;&#x672C;&#x5206;&#x7C7B;-&#x57FA;&#x4E8E;TensorFlow&#x5B9E;&#x73B0;"></figure>
<!--kg-card-begin: markdown-->
<h4 id>&#x6D4B;&#x8BD5;</h4>
<p>&#x8FD0;&#x884C; <code>python run_cnn.py test</code> &#x5728;&#x6D4B;&#x8BD5;&#x96C6;&#x4E0A;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#x3002;</p>
<pre><code class="language-python">Configuring CNN model...
Loading test data...
Testing...
Test Loss:   0.14, Test Acc:  96.04%
Precision, Recall and F1-Score...
             precision    recall  f1-score   support

         &#x4F53;&#x80B2;       0.99      0.99      0.99      1000
         &#x8D22;&#x7ECF;       0.96      0.99      0.97      1000
         &#x623F;&#x4EA7;       1.00      1.00      1.00      1000
         &#x5BB6;&#x5C45;       0.95      0.91      0.93      1000
         &#x6559;&#x80B2;       0.95      0.89      0.92      1000
         &#x79D1;&#x6280;       0.94      0.97      0.95      1000
         &#x65F6;&#x5C1A;       0.95      0.97      0.96      1000
         &#x65F6;&#x653F;       0.94      0.94      0.94      1000
         &#x6E38;&#x620F;       0.97      0.96      0.97      1000
         &#x5A31;&#x4E50;       0.95      0.98      0.97      1000

avg / total       0.96      0.96      0.96     10000

Confusion Matrix...
[[991   0   0   0   2   1   0   4   1   1]
 [  0 992   0   0   2   1   0   5   0   0]
 [  0   1 996   0   1   1   0   0   0   1]
 [  0  14   0 912   7  15   9  29   3  11]
 [  2   9   0  12 892  22  18  21  10  14]
 [  0   0   0  10   1 968   4   3  12   2]
 [  1   0   0   9   4   4 971   0   2   9]
 [  1  16   0   4  18  12   1 941   1   6]
 [  2   4   1   5   4   5  10   1 962   6]
 [  1   0   1   6   4   3   5   0   1 979]]
Time usage: 0:00:05
</code></pre>
<p>&#x5728;&#x6D4B;&#x8BD5;&#x96C6;&#x4E0A;&#x7684;&#x51C6;&#x786E;&#x7387;&#x8FBE;&#x5230;&#x4E86; 96.04%&#xFF0C;&#x4E14;&#x5404;&#x7C7B;&#x7684; precision, recall &#x548C; f1-score &#x90FD;&#x8D85;&#x8FC7;&#x4E86; 0.9&#x3002;</p>
<p>&#x4ECE;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#x4E5F;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x5206;&#x7C7B;&#x6548;&#x679C;&#x975E;&#x5E38;&#x4F18;&#x79C0;&#x3002;</p>
<h3 id="rnn">RNN&#x5FAA;&#x73AF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</h3>
<h4 id>&#x914D;&#x7F6E;&#x9879;</h4>
<p>RNN &#x53EF;&#x914D;&#x7F6E;&#x7684;&#x53C2;&#x6570;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF0C;&#x5728; <code>rnn_model.py</code> &#x4E2D;&#x3002;</p>
<pre><code class="language-python">class TRNNConfig(object):
    &quot;&quot;&quot;RNN&#x914D;&#x7F6E;&#x53C2;&#x6570;&quot;&quot;&quot;

    # &#x6A21;&#x578B;&#x53C2;&#x6570;
    embedding_dim = 64      # &#x8BCD;&#x5411;&#x91CF;&#x7EF4;&#x5EA6;
    seq_length = 600        # &#x5E8F;&#x5217;&#x957F;&#x5EA6;
    num_classes = 10        # &#x7C7B;&#x522B;&#x6570;
    vocab_size = 5000       # &#x8BCD;&#x6C47;&#x8868;&#x8FBE;&#x5C0F;

    num_layers= 2           # &#x9690;&#x85CF;&#x5C42;&#x5C42;&#x6570;
    hidden_dim = 128        # &#x9690;&#x85CF;&#x5C42;&#x795E;&#x7ECF;&#x5143;
    rnn = &apos;gru&apos;             # lstm &#x6216; gru

    dropout_keep_prob = 0.8 # dropout&#x4FDD;&#x7559;&#x6BD4;&#x4F8B;
    learning_rate = 1e-3    # &#x5B66;&#x4E60;&#x7387;

    batch_size = 128         # &#x6BCF;&#x6279;&#x8BAD;&#x7EC3;&#x5927;&#x5C0F;
    num_epochs = 10          # &#x603B;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;

    print_per_batch = 100    # &#x6BCF;&#x591A;&#x5C11;&#x8F6E;&#x8F93;&#x51FA;&#x4E00;&#x6B21;&#x7ED3;&#x679C;
    save_per_batch = 10      # &#x6BCF;&#x591A;&#x5C11;&#x8F6E;&#x5B58;&#x5165;tensorboard
</code></pre>
<h4 id="rnn">RNN&#x6A21;&#x578B;</h4>
<p>&#x5177;&#x4F53;&#x53C2;&#x770B; <code>rnn_model.py</code> &#x7684;&#x5B9E;&#x73B0;&#x3002;</p>
<p>&#x5927;&#x81F4;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/text-classification-cnn-rnn-3.png" class="kg-image" alt="CNN&#x4E0E;RNN&#x4E2D;&#x6587;&#x6587;&#x672C;&#x5206;&#x7C7B;-&#x57FA;&#x4E8E;TensorFlow&#x5B9E;&#x73B0;"></figure>
<!--kg-card-begin: markdown-->
<h4 id>&#x8BAD;&#x7EC3;&#x4E0E;&#x9A8C;&#x8BC1;</h4>
<blockquote>
<p>&#x8FD9;&#x90E8;&#x5206;&#x7684;&#x4EE3;&#x7801;&#x4E0E; run_cnn.py &#x6781;&#x4E3A;&#x76F8;&#x4F3C;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5C06;&#x6A21;&#x578B;&#x548C;&#x90E8;&#x5206;&#x76EE;&#x5F55;&#x7A0D;&#x5FAE;&#x4FEE;&#x6539;&#x3002;</p>
</blockquote>
<p>&#x8FD0;&#x884C; <code>python run_rnn.py train</code>&#xFF0C;&#x53EF;&#x4EE5;&#x5F00;&#x59CB;&#x8BAD;&#x7EC3;&#x3002;</p>
<blockquote>
<p>&#x82E5;&#x4E4B;&#x524D;&#x8FDB;&#x884C;&#x8FC7;&#x8BAD;&#x7EC3;&#xFF0C;&#x8BF7;&#x628A; tensorboard/textrnn &#x5220;&#x9664;&#xFF0C;&#x907F;&#x514D; TensorBoard &#x591A;&#x6B21;&#x8BAD;&#x7EC3;&#x7ED3;&#x679C;&#x91CD;&#x53E0;&#x3002;</p>
</blockquote>
<pre><code class="language-python">Configuring RNN model...
Configuring TensorBoard and Saver...
Loading training and validation data...
Time usage: 0:00:14
Training and evaluating...
Epoch: 1
Iter:      0, Train Loss:    2.3, Train Acc:   8.59%, Val Loss:    2.3, Val Acc:  11.96%, Time: 0:00:08 *
Iter:    100, Train Loss:   0.95, Train Acc:  64.06%, Val Loss:    1.3, Val Acc:  53.06%, Time: 0:01:15 *
Iter:    200, Train Loss:   0.61, Train Acc:  79.69%, Val Loss:   0.94, Val Acc:  69.88%, Time: 0:02:22 *
Iter:    300, Train Loss:   0.49, Train Acc:  85.16%, Val Loss:   0.63, Val Acc:  81.44%, Time: 0:03:29 *
Epoch: 2
Iter:    400, Train Loss:   0.23, Train Acc:  92.97%, Val Loss:    0.6, Val Acc:  82.86%, Time: 0:04:36 *
Iter:    500, Train Loss:   0.27, Train Acc:  92.97%, Val Loss:   0.47, Val Acc:  86.72%, Time: 0:05:43 *
Iter:    600, Train Loss:   0.13, Train Acc:  98.44%, Val Loss:   0.43, Val Acc:  87.46%, Time: 0:06:50 *
Iter:    700, Train Loss:   0.24, Train Acc:  91.41%, Val Loss:   0.46, Val Acc:  87.12%, Time: 0:07:57
Epoch: 3
Iter:    800, Train Loss:   0.11, Train Acc:  96.09%, Val Loss:   0.49, Val Acc:  87.02%, Time: 0:09:03
Iter:    900, Train Loss:   0.15, Train Acc:  96.09%, Val Loss:   0.55, Val Acc:  85.86%, Time: 0:10:10
Iter:   1000, Train Loss:   0.17, Train Acc:  96.09%, Val Loss:   0.43, Val Acc:  89.44%, Time: 0:11:18 *
Iter:   1100, Train Loss:   0.25, Train Acc:  93.75%, Val Loss:   0.42, Val Acc:  88.98%, Time: 0:12:25
Epoch: 4
Iter:   1200, Train Loss:   0.14, Train Acc:  96.09%, Val Loss:   0.39, Val Acc:  89.82%, Time: 0:13:32 *
Iter:   1300, Train Loss:    0.2, Train Acc:  96.09%, Val Loss:   0.43, Val Acc:  88.68%, Time: 0:14:38
Iter:   1400, Train Loss:  0.012, Train Acc: 100.00%, Val Loss:   0.37, Val Acc:  90.58%, Time: 0:15:45 *
Iter:   1500, Train Loss:   0.15, Train Acc:  96.88%, Val Loss:   0.39, Val Acc:  90.58%, Time: 0:16:52
Epoch: 5
Iter:   1600, Train Loss:  0.075, Train Acc:  97.66%, Val Loss:   0.41, Val Acc:  89.90%, Time: 0:17:59
Iter:   1700, Train Loss:  0.042, Train Acc:  98.44%, Val Loss:   0.41, Val Acc:  90.08%, Time: 0:19:06
Iter:   1800, Train Loss:   0.08, Train Acc:  97.66%, Val Loss:   0.38, Val Acc:  91.36%, Time: 0:20:13 *
Iter:   1900, Train Loss:  0.089, Train Acc:  98.44%, Val Loss:   0.39, Val Acc:  90.18%, Time: 0:21:20
Epoch: 6
Iter:   2000, Train Loss:  0.092, Train Acc:  96.88%, Val Loss:   0.36, Val Acc:  91.42%, Time: 0:22:27 *
Iter:   2100, Train Loss:  0.062, Train Acc:  98.44%, Val Loss:   0.39, Val Acc:  90.56%, Time: 0:23:34
Iter:   2200, Train Loss:  0.053, Train Acc:  98.44%, Val Loss:   0.39, Val Acc:  90.02%, Time: 0:24:41
Iter:   2300, Train Loss:   0.12, Train Acc:  96.09%, Val Loss:   0.37, Val Acc:  90.84%, Time: 0:25:48
Epoch: 7
Iter:   2400, Train Loss:  0.014, Train Acc: 100.00%, Val Loss:   0.41, Val Acc:  90.38%, Time: 0:26:55
Iter:   2500, Train Loss:   0.14, Train Acc:  96.88%, Val Loss:   0.37, Val Acc:  91.22%, Time: 0:28:01
Iter:   2600, Train Loss:   0.11, Train Acc:  96.88%, Val Loss:   0.43, Val Acc:  89.76%, Time: 0:29:08
Iter:   2700, Train Loss:  0.089, Train Acc:  97.66%, Val Loss:   0.37, Val Acc:  91.18%, Time: 0:30:15
Epoch: 8
Iter:   2800, Train Loss: 0.0081, Train Acc: 100.00%, Val Loss:   0.44, Val Acc:  90.66%, Time: 0:31:22
Iter:   2900, Train Loss:  0.017, Train Acc: 100.00%, Val Loss:   0.44, Val Acc:  89.62%, Time: 0:32:29
Iter:   3000, Train Loss:  0.061, Train Acc:  96.88%, Val Loss:   0.43, Val Acc:  90.04%, Time: 0:33:36
No optimization for a long time, auto-stopping...
</code></pre>
<p>&#x5728;&#x9A8C;&#x8BC1;&#x96C6;&#x4E0A;&#x7684;&#x6700;&#x4F73;&#x6548;&#x679C;&#x4E3A; 91.42%&#xFF0C;&#x7ECF;&#x8FC7;&#x4E86; 8 &#x8F6E;&#x8FED;&#x4EE3;&#x505C;&#x6B62;&#xFF0C;&#x901F;&#x5EA6;&#x76F8;&#x6BD4; CNN &#x6162;&#x5F88;&#x591A;&#x3002;</p>
<p>&#x51C6;&#x786E;&#x7387;&#x548C;&#x8BEF;&#x5DEE;&#x5982;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/text-classification-cnn-rnn-4.png" class="kg-image" alt="CNN&#x4E0E;RNN&#x4E2D;&#x6587;&#x6587;&#x672C;&#x5206;&#x7C7B;-&#x57FA;&#x4E8E;TensorFlow&#x5B9E;&#x73B0;"></figure>
<!--kg-card-begin: markdown-->
<h4 id>&#x6D4B;&#x8BD5;</h4>
<p>&#x8FD0;&#x884C; <code>python run_rnn.py test</code> &#x5728;&#x6D4B;&#x8BD5;&#x96C6;&#x4E0A;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#x3002;</p>
<pre><code class="language-python">Testing...
Test Loss:   0.21, Test Acc:  94.22%
Precision, Recall and F1-Score...
             precision    recall  f1-score   support

         &#x4F53;&#x80B2;       0.99      0.99      0.99      1000
         &#x8D22;&#x7ECF;       0.91      0.99      0.95      1000
         &#x623F;&#x4EA7;       1.00      1.00      1.00      1000
         &#x5BB6;&#x5C45;       0.97      0.73      0.83      1000
         &#x6559;&#x80B2;       0.91      0.92      0.91      1000
         &#x79D1;&#x6280;       0.93      0.96      0.94      1000
         &#x65F6;&#x5C1A;       0.89      0.97      0.93      1000
         &#x65F6;&#x653F;       0.93      0.93      0.93      1000
         &#x6E38;&#x620F;       0.95      0.97      0.96      1000
         &#x5A31;&#x4E50;       0.97      0.96      0.97      1000

avg / total       0.94      0.94      0.94     10000

Confusion Matrix...
[[988   0   0   0   4   0   2   0   5   1]
 [  0 990   1   1   1   1   0   6   0   0]
 [  0   2 996   1   1   0   0   0   0   0]
 [  2  71   1 731  51  20  88  28   3   5]
 [  1   3   0   7 918  23   4  31   9   4]
 [  1   3   0   3   0 964   3   5  21   0]
 [  1   0   1   7   1   3 972   0   6   9]
 [  0  16   0   0  22  26   0 931   2   3]
 [  2   3   0   0   2   2  12   0 972   7]
 [  0   3   1   1   7   3  11   5   9 960]]
Time usage: 0:00:33
</code></pre>
<p>&#x5728;&#x6D4B;&#x8BD5;&#x96C6;&#x4E0A;&#x7684;&#x51C6;&#x786E;&#x7387;&#x8FBE;&#x5230;&#x4E86; 94.22%&#xFF0C;&#x4E14;&#x5404;&#x7C7B;&#x7684; precision, recall &#x548C; f1-score&#xFF0C;&#x9664;&#x4E86;&#x5BB6;&#x5C45;&#x8FD9;&#x4E00;&#x7C7B;&#x522B;&#xFF0C;&#x90FD;&#x8D85;&#x8FC7;&#x4E86; 0.9&#x3002;</p>
<p>&#x4ECE;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x5206;&#x7C7B;&#x6548;&#x679C;&#x975E;&#x5E38;&#x4F18;&#x79C0;&#x3002;</p>
<p>&#x5BF9;&#x6BD4;&#x4E24;&#x4E2A;&#x6A21;&#x578B;&#xFF0C;&#x53EF;&#x89C1; RNN &#x9664;&#x4E86;&#x5728;&#x5BB6;&#x5C45;&#x5206;&#x7C7B;&#x7684;&#x8868;&#x73B0;&#x4E0D;&#x662F;&#x5F88;&#x7406;&#x60F3;&#xFF0C;&#x5176;&#x4ED6;&#x51E0;&#x4E2A;&#x7C7B;&#x522B;&#x8F83; CNN &#x5DEE;&#x522B;&#x4E0D;&#x5927;&#x3002;</p>
<p>&#x8FD8;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FDB;&#x4E00;&#x6B65;&#x7684;&#x8C03;&#x8282;&#x53C2;&#x6570;&#xFF0C;&#x6765;&#x8FBE;&#x5230;&#x66F4;&#x597D;&#x7684;&#x6548;&#x679C;&#x3002;</p>
<!--kg-card-end: markdown-->
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[使用TensorFlow训练循环神经网络语言模型]]></title><description><![CDATA[读了将近一个下午的TensorFlow Recurrent Neural Network教程，翻看其在PTB上的实现，感觉晦涩难懂，因此参考了部分代码，自己写了一个简化版的Language Model，思路借鉴了Keras的LSTM text generation。]]></description><link>https://gaussic.com/tensorflow-language-model/</link><guid isPermaLink="false">626173b75d2e434866501f8e</guid><category><![CDATA[TensorFlow]]></category><category><![CDATA[RNN]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Thu, 24 Aug 2017 10:27:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/IMG_1202--1-.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/IMG_1202--1-.jpeg" alt="&#x4F7F;&#x7528;TensorFlow&#x8BAD;&#x7EC3;&#x5FAA;&#x73AF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x8BED;&#x8A00;&#x6A21;&#x578B;"><p>&#x8BFB;&#x4E86;&#x5C06;&#x8FD1;&#x4E00;&#x4E2A;&#x4E0B;&#x5348;&#x7684; <a href="https://www.tensorflow.org/tutorials/recurrent">TensorFlow Recurrent Neural Network</a> &#x6559;&#x7A0B;&#xFF0C;&#x7FFB;&#x770B;&#x5176;&#x5728; <a href="https://github.com/tensorflow/models/tree/master/tutorials/rnn/ptb">PTB</a> &#x4E0A;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x611F;&#x89C9;&#x6666;&#x6DA9;&#x96BE;&#x61C2;&#xFF0C;&#x56E0;&#x6B64;&#x53C2;&#x8003;&#x4E86;&#x90E8;&#x5206;&#x4EE3;&#x7801;&#xFF0C;&#x81EA;&#x5DF1;&#x5199;&#x4E86;&#x4E00;&#x4E2A;&#x7B80;&#x5316;&#x7248;&#x7684; Language Model&#xFF0C;&#x601D;&#x8DEF;&#x501F;&#x9274;&#x4E86; Keras &#x7684; <a href="https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py">LSTM text generation</a>&#x3002;</p>
<p>&#x4EE3;&#x7801;&#x5730;&#x5740;&#xFF1A;<a href="https://github.com/gaussic/tf-rnnlm">GitHub - gaussic/tf-rnnlm</a></p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x6CE8;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/tensorflow-language-model/">&#x4F7F;&#x7528; TensorFlow &#x8BAD;&#x7EC3;&#x5FAA;&#x73AF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x8BED;&#x8A00;&#x6A21;&#x578B;</a></p>
<h4 id>&#x8BED;&#x8A00;&#x6A21;&#x578B;</h4>
<p>Language Model&#xFF0C;&#x5373;&#x8BED;&#x8A00;&#x6A21;&#x578B;&#xFF0C;&#x5176;&#x4E3B;&#x8981;&#x601D;&#x60F3;&#x662F;&#xFF0C;&#x5728;&#x77E5;&#x9053;&#x524D;&#x4E00;&#x90E8;&#x5206;&#x7684;&#x8BCD;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x63A8;&#x65AD;&#x51FA;&#x4E0B;&#x4E00;&#x4E2A;&#x6700;&#x6709;&#x53EF;&#x80FD;&#x51FA;&#x73B0;&#x7684;&#x8BCD;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x77E5;&#x9053;&#x4E86; <code>The fat cat sat on the</code>&#xFF0C;&#x6211;&#x4EEC;&#x8BA4;&#x4E3A;&#x4E0B;&#x4E00;&#x4E2A;&#x8BCD;&#x4E3A; <code>mat</code> &#x7684;&#x53EF;&#x80FD;&#x6027;&#x6BD4; <code>hat</code> &#x8981;&#x5927;&#xFF0C;&#x56E0;&#x4E3A;&#x732B;&#x66F4;&#x6709;&#x53EF;&#x80FD;&#x5750;&#x5728;&#x6BEF;&#x5B50;&#x4E0A;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x5E3D;&#x5B50;&#x4E0A;&#x3002;</p>
<p>&#x8FD9;&#x53EF;&#x80FD;&#x88AB;&#x4F60;&#x8BA4;&#x4E3A;&#x662F;&#x5E38;&#x8BC6;&#xFF0C;&#x4F46;&#x662F;&#x5728;&#x81EA;&#x7136;&#x8BED;&#x8A00;&#x5904;&#x7406;&#x4E2D;&#xFF0C;&#x8FD9;&#x4E2A;&#x4EFB;&#x52A1;&#x662F;&#x53EF;&#x4EE5;&#x7528;&#x6982;&#x7387;&#x7EDF;&#x8BA1;&#x6A21;&#x578B;&#x6765;&#x63CF;&#x8FF0;&#x7684;&#x3002;&#x5C31;&#x62FF; <code>The fat cat sat on the mat</code> &#x6765;&#x8BF4;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x80FD;&#x7EDF;&#x8BA1;&#x51FA;&#x7B2C;&#x4E00;&#x4E2A;&#x8BCD; <code>The</code> &#x51FA;&#x73B0;&#x7684;&#x6982;&#x7387; $p(The)$ &#xFF0C;<code>The</code> &#x540E;&#x9762;&#x662F; <code>fat</code> &#x7684;&#x6761;&#x4EF6;&#x6982;&#x7387;&#x4E3A; $p(fat|The)$ &#xFF0C;<code>The fat</code> &#x540C;&#x65F6;&#x51FA;&#x73B0;&#x7684;&#x8054;&#x5408;&#x6982;&#x7387;&#xFF1A;</p>
<p>$$<br>
p(The, fat) = p(The)&#xB7;p(fat|The)<br>
$$</p>
<p>&#x8FD9;&#x4E2A;&#x8054;&#x5408;&#x6982;&#x7387;&#xFF0C;&#x5C31;&#x662F; <code>The fat</code> &#x7684;&#x5408;&#x7406;&#x6027;&#xFF0C;&#x5373;&#x8FD9;&#x53E5;&#x8BDD;&#x7684;&#x51FA;&#x73B0;&#x7B26;&#x4E0D;&#x7B26;&#x5408;&#x81EA;&#x7136;&#x8BED;&#x8A00;&#x7684;&#x8BC4;&#x5224;&#x6807;&#x51C6;&#xFF0C;&#x901A;&#x4FD7;&#x70B9;&#x8868;&#x8FF0;&#x5C31;&#x662F;&#x8FD9;&#x662F;&#x4E0D;&#x662F;&#x53E5;&#x4EBA;&#x8BDD;&#x3002;&#x540C;&#x7406;&#xFF0C;&#x6839;&#x636E;&#x94FE;&#x5F0F;&#x89C4;&#x5219;&#xFF0C;<code>The fat cat</code> &#x7684;&#x8054;&#x5408;&#x6982;&#x7387;&#x53EF;&#x6C42;&#xFF1A;</p>
<p>$$<br>
p(The, fat, cat) = p(The)&#xB7;p(fat|The)&#xB7;p(cat|The, fat)<br>
$$</p>
<p>&#x5728;&#x77E5;&#x9053;&#x524D;&#x9762;&#x7684;&#x8BCD;&#x4E3A; <code>The cat</code> &#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E0B;&#x4E00;&#x4E2A;&#x8BCD;&#x4E3A; <code>cat</code> &#x7684;&#x6982;&#x7387;&#x53EF;&#x4EE5;&#x63A8;&#x5BFC;&#x51FA;&#x6765;&#xFF1A;</p>
<p>$$<br>
p(cat|The, fat) = \frac{p(The, fat, cat)}{p(The, fat)}<br>
$$</p>
<p>&#x5206;&#x5B50;&#x662F; <code>The fat cat</code> &#x5728;&#x8BED;&#x6599;&#x5E93;&#x4E2D;&#x51FA;&#x73B0;&#x7684;&#x6B21;&#x6570;&#xFF0C;&#x5206;&#x6BCD;&#x662F; <code>The fat</code> &#x5728;&#x8BED;&#x6599;&#x5E93;&#x4E2D;&#x51FA;&#x73B0;&#x7684;&#x6B21;&#x6570;&#x3002;</p>
<p>&#x56E0;&#x6B64;&#xFF0C;<code>The fat cat sat on the mat</code> &#x6574;&#x4E2A;&#x53E5;&#x5B50;&#x7684;&#x5408;&#x7406;&#x6027;&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x63A8;&#x5BFC;&#xFF0C;&#x8FD9;&#x4E2A;&#x53E5;&#x5B50;&#x7684;&#x5408;&#x7406;&#x6027;&#x5373;&#x4E3A;&#x5B83;&#x7684;&#x6982;&#x7387;&#x3002;&#x516C;&#x5F0F;&#x5316;&#x7684;&#x63CF;&#x8FF0;&#x5982;&#x4E0B;&#xFF1A;</p>
<p>$$<br>
p(S) = p(w_1, w_2, &#xB7;&#xB7;&#xB7;, w_n) = p(w_1)&#xB7;p(w_2|w_1)&#xB7;p(w_3|w_1, w_2)&#xB7;&#xB7;&#xB7;p(w_n|w_1, w_2, w_3, &#xB7;&#xB7;&#xB7;, w_{n-1})<br>
$$</p>
<p>&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x6BCF;&#x5F53;&#x8BA1;&#x7B97;&#x4E0B;&#x4E00;&#x4E2A;&#x8BCD;&#x7684;&#x6761;&#x4EF6;&#x6982;&#x7387;&#xFF0C;&#x9700;&#x8981;&#x8BA1;&#x7B97;&#x524D;&#x9762;&#x6240;&#x6709;&#x8BCD;&#x7684;&#x8054;&#x5408;&#x6982;&#x7387;&#x3002;&#x8FD9;&#x4E2A;&#x8BA1;&#x7B97;&#x91CF;&#x76F8;&#x5F53;&#x7684;&#x5E9E;&#x5927;&#x3002;&#x5E76;&#x4E14;&#xFF0C;&#x4E00;&#x4E2A;&#x53E5;&#x5B50;&#x4E2D;&#x5927;&#x90E8;&#x5206;&#x8BCD;&#x540C;&#x65F6;&#x51FA;&#x73B0;&#x7684;&#x6982;&#x7387;&#x5F80;&#x5F80;&#x5C11;&#x4E4B;&#x53C8;&#x5C11;&#xFF0C;&#x6570;&#x636E;&#x7A00;&#x758F;&#x975E;&#x5E38;&#x4E25;&#x91CD;&#xFF0C;&#x9700;&#x8981;&#x4E00;&#x4E2A;&#x975E;&#x5E38;&#x5927;&#x7684;&#x8BED;&#x6599;&#x5E93;&#x6765;&#x8BAD;&#x7EC3;&#x3002;</p>
<p>&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F18;&#x5316;&#x662F;&#x57FA;&#x4E8E;&#x9A6C;&#x5C14;&#x79D1;&#x592B;&#x5047;&#x8BBE;&#xFF0C;&#x4E0B;&#x4E00;&#x4E2A;&#x8BCD;&#x7684;&#x51FA;&#x73B0;&#x4EC5;&#x4E0E;&#x524D;&#x9762;&#x7684;&#x4E00;&#x4E2A;&#x6216; n &#x4E2A;&#x8BCD;&#x6709;&#x5173;&#x3002;</p>
<p>&#x6700;&#x7B80;&#x5355;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x4E0B;&#x4E00;&#x4E2A;&#x8BCD;&#x7684;&#x51FA;&#x73B0;&#x4EC5;&#x4EC5;&#x548C;&#x524D;&#x9762;&#x4E00;&#x4E2A;&#x8BCD;&#x6709;&#x5173;&#xFF0C;&#x79F0;&#x4E4B;&#x4E3A; bigram&#x3002;</p>
<p>$$<br>
p(S) = p(w_1, w_2, &#xB7;&#xB7;&#xB7;, w_n) = p(w_1)&#xB7;p(w_2|w_1)&#xB7;p(w_3|w_2)&#xB7;p(w_4|w_3)&#xB7;&#xB7;&#xB7;p(w_n|w_{n-1})<br>
$$</p>
<p>&#x518D;&#x590D;&#x6742;&#x70B9;&#xFF0C;&#x4E0B;&#x4E00;&#x4E2A;&#x8BCD;&#x7684;&#x51FA;&#x73B0;&#x4EC5;&#x548C;&#x524D;&#x9762;&#x4E24;&#x4E2A;&#x8BCD;&#x6709;&#x5173;&#xFF0C;&#x79F0;&#x4E4B;&#x4E3A; trigram&#x3002;</p>
<p>$$<br>
p(S) = p(w_1, w_2, &#xB7;&#xB7;&#xB7;, w_n) = p(w_1)&#xB7;p(w_2|w_1)&#xB7;p(w_3|w_1, w_2)&#xB7;p(w_4|w_2, w_3)&#xB7;&#xB7;&#xB7;p(w_n|w_n-2, w_{n-1})<br>
$$</p>
<p>&#x8FD9;&#x6837;&#x7684;&#x6761;&#x4EF6;&#x6982;&#x7387;&#x867D;&#x7136;&#x597D;&#x6C42;&#xFF0C;&#x4F46;&#x662F;&#x4F1A;&#x4E22;&#x5931;&#x5927;&#x91CF;&#x7684;&#x524D;&#x9762;&#x7684;&#x8BCD;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x6709;&#x65F6;&#x4F1A;&#x5BF9;&#x7ED3;&#x679C;&#x4EA7;&#x751F;&#x4E0D;&#x826F;&#x5F71;&#x54CD;&#x3002;&#x56E0;&#x6B64;&#x5982;&#x4F55;&#x9009;&#x62E9;&#x4E00;&#x4E2A;&#x6709;&#x6548;&#x7684; n&#xFF0C;&#x4F7F;&#x5F97;&#x65E2;&#x80FD;&#x7B80;&#x5316;&#x8BA1;&#x7B97;&#xFF0C;&#x53C8;&#x80FD;&#x4FDD;&#x7559;&#x5927;&#x90E8;&#x5206;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x4EE5;&#x4E0A;&#x5747;&#x662F;&#x4F20;&#x7EDF;&#x8BED;&#x8A00;&#x6A21;&#x578B;&#x7684;&#x63CF;&#x8FF0;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x592A;&#x6DF1;&#x7A76;&#x7EC6;&#x8282;&#xFF0C;&#x6211;&#x4EEC;&#x7684;&#x4EFB;&#x52A1;&#x5C31;&#x662F;&#xFF0C;&#x77E5;&#x9053;&#x524D;&#x9762; n &#x4E2A;&#x8BCD;&#xFF0C;&#x6765;&#x8BA1;&#x7B97;&#x4E0B;&#x4E00;&#x4E2A;&#x8BCD;&#x51FA;&#x73B0;&#x7684;&#x6982;&#x7387;&#x3002;&#x5E76;&#x4E14;&#x4F7F;&#x7528;&#x8BED;&#x8A00;&#x6A21;&#x578B;&#x6765;&#x751F;&#x6210;&#x65B0;&#x7684;&#x6587;&#x672C;&#x3002;</p>
<p>&#x5728;&#x672C;&#x6587;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x66F4;&#x52A0;&#x5173;&#x6CE8;&#x7684;&#x662F;&#xFF0C;&#x5982;&#x4F55;&#x4F7F;&#x7528; RNN &#x6765;&#x63A8;&#x6D4B;&#x4E0B;&#x4E00;&#x4E2A;&#x8BCD;&#x3002;</p>
<h4 id>&#x6570;&#x636E;&#x51C6;&#x5907;</h4>
<p>TensorFlow &#x7684;&#x5B98;&#x65B9;&#x6587;&#x6863;&#x4F7F;&#x7528;&#x7684;&#x662F; Mikolov &#x51C6;&#x5907;&#x597D;&#x7684; PTB &#x6570;&#x636E;&#x96C6;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x5176;&#x4E0B;&#x8F7D;&#x5E76;&#x89E3;&#x538B;&#x51FA;&#x6765;&#xFF1A;</p>
<pre><code class="language-bash">$ wget http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz
$ tar xvf simple-examples.tgz
</code></pre>
<p>&#x90E8;&#x5206;&#x6570;&#x636E;&#x5982;&#x4E0B;&#xFF0C;&#x4E0D;&#x5E38;&#x7528;&#x7684;&#x8BCD;&#x8F6C;&#x6362;&#x6210;&#x4E86; <code>&amp;lt;unk&amp;gt;</code> &#x6807;&#x8BB0;&#xFF0C;&#x6570;&#x5B57;&#x8F6C;&#x6362;&#x6210;&#x4E86; N&#xFF1A;</p>
<pre><code>we &apos;re talking about years ago before anyone heard of asbestos having any questionable properties
there is no asbestos in our products now
neither &lt;unk&gt; nor the researchers who studied the workers were aware of any research on smokers of the kent cigarettes
we have no useful information on whether users are at risk said james a. &lt;unk&gt; of boston &apos;s &lt;unk&gt; cancer institute
the total of N deaths from malignant &lt;unk&gt; lung cancer and &lt;unk&gt; was far higher than expected the researchers said
</code></pre>
<p>&#x8BFB;&#x53D6;&#x6587;&#x4EF6;&#x4E2D;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5C06;&#x6362;&#x884C;&#x7B26;&#x8F6C;&#x6362;&#x4E3A; <code>&amp;lt;eos&amp;gt;</code>&#xFF0C;&#x7136;&#x540E;&#x8F6C;&#x6362;&#x4E3A;&#x8BCD;&#x7684; list&#xFF1A;</p>
<pre><code class="language-python">def _read_words(filename):
    with open(filename, &apos;r&apos;, encoding=&apos;utf-8&apos;) as f:
        return f.read().replace(&apos;\&apos;, &apos;&lt;eos&gt;&apos;).split()

f = _read_words(&apos;simple-examples/data/ptb.train.txt&apos;)
print(f[:20])
</code></pre>
<p>&#x5F97;&#x5230;&#xFF1A;</p>
<pre><code class="language-python">[&apos;aer&apos;, &apos;banknote&apos;, &apos;berlitz&apos;, &apos;calloway&apos;, &apos;centrust&apos;, &apos;cluett&apos;, &apos;fromstein&apos;, &apos;gitano&apos;, &apos;guterman&apos;, &apos;hydro-quebec&apos;, &apos;ipo&apos;, &apos;kia&apos;, &apos;memotec&apos;, &apos;mlx&apos;, &apos;nahb&apos;, &apos;punts&apos;, &apos;rake&apos;, &apos;regatta&apos;, &apos;rubens&apos;, &apos;sim&apos;]
</code></pre>
<p>&#x6784;&#x5EFA;&#x8BCD;&#x6C47;&#x8868;&#xFF0C;&#x8BCD;&#x4E0E; id &#x4E92;&#x8F6C;&#xFF1A;</p>
<pre><code class="language-python">def _build_vocab(filename):
    data = _read_words(filename)

    counter = Counter(data)
    count_pairs = sorted(counter.items(), key=lambda x: -x[1])

    words, _ = list(zip(*count_pairs))
    word_to_id = dict(zip(words, range(len(words))))

    return words, word_to_id
</code></pre>
<pre><code class="language-python">words, words_to_id = _build_vocab(&apos;simple-examples/data/ptb.train.txt&apos;)
print(words[:10])
print(list(map(lambda x: words_to_id[x], words[:10])))
</code></pre>
<p>&#x8F93;&#x51FA;&#xFF1A;</p>
<pre><code class="language-python">(&apos;the&apos;, &apos;&lt;unk&gt;&apos;, &apos;&lt;eos&gt;&apos;, &apos;N&apos;, &apos;of&apos;, &apos;to&apos;, &apos;a&apos;, &apos;in&apos;, &apos;and&apos;, &quot;&apos;s&quot;)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
</code></pre>
<p>&#x5C06;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x8F6C;&#x6362;&#x4E3A; id &#x8868;&#x793A;&#xFF1A;</p>
<pre><code class="language-python">def _file_to_word_ids(filename, word_to_id):
    data = _read_words(filename)
    return [word_to_id[x] for x in data if x in word_to_id]
</code></pre>
<pre><code class="language-python">words_in_file = _file_to_word_ids(&apos;simple-examples/data/ptb.train.txt&apos;, words_to_id)
print(words_in_file[:20])
</code></pre>
<p>&#x8BCD;&#x6C47;&#x8868;&#x5DF2;&#x6839;&#x636E;&#x8BCD;&#x9891;&#x8FDB;&#x884C;&#x6392;&#x5E8F;&#xFF0C;&#x7531;&#x4E8E;&#x7B2C;&#x4E00;&#x53E5;&#x8BDD;&#x975E;&#x82F1;&#x6587;&#xFF0C;&#x6240;&#x4EE5; id &#x9760;&#x540E;&#x3002;</p>
<pre><code class="language-python">[9980, 9988, 9981, 9989, 9970, 9998, 9971, 9979, 9992, 9997, 9982, 9972, 9993, 9991, 9978, 9983, 9974, 9986, 9999, 9990]
</code></pre>
<p>&#x5C06;&#x4E00;&#x53E5;&#x8BDD;&#x4ECE; id &#x5217;&#x8868;&#x8F6C;&#x6362;&#x56DE;&#x8BCD;&#xFF1A;</p>
<pre><code class="language-python">def to_words(sentence, words):
    return list(map(lambda x: words[x], sentence))
</code></pre>
<p>&#x5C06;&#x4EE5;&#x4E0A;&#x51FD;&#x6570;&#x6574;&#x5408;&#xFF1A;</p>
<pre><code class="language-python">def ptb_raw_data(data_path=None):
    train_path = os.path.join(data_path, &apos;ptb.train.txt&apos;)
    valid_path = os.path.join(data_path, &apos;ptb.valid.txt&apos;)
    test_path = os.path.join(data_path, &apos;ptb.test.txt&apos;)

    words, word_to_id = _build_vocab(train_path)
    train_data = _file_to_word_ids(train_path, word_to_id)
    valid_data = _file_to_word_ids(valid_path, word_to_id)
    test_data = _file_to_word_ids(test_path, word_to_id)

    return train_data, valid_data, test_data, words, word_to_id
</code></pre>
<p>&#x4EE5;&#x4E0A;&#x90E8;&#x5206;&#x548C;&#x5B98;&#x65B9;&#x7684;&#x4F8B;&#x5B50;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x76F8;&#x4F3C;&#x4E4B;&#x5904;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x5904;&#x7406;&#x548C;&#x5B98;&#x65B9;&#x5B58;&#x5728;&#x5F88;&#x5927;&#x7684;&#x4E0D;&#x540C;&#xFF0C;&#x4E3B;&#x8981;&#x53C2;&#x8003;&#x4E86; Keras &#x4F8B;&#x7A0B;&#x5904;&#x7406;&#x6587;&#x6863;&#x7684;&#x64CD;&#x4F5C;&#xFF1A;</p>
<pre><code class="language-python">def ptb_producer(raw_data, batch_size=64, num_steps=20, stride=1):
    data_len = len(raw_data)

    sentences = []
    next_words = []
    for i in range(0, data_len - num_steps, stride):
        sentences.append(raw_data[i:(i + num_steps)])
        next_words.append(raw_data[i + num_steps])

    sentences = np.array(sentences)
    next_words = np.array(next_words)

    batch_len = len(sentences) // batch_size
    x = np.reshape(sentences[:(batch_len * batch_size)], \\
        [batch_len, batch_size, -1])

    y = np.reshape(next_words[:(batch_len * batch_size)], \\
        [batch_len, batch_size])

    return x, y
</code></pre>
<p>&#x53C2;&#x6570;&#x89E3;&#x6790;&#xFF1A;</p>
<ul>
<li>raw_data: &#x5373; <code>ptb_raw_data()</code> &#x51FD;&#x6570;&#x4EA7;&#x751F;&#x7684;&#x6570;&#x636E;</li>
<li>batch_size: &#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x4F7F;&#x7528;&#x968F;&#x673A;&#x68AF;&#x5EA6;&#x4E0B;&#x964D;&#xFF0C;&#x6570;&#x636E;&#x6309;&#x591A;&#x4E2A;&#x6279;&#x6B21;&#x8F93;&#x51FA;&#xFF0C;&#x6B64;&#x4E3A;&#x6BCF;&#x4E2A;&#x6279;&#x6B21;&#x7684;&#x6570;&#x636E;&#x91CF;</li>
<li>num_steps: &#x6BCF;&#x4E2A;&#x53E5;&#x5B50;&#x7684;&#x957F;&#x5EA6;&#xFF0C;&#x76F8;&#x5F53;&#x4E8E;&#x4E4B;&#x524D;&#x63CF;&#x8FF0;&#x7684; n &#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x8FD9;&#x5728;&#x5FAA;&#x73AF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x4E2D;&#x53C8;&#x79F0;&#x4E3A;&#x65F6;&#x5E8F;&#x7684;&#x957F;&#x5EA6;&#x3002;</li>
<li>stride: &#x53D6;&#x6570;&#x636E;&#x7684;&#x6B65;&#x957F;&#xFF0C;&#x51B3;&#x5B9A;&#x6570;&#x636E;&#x91CF;&#x7684;&#x5927;&#x5C0F;&#x3002;</li>
</ul>
<p>&#x4EE3;&#x7801;&#x89E3;&#x6790;&#xFF1A;</p>
<p>&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x5C06;&#x4E00;&#x4E2A;&#x539F;&#x59CB;&#x6570;&#x636E; list &#x8F6C;&#x6362;&#x4E3A;&#x591A;&#x4E2A;&#x6279;&#x6B21;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5373; <code>[batch_len, batch_size, num_steps]</code>&#x3002;</p>
<p>&#x9996;&#x5148;&#xFF0C;&#x7A0B;&#x5E8F;&#x6BCF;&#x4E00;&#x6B21;&#x53D6;&#x4E86; <code>num_steps</code> &#x4E2A;&#x8BCD;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x53E5;&#x5B50;&#xFF0C;&#x5373; x&#xFF0C;&#x4EE5;&#x8FD9; <code>num_steps</code> &#x4E2A;&#x8BCD;&#x540E;&#x9762;&#x7684;&#x4E00;&#x4E2A;&#x8BCD;&#x4F5C;&#x4E3A;&#x5B83;&#x7684;&#x4E0B;&#x4E00;&#x4E2A;&#x9884;&#x6D4B;&#xFF0C;&#x5373;&#x4E3A; y&#x3002;&#x8FD9;&#x6837;&#xFF0C;&#x6211;&#x4EEC;&#x9996;&#x5148;&#x628A;&#x539F;&#x59CB;&#x6570;&#x636E;&#x6574;&#x7406;&#x6210;&#x4E86; <code>batch_len * batch_size</code> &#x4E2A; x &#x548C; y &#x7684;&#x8868;&#x793A;&#xFF0C;&#x7C7B;&#x4F3C;&#x4E8E;&#x5DF2;&#x77E5; x &#x6C42; y &#x7684;&#x5206;&#x7C7B;&#x95EE;&#x9898;&#x3002;</p>
<p>&#x4E3A;&#x4E86;&#x6EE1;&#x8DB3;&#x968F;&#x673A;&#x68AF;&#x5EA6;&#x4E0B;&#x964D;&#x7684;&#x9700;&#x8981;&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x9700;&#x8981;&#x628A;&#x6570;&#x636E;&#x6574;&#x7406;&#x6210;&#x4E00;&#x4E2A;&#x4E2A;&#x5C0F;&#x7684;&#x6279;&#x6B21;&#xFF0C;&#x6BCF;&#x6B21;&#x5582;&#x4E00;&#x4E2A;&#x6279;&#x6B21;&#x7684;&#x6570;&#x636E;&#x7ED9; TensorFlow &#x6765;&#x66F4;&#x65B0;&#x6743;&#x91CD;&#xFF0C;&#x8FD9;&#x6837;&#xFF0C;&#x6570;&#x636E;&#x5C31;&#x6574;&#x7406;&#x4E3A; <code>[batch_len, batch_size, num_steps]</code> &#x7684;&#x683C;&#x5F0F;&#x3002;</p>
<p>&#x6253;&#x5370;&#x90E8;&#x5206;&#x6570;&#x636E;&#xFF1A;</p>
<pre><code class="language-python">train_data, valid_data, test_data, words, word_to_id = ptb_raw_data(&apos;simple-examples/data&apos;)
x_train, y_train = ptb_producer(train_data)
print(x_train.shape)
print(y_train.shape)
</code></pre>
<p>&#x8F93;&#x51FA;&#xFF1A;</p>
<pre><code>(14524, 64, 20)
(14524, 64)
</code></pre>
<p>&#x53EF;&#x89C1;&#x6211;&#x4EEC;&#x5F97;&#x5230;&#x4E86; 14524 &#x4E2A;&#x6279;&#x6B21;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x6BCF;&#x4E2A;&#x6279;&#x6B21;&#x7684;&#x8BAD;&#x7EC3;&#x96C6;&#x7EF4;&#x5EA6;&#x4E3A; [64, 20]&#x3002;</p>
<pre><code class="language-python">print(&apos; &apos;.join(to_words(x_train[100, 3], words)))
</code></pre>
<p>&#x7B2C; 100 &#x4E2A;&#x6279;&#x6B21;&#x7684;&#x7B2C; 3 &#x53E5;&#x8BDD;&#x4E3A;&#xFF1A;</p>
<pre><code>despite steady sales growth &lt;eos&gt; magna recently cut its quarterly dividend in half and the company &apos;s class a shares
</code></pre>
<pre><code class="language-python">print(words[np.argmax(y_train[100, 3])])
</code></pre>
<p>&#x5B83;&#x7684;&#x4E0B;&#x4E00;&#x4E2A;&#x8BCD;&#x4E3A;&#xFF1A;</p>
<pre><code>the
</code></pre>
<h4 id>&#x6784;&#x5EFA;&#x6A21;&#x578B;</h4>
<p><strong>&#x914D;&#x7F6E;&#x9879;</strong></p>
<pre><code class="language-python">class LMConfig(object):
    &quot;&quot;&quot;language model &#x914D;&#x7F6E;&#x9879;&quot;&quot;&quot;
    batch_size = 64       # &#x6BCF;&#x4E00;&#x6279;&#x6570;&#x636E;&#x7684;&#x5927;&#x5C0F;
    num_steps = 20        # &#x6BCF;&#x4E00;&#x4E2A;&#x53E5;&#x5B50;&#x7684;&#x957F;&#x5EA6;
    stride = 3            # &#x53D6;&#x6570;&#x636E;&#x65F6;&#x7684;&#x6B65;&#x957F;

    embedding_dim = 64    # &#x8BCD;&#x5411;&#x91CF;&#x7EF4;&#x5EA6;
    hidden_dim = 128      # RNN&#x9690;&#x85CF;&#x5C42;&#x7EF4;&#x5EA6;
    num_layers = 2        # RNN&#x5C42;&#x6570;

    learning_rate = 0.05  # &#x5B66;&#x4E60;&#x7387;
    dropout = 0.2         # &#x6BCF;&#x4E00;&#x5C42;&#x540E;&#x7684;&#x4E22;&#x5F03;&#x6982;&#x7387;
</code></pre>
<p><strong>&#x8BFB;&#x53D6;&#x8F93;&#x5165;</strong></p>
<p>&#x8BA9;&#x6A21;&#x578B;&#x53EF;&#x4EE5;&#x6309;&#x6279;&#x6B21;&#x7684;&#x8BFB;&#x53D6;&#x6570;&#x636E;&#x3002;</p>
<pre><code class="language-python">class PTBInput(object):
    &quot;&quot;&quot;&#x6309;&#x6279;&#x6B21;&#x8BFB;&#x53D6;&#x6570;&#x636E;&quot;&quot;&quot;
    def __init__(self, config, data):
        self.batch_size = config.batch_size
        self.num_steps = config.num_steps
        self.vocab_size = config.vocab_size # &#x8BCD;&#x6C47;&#x8868;&#x5927;&#x5C0F;

        self.input_data, self.targets = ptb_producer(data,
            self.batch_size, self.num_steps)

        self.batch_len = self.input_data.shape[0] # &#x603B;&#x6279;&#x6B21;
        self.cur_batch = 0  # &#x5F53;&#x524D;&#x6279;&#x6B21;

    def next_batch(self):
        &quot;&quot;&quot;&#x8BFB;&#x53D6;&#x4E0B;&#x4E00;&#x6279;&#x6B21;&quot;&quot;&quot;
        x = self.input_data[self.cur_batch]
        y = self.targets[self.cur_batch]

        # &#x8F6C;&#x6362;&#x4E3A;one-hot&#x7F16;&#x7801;
        y_ = np.zeros((y.shape[0], self.vocab_size), dtype=np.bool)
        for i in range(y.shape[0]):
            y_[i][y[i]] = 1

        # &#x5982;&#x679C;&#x5230;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6279;&#x6B21;&#xFF0C;&#x5219;&#x56DE;&#x5230;&#x6700;&#x5F00;&#x5934;
        self.cur_batch = (self.cur_batch +1) % self.batch_len

        return x, y_
</code></pre>
<p><strong>&#x6A21;&#x578B;</strong></p>
<pre><code class="language-python">class PTBModel(object):
    def __init__(self, config, is_training=True):

        self.num_steps = config.num_steps
        self.vocab_size = config.vocab_size

        self.embedding_dim = config.embedding_dim
        self.hidden_dim = config.hidden_dim
        self.num_layers = config.num_layers
        self.rnn_model = config.rnn_model

        self.learning_rate = config.learning_rate
        self.dropout = config.dropout

        self.placeholders()  # &#x8F93;&#x5165;&#x5360;&#x4F4D;&#x7B26;
        self.rnn()           # rnn &#x6A21;&#x578B;&#x6784;&#x5EFA;
        self.cost()          # &#x4EE3;&#x4EF7;&#x51FD;&#x6570;
        self.optimize()      # &#x4F18;&#x5316;&#x5668;
        self.error()         # &#x9519;&#x8BEF;&#x7387;


    def placeholders(self):
        &quot;&quot;&quot;&#x8F93;&#x5165;&#x6570;&#x636E;&#x7684;&#x5360;&#x4F4D;&#x7B26;&quot;&quot;&quot;
        self._inputs = tf.placeholder(tf.int32, [None, self.num_steps])
        self._targets = tf.placeholder(tf.int32, [None, self.vocab_size])


    def input_embedding(self):
        &quot;&quot;&quot;&#x5C06;&#x8F93;&#x5165;&#x8F6C;&#x6362;&#x4E3A;&#x8BCD;&#x5411;&#x91CF;&#x8868;&#x793A;&quot;&quot;&quot;
        with tf.device(&quot;/cpu:0&quot;):
            embedding = tf.get_variable(
                &quot;embedding&quot;, [self.vocab_size,
                    self.embedding_dim], dtype=tf.float32)
            _inputs = tf.nn.embedding_lookup(embedding, self._inputs)

        return _inputs


    def rnn(self):
        &quot;&quot;&quot;rnn&#x6A21;&#x578B;&#x6784;&#x5EFA;&quot;&quot;&quot;
        def lstm_cell():  # &#x57FA;&#x672C;&#x7684;lstm cell
            return tf.contrib.rnn.BasicLSTMCell(self.hidden_dim,
                state_is_tuple=True)

        def gru_cell():   # gru cell&#xFF0C;&#x901F;&#x5EA6;&#x66F4;&#x5FEB;
            return tf.contrib.rnn.GRUCell(self.hidden_dim)

        def dropout_cell():    # &#x5728;&#x6BCF;&#x4E2A;cell&#x540E;&#x6DFB;&#x52A0;dropout
            if (self.rnn_model == &apos;lstm&apos;):
                cell = lstm_cell()
            else:
                cell = gru_cell()
            return tf.contrib.rnn.DropoutWrapper(cell,
                output_keep_prob=self.dropout)

        cells = [dropout_cell() for _ in range(self.num_layers)]
        cell = tf.contrib.rnn.MultiRNNCell(cells, state_is_tuple=True)  # &#x591A;&#x5C42;rnn

        _inputs = self.input_embedding()
        _outputs, _ = tf.nn.dynamic_rnn(cell=cell,
            inputs=_inputs, dtype=tf.float32)

        # _outputs&#x7684;shape&#x4E3A; [batch_size, num_steps, hidden_dim]
        last = _outputs[:, -1, :]  # &#x53EA;&#x9700;&#x8981;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x8F93;&#x51FA;

        # dense &#x548C; softmax &#x7528;&#x4E8E;&#x5206;&#x7C7B;&#xFF0C;&#x4EE5;&#x627E;&#x51FA;&#x5404;&#x8BCD;&#x7684;&#x6982;&#x7387;
        logits = tf.layers.dense(inputs=last, units=self.vocab_size)   
        prediction = tf.nn.softmax(logits)  

        self._logits = logits
        self._pred = prediction

    def cost(self):
        &quot;&quot;&quot;&#x8BA1;&#x7B97;&#x4EA4;&#x53C9;&#x71B5;&#x4EE3;&#x4EF7;&#x51FD;&#x6570;&quot;&quot;&quot;
        cross_entropy = tf.nn.softmax_cross_entropy_with_logits(
            logits=self._logits, labels=self._targets)
        cost = tf.reduce_mean(cross_entropy)
        self.cost = cost

    def optimize(self):
        &quot;&quot;&quot;&#x4F7F;&#x7528;adam&#x4F18;&#x5316;&#x5668;&quot;&quot;&quot;
        optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate)
        self.optim = optimizer.minimize(self.cost)

    def error(self):
        &quot;&quot;&quot;&#x8BA1;&#x7B97;&#x9519;&#x8BEF;&#x7387;&quot;&quot;&quot;
        mistakes = tf.not_equal(
            tf.argmax(self._targets, 1), tf.argmax(self._pred, 1))
        self.errors = tf.reduce_mean(tf.cast(mistakes, tf.float32))
</code></pre>
<p><strong>&#x8BAD;&#x7EC3;</strong></p>
<pre><code class="language-python">def run_epoch(num_epochs=10):
    config = LMConfig()   # &#x8F7D;&#x5165;&#x914D;&#x7F6E;&#x9879;

    # &#x8F7D;&#x5165;&#x6E90;&#x6570;&#x636E;&#xFF0C;&#x8FD9;&#x91CC;&#x53EA;&#x9700;&#x8981;&#x8BAD;&#x7EC3;&#x96C6;
    train_data, _, _, words, word_to_id = \\
        ptb_raw_data(&apos;simple-examples/data&apos;)
    config.vocab_size = len(words)

    # &#x6570;&#x636E;&#x5206;&#x6279;
    input_train = PTBInput(config, train_data)
    batch_len = input_train.batch_len

    # &#x6784;&#x5EFA;&#x6A21;&#x578B;
    model = PTBModel(config)

    # &#x521B;&#x5EFA;session&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x53D8;&#x91CF;
    sess = tf.Session()
    sess.run(tf.global_variables_initializer())

    print(&apos;Start training...&apos;)
    for epoch in range(num_epochs):  # &#x8FED;&#x4EE3;&#x8F6E;&#x6B21;
        for i in range(batch_len):   # &#x7ECF;&#x8FC7;&#x591A;&#x5C11;&#x4E2A;batch
            x_batch, y_batch = input_train.next_batch()

            # &#x53D6;&#x4E00;&#x4E2A;&#x6279;&#x6B21;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x8FD0;&#x884C;&#x4F18;&#x5316;
            feed_dict = {model._inputs: x_batch, model._targets: y_batch}
            sess.run(model.optim, feed_dict=feed_dict)

            # &#x6BCF;500&#x4E2A;batch&#xFF0C;&#x8F93;&#x51FA;&#x4E00;&#x6B21;&#x4E2D;&#x95F4;&#x7ED3;&#x679C;
            if i % 500 == 0:
                cost = sess.run(model.cost, feed_dict=feed_dict)

                msg = &quot;Epoch: {0:&gt;3}, batch: {1:&gt;6}, Loss: {2:&gt;6.3}&quot;
                print(msg.format(epoch + 1, i + 1, cost))

                # &#x8F93;&#x51FA;&#x90E8;&#x5206;&#x9884;&#x6D4B;&#x7ED3;&#x679C;
                pred = sess.run(model._pred, feed_dict=feed_dict)
                word_ids = sess.run(tf.argmax(pred, 1))
                print(&apos;Predicted:&apos;, &apos; &apos;.join(words[w] for w in word_ids))
                true_ids = np.argmax(y_batch, 1)
                print(&apos;True:&apos;, &apos; &apos;.join(words[w] for w in true_ids))

    print(&apos;Finish training...&apos;)
    sess.close()
</code></pre>
<p>&#x9700;&#x8981;&#x7ECF;&#x8FC7;&#x591A;&#x6B21;&#x7684;&#x8BAD;&#x7EC3;&#x624D;&#x80FD;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x8F83;&#x4E3A;&#x5408;&#x7406;&#x7684;&#x7ED3;&#x679C;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[TensorFlow (5) - TensorBoard 可视化]]></title><description><![CDATA[本章主要说明如何使用TensorBoard进行可视化，以及部分的调参方法。

这是一篇dandelionmane在TensorFlow Dev Summit 2017关于TensorBoard介绍的总结教程。
]]></description><link>https://gaussic.com/tensorflow-tensorboard/</link><guid isPermaLink="false">626173b75d2e434866501f8d</guid><category><![CDATA[TensorFlow]]></category><category><![CDATA[TensorBoard]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Tue, 15 Aug 2017 18:08:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/IMG_0077.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/IMG_0077.jpeg" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"><p>&#x8FD9;&#x662F;&#x4E00;&#x7BC7; dandelionmane &#x5728; <a href="https://www.youtube.com/watch?v=eBbEDRsCmv4">TensorFlow Dev Summit 2017</a> &#x5173;&#x4E8E; TensorBoard &#x4ECB;&#x7ECD;&#x7684;&#x603B;&#x7ED3;&#x6559;&#x7A0B;&#x3002;</p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x8BF4;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/tensorflow-tensorboard/">TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;</a></p>
<p>&#x5728;&#x4E4B;&#x524D;&#x7684;&#x7AE0;&#x8282;&#x4E2D;&#xFF0C;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x7684;&#x6027;&#x80FD;&#x8BC4;&#x4F30;&#x90FD;&#x662F;&#x901A;&#x8FC7;&#x6253;&#x5370;&#x4E2D;&#x95F4;&#x7ED3;&#x679C;&#x5B57;&#x7B26;&#x4E32;&#x6765;&#x5B8C;&#x6210;&#x7684;&#x3002;&#x4F7F;&#x7528;&#x66F4;&#x591A;&#x7684;&#x53EF;&#x89C6;&#x5316;&#x7684;&#x56FE;&#x8868;&#x53EF;&#x4EE5;&#x8BA9;&#x4EBA;&#x5BF9;&#x6A21;&#x578B;&#x6709;&#x4E00;&#x4E2A;&#x66F4;&#x52A0;&#x76F4;&#x89C2;&#x7684;&#x8BA4;&#x8BC6;&#x3002;&#x5728;&#x672C;&#x7AE0;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x4F7F;&#x7528; TensorBoard &#x5BF9;&#x6A21;&#x578B;&#x8FDB;&#x884C;&#x53EF;&#x89C6;&#x5316;&#x3002;</p>
<h3 id>&#x8BA1;&#x7B97;&#x56FE;&#x53EF;&#x89C6;&#x5316;</h3>
<p>&#x8981;&#x53EF;&#x89C6;&#x5316; TensorFlow &#x7684;&#x8BA1;&#x7B97;&#x56FE;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x6784;&#x5EFA;&#x7F51;&#x7EDC;&#x3002;</p>
<h4 id>&#x7F51;&#x7EDC;&#x5C42;</h4>
<p>&#x672C;&#x7AE0;&#x7684;&#x7F51;&#x7EDC;&#xFF0C;&#x4F9D;&#x7136;&#x4F7F;&#x7528;&#x4E4B;&#x524D;&#x51E0;&#x4E2A;&#x7AE0;&#x8282;&#x5BF9; MNIST &#x6570;&#x636E;&#x96C6;&#x4F7F;&#x7528;&#x7684;&#x7F51;&#x7EDC;&#x7ED3;&#x6784;&#x3002;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x5B9E;&#x73B0;&#xFF0C;&#x56FA;&#x5B9A;&#x4E86;&#x5176;&#x4E2D;&#x7684;&#x4E00;&#x90E8;&#x5206;&#x53C2;&#x6570;&#x3002;&#x76F8;&#x5173;&#x5C42;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-python"># &#x7B80;&#x5355;&#x5377;&#x79EF;&#x5C42;&#xFF0C;&#x4E3A;&#x65B9;&#x4FBF;&#x672C;&#x7AE0;&#x6559;&#x7A0B;&#x53D9;&#x8FF0;&#xFF0C;&#x56FA;&#x5B9A;&#x90E8;&#x5206;&#x53C2;&#x6570;
def conv_layer(input,
               channels_in,    # &#x8F93;&#x5165;&#x901A;&#x9053;&#x6570;
               channels_out):  # &#x8F93;&#x51FA;&#x901A;&#x9053;&#x6570;

    weights = tf.Variable(tf.truncated_normal([5, 5, channels_in, channels_out], stddev=0.05))
    biases = tf.Variable(tf.constant(0.05, shape=[channels_out]))
    conv = tf.nn.conv2d(input, filter=weights, strides=[1, 1, 1, 1], padding=&apos;SAME&apos;)
    act = tf.nn.relu(conv + biases)
    return act

# &#x7B80;&#x5316;&#x5168;&#x8FDE;&#x63A5;&#x5C42;
def fc_layer(input, num_inputs, num_outputs, use_relu=True):
    weights = tf.Variable(tf.truncated_normal([num_inputs, num_outputs], stddev=0.05))
    biases = tf.Variable(tf.constant(0.05, shape=[num_outputs]))
    act = tf.matmul(input, weights) + biases

    if use_relu:
        act = tf.nn.relu(act)
    return act     

# max pooling &#x5C42;
def max_pool(input):
    return tf.nn.max_pool(input, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=&apos;SAME&apos;)
</code></pre>
<h4 id>&#x8F7D;&#x5165;&#x6570;&#x636E;&#xFF0C;&#x6784;&#x5EFA;&#x7F51;&#x7EDC;</h4>
<pre><code class="language-python">from tensorflow.examples.tutorials.mnist import input_data
data = input_data.read_data_sets(&apos;data/MNIST&apos;, one_hot=True)

x = tf.placeholder(tf.float32, shape=[None, 784])   # &#x56FA;&#x5B9A;&#x8FD9;&#x90E8;&#x5206;&#x503C;
y = tf.placeholder(tf.float32, shape=[None, 10])
x_image = tf.reshape(x, [-1, 28, 28, 1])

conv1 = conv_layer(x_image, 1, 32)   # &#x589E;&#x52A0;&#x4E86;&#x5377;&#x79EF;&#x6838;&#x6570;&#x76EE;
pool1 = max_pool(conv1)

conv2 = conv_layer(pool1, 32, 64)
pool2 = max_pool(conv2)

flat_shape = pool2.get_shape()[1:4].num_elements()
flattened = tf.reshape(pool2, [-1, flat_shape])

fc1 = fc_layer(flattened, flat_shape, 1024)     # &#x589E;&#x5927;&#x795E;&#x7ECF;&#x5143;&#x6570;&#x76EE;
logits = fc_layer(fc1, 1024, 10, use_relu=False)
</code></pre>
<h4 id>&#x4EA4;&#x53C9;&#x71B5;&#xFF0C;&#x4F18;&#x5316;&#x5668;&#xFF0C;&#x51C6;&#x786E;&#x7387;</h4>
<pre><code class="language-python"># &#x8BA1;&#x7B97;&#x4EA4;&#x53C9;&#x71B5;
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits))

# &#x4F7F;&#x7528;Adam&#x4F18;&#x5316;&#x5668;&#x6765;&#x8BAD;&#x7EC3;
optimizer = tf.train.AdamOptimizer(learning_rate=1e-4).minimize(cross_entropy)

# &#x8BA1;&#x7B97;&#x51C6;&#x786E;&#x7387;
correct_prediction = tf.equal(tf.argmax(y, axis=1), tf.argmax(logits, axis=1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
</code></pre>
<h4 id="session">&#x521B;&#x5EFA; session&#xFF0C;&#x8BAD;&#x7EC3;</h4>
<pre><code class="language-python">session = tf.Session()
session.run(tf.global_variables_initializer())

train_batch_size = 100

for i in range(2001):
    x_batch, y_batch = data.train.next_batch(train_batch_size)

    feed_dict = {x: x_batch, y: y_batch}

    if i % 500 == 0:
        train_accuracy = session.run(accuracy, feed_dict=feed_dict)
        print(&quot;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;: {0:&gt;6}, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: {1:&gt;6.4%}&quot;.format(i, train_accuracy))

    session.run(optimizer, feed_dict=feed_dict)
</code></pre>
<pre><code class="language-python">&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:      0, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 9.0000%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    500, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 93.0000%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1000, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 97.0000%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1500, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 98.0000%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2000, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0000%
</code></pre>
<p>&#x53EF;&#x89C1;&#x8BAD;&#x7EC3;&#x6548;&#x679C;&#x6BD4;&#x8F83;&#x7406;&#x60F3;&#x3002;</p>
<h4 id>&#x53EF;&#x89C6;&#x5316;&#x8BA1;&#x7B97;&#x56FE;</h4>
<p>&#x73B0;&#x5728;&#x9700;&#x8981;&#x5C06;&#x8BA1;&#x7B97;&#x56FE;&#x53EF;&#x89C6;&#x5316;&#xFF0C;&#x9700;&#x8981;&#x4F7F;&#x7528; <code>tf.summary.FileWriter</code> &#x6765;&#x5C06;&#x8BA1;&#x7B97;&#x56FE;&#x5199;&#x5165;&#x6307;&#x5B9A;&#x76EE;&#x5F55;&#xFF1A;</p>
<pre><code class="language-python">tensorboard_dir = &apos;tensorboard/mnist&apos;   # &#x4FDD;&#x5B58;&#x76EE;&#x5F55;
if not os.path.exists(tensorboard_dir):
    os.makedirs(tensorboard_dir)

writer = tf.summary.FileWriter(tensorboard_dir)
writer.add_graph(session.graph)
</code></pre>
<p>&#x4EE5;&#x4E0A;&#x4EE3;&#x7801;&#x8FD0;&#x884C;&#x7ED3;&#x675F;&#x540E;&#xFF0C;&#x5728;&#x4FDD;&#x5B58;&#x76EE;&#x5F55;&#x4E0B;&#x751F;&#x6210;&#x4E86;&#x76F8;&#x5E94;&#x6587;&#x4EF6;&#x3002;&#x5728;&#x7EC8;&#x7AEF;&#x8FD0;&#x884C;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#xFF1A;</p>
<pre><code class="language-bash">$ tensorboard --logdir tensorboard/mnist
</code></pre>
<p>&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x8BBF;&#x95EE; <a href="localhost:6006">localhost:6006</a> &#x4FBF;&#x53EF;&#x8FDB;&#x5165; TensorBoard &#x63A7;&#x5236;&#x53F0;&#x3002;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-1.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x5F53;&#x524D;&#x5BFC;&#x822A;&#x680F;&#x9664;&#x4E86; GRAPHS &#x4EE5;&#x5916;&#xFF0C;&#x5176;&#x4ED6;&#x5747;&#x6CA1;&#x6709;&#x6570;&#x636E;&#xFF0C;&#x70B9;&#x51FB;&#x8FDB;&#x5165; GRAPHS&#xFF0C;&#x53EF;&#x67E5;&#x770B;&#x5982;&#x4E0B;&#x8BA1;&#x7B97;&#x56FE;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-2.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x7136;&#x800C;&#xFF0C;&#x76EE;&#x524D;&#x6765;&#x770B;&#xFF0C;&#x8FD9;&#x4E2A;&#x56FE;&#x5B9E;&#x5728;&#x8FC7;&#x4E8E;&#x590D;&#x6742;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x663E;&#x793A;&#x4E86;&#x6240;&#x6709;&#x7684;&#x8BA1;&#x7B97;&#x7EC6;&#x8282;&#x3002;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5BF9;&#x4EE3;&#x7801;&#x8FDB;&#x884C;&#x76F8;&#x5E94;&#x7684;&#x8C03;&#x6574;&#x3002;</p>
<h4 id>&#x547D;&#x540D;&#x8303;&#x56F4;</h4>
<p>&#x6211;&#x4EEC;&#x5728;&#x4E4B;&#x524D;&#x7684;&#x7AE0;&#x8282;&#x5DF2;&#x7ECF;&#x4F7F;&#x7528;&#x4E86;&#x4E3A;&#x67D0;&#x4E2A;&#x7F51;&#x7EDC;&#x6A21;&#x5757;&#x547D;&#x540D;&#x7684;&#x65B9;&#x6CD5;&#x3002;TensorFlow &#x4F7F;&#x7528; name scope &#x6765;&#x786E;&#x5B9A;&#x6A21;&#x5757;&#x7684;&#x4F5C;&#x7528;&#x8303;&#x56F4;&#x3002;&#x5BF9;&#x4EE3;&#x7801;&#x8FDB;&#x884C;&#x76F8;&#x5E94;&#x7684;&#x8C03;&#x6574;&#xFF0C;&#x6DFB;&#x52A0;&#x90E8;&#x5206;&#x540D;&#x79F0;&#x548C;&#x4F5C;&#x7528;&#x57DF;&#xFF1A;</p>
<pre><code class="language-python"># &#x7B80;&#x5355;&#x5377;&#x79EF;&#x5C42;&#xFF0C;&#x4E3A;&#x65B9;&#x4FBF;&#x672C;&#x7AE0;&#x6559;&#x7A0B;&#x53D9;&#x8FF0;&#xFF0C;&#x56FA;&#x5B9A;&#x90E8;&#x5206;&#x53C2;&#x6570;
def conv_layer(input,
               channels_in,    # &#x8F93;&#x5165;&#x901A;&#x9053;&#x6570;
               channels_out,   # &#x8F93;&#x51FA;&#x901A;&#x9053;&#x6570;
               name=&apos;conv&apos;):   # &#x540D;&#x79F0;
    with tf.name_scope(name):    # &#x5728;&#x8BE5;&#x540D;&#x79F0;&#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x7684;&#x5B50;&#x53D8;&#x91CF;
        weights = tf.Variable(tf.truncated_normal([5, 5, channels_in, channels_out],
                                                  stddev=0.05), name=&apos;W&apos;)
        biases = tf.Variable(tf.constant(0.05, shape=[channels_out]), name=&apos;B&apos;)
        conv = tf.nn.conv2d(input, filter=weights, strides=[1, 1, 1, 1], padding=&apos;SAME&apos;)
        act = tf.nn.relu(conv + biases)
        return act

# &#x7B80;&#x5316;&#x5168;&#x8FDE;&#x63A5;&#x5C42;
def fc_layer(input, num_inputs, num_outputs, use_relu=True, name=&apos;fc&apos;):
    with tf.name_scope(name):   # &#x5728;&#x8BE5;&#x540D;&#x79F0;&#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x7684;&#x5B50;&#x53D8;&#x91CF;
        weights = tf.Variable(tf.truncated_normal([num_inputs, num_outputs],
                                                  stddev=0.05), name=&apos;W&apos;)
        biases = tf.Variable(tf.constant(0.05, shape=[num_outputs]), name=&apos;B&apos;)
        act = tf.matmul(input, weights) + biases

        if use_relu:
            act = tf.nn.relu(act)
        return act     

# max pooling &#x5C42;
def max_pool(input):
    return tf.nn.max_pool(input, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=&apos;SAME&apos;)
</code></pre>
<p>&#x7ED9;&#x5176;&#x4ED6;&#x7684;&#x90E8;&#x5206;&#x540C;&#x6837;&#x6DFB;&#x52A0;&#x540D;&#x79F0;&#x548C;&#x76F8;&#x5173;&#x4F5C;&#x7528;&#x57DF;&#xFF1A;</p>
<pre><code class="language-python">x = tf.placeholder(tf.float32, shape=[None, 784], name=&apos;x&apos;)
y = tf.placeholder(tf.float32, shape=[None, 10], name=&apos;labels&apos;)
x_image = tf.reshape(x, [-1, 28, 28, 1])

conv1 = conv_layer(x_image, 1, 32, &apos;conv1&apos;)
pool1 = max_pool(conv1)

conv2 = conv_layer(pool1, 32, 64, &apos;conv2&apos;)
pool2 = max_pool(conv2)

flat_shape = pool2.get_shape()[1:4].num_elements()
flattened = tf.reshape(pool2, [-1, flat_shape])

fc1 = fc_layer(flattened, flat_shape, 1024, name=&apos;fc1&apos;)
logits = fc_layer(fc1, 1024, 10, use_relu=False, name=&apos;fc2&apos;)

# &#x8BA1;&#x7B97;&#x4EA4;&#x53C9;&#x71B5;
with tf.name_scope(&quot;xent&quot;):
    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits))

# &#x4F7F;&#x7528;Adam&#x4F18;&#x5316;&#x5668;&#x6765;&#x8BAD;&#x7EC3;
with tf.name_scope(&apos;optimizer&apos;):
    optimizer = tf.train.AdamOptimizer(learning_rate=1e-4).minimize(cross_entropy)

# &#x8BA1;&#x7B97;&#x51C6;&#x786E;&#x7387;
with tf.name_scope(&apos;accuracy&apos;):
    correct_prediction = tf.equal(tf.argmax(y, axis=1), tf.argmax(logits, axis=1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
</code></pre>
<p>&#x5148;&#x4E0D;&#x8BAD;&#x7EC3;&#xFF0C;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x76EE;&#x5F55;&#x4FDD;&#x5B58;&#x65B0;&#x7684;&#x8BA1;&#x7B97;&#x56FE;&#xFF0C;&#x7136;&#x540E;&#x5C06;&#x8BA1;&#x7B97;&#x56FE;&#x5199;&#x5165;&#x8FD9;&#x4E2A;&#x76EE;&#x5F55;</p>
<pre><code class="language-python">tensorboard_dir = &apos;tensorboard/mnist2&apos;   # &#x4FDD;&#x5B58;&#x76EE;&#x5F55;
if not os.path.exists(tensorboard_dir):
    os.makedirs(tensorboard_dir)

writer = tf.summary.FileWriter(tensorboard_dir)
writer.add_graph(session.graph)
</code></pre>
<p>&#x8FD0;&#x884C; tensorboard&#xFF0C;&#x5C06; logdir &#x6307;&#x5411;&#x65B0;&#x7684;&#x76EE;&#x5F55;&#xFF0C;&#x8BA1;&#x7B97;&#x56FE;&#x5982;&#x4E0B;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-3.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x73B0;&#x5728;&#x7684;&#x8BA1;&#x7B97;&#x56FE;&#x53D8;&#x5F97;&#x66F4;&#x52A0;&#x76F4;&#x89C2;&#x5BB9;&#x6613;&#x7406;&#x89E3;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x5C06;&#x90E8;&#x5206;&#x7684;&#x7EC6;&#x8282;&#x85CF;&#x5728;&#x4E86;&#x4E00;&#x4E2A;&#x4E2A;&#x5927;&#x7684;&#x6A21;&#x5757;&#x91CC;&#x9762;&#x3002;&#x70B9;&#x51FB;&#x67D0;&#x4E2A;&#x6A21;&#x5757;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x5B83;&#x7684;&#x5185;&#x90E8;&#x7EC6;&#x8282;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-4.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x5B9A;&#x4E49;&#x7684;&#x540D;&#x79F0; W &#x548C; B &#x662F;&#x5C5E;&#x4E8E; conv2 &#x5185;&#x90E8;&#x7684;&#x5B50;&#x540D;&#x79F0;&#x3002;</p>
<p>&#x70B9;&#x51FB;&#x5DE6;&#x8FB9;&#x7684; Trace inputs&#xFF0C;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x6570;&#x636E;&#x5230;&#x67D0;&#x4E00;&#x6A21;&#x5757;&#x7684;&#x6D41;&#x5411;&#xFF0C;&#x4F8B;&#x5982;&#x8BA1;&#x7B97; accuracy&#xFF0C;&#x662F; x &#x7ECF;&#x8FC7;&#x4E86;&#x4E00;&#x7CFB;&#x5217;&#x7F51;&#x7EDC;&#x5C42;&#x5E76;&#x6BD4;&#x5BF9; label &#x8BA1;&#x7B97;&#x51FA;&#x6765;&#x7684;&#x3002;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-5.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<h3 id>&#x6807;&#x91CF;&#xFF0C;&#x76F4;&#x65B9;&#x56FE;</h3>
<p>&#x9664;&#x4E86;&#x753B;&#x51FA;&#x6A21;&#x578B;&#x7684;&#x8BA1;&#x7B97;&#x56FE;&#x5916;&#xFF0C;TensorBoard &#x8FD8;&#x652F;&#x6301;&#x6536;&#x96C6;&#x4E00;&#x4E9B;&#x51C6;&#x786E;&#x7387;&#x3001;&#x635F;&#x5931;&#x7B49;&#x6807;&#x91CF;&#x4FE1;&#x606F;&#xFF0C;&#x68C0;&#x67E5;&#x8F93;&#x5165;&#x7684;&#x56FE;&#x50CF;&#xFF0C;&#x4EE5;&#x53CA;&#x63CF;&#x7ED8;&#x53D8;&#x91CF;&#x7684;&#x76F4;&#x65B9;&#x56FE;&#x4FE1;&#x606F;&#x7B49;&#x7B49;&#xFF0C;&#x8FD9;&#x4E9B;&#x4FE1;&#x606F;&#x5BF9;&#x4E8E;&#x8BC4;&#x5224;&#x6A21;&#x578B;&#x7684;&#x6027;&#x80FD;&#x6709;&#x7740;&#x91CD;&#x8981;&#x4F5C;&#x7528;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5BF9;&#x4EE3;&#x7801;&#x505A;&#x4E00;&#x5B9A;&#x4FEE;&#x6539;&#xFF0C;&#x6765;&#x6536;&#x96C6;&#x8FD9;&#x4E9B;&#x4FE1;&#x606F;&#x3002;</p>
<h4 id>&#x5377;&#x79EF;&#x5C42;&#x76F4;&#x65B9;&#x56FE;</h4>
<p>&#x4F7F;&#x7528; <code>tf.summary.histogram</code> &#x6536;&#x96C6;&#x76F4;&#x65B9;&#x56FE;&#x4FE1;&#x606F;&#x3002;</p>
<pre><code class="language-python"># &#x7B80;&#x5355;&#x5377;&#x79EF;&#x5C42;&#xFF0C;&#x4E3A;&#x65B9;&#x4FBF;&#x672C;&#x7AE0;&#x6559;&#x7A0B;&#x53D9;&#x8FF0;&#xFF0C;&#x56FA;&#x5B9A;&#x90E8;&#x5206;&#x53C2;&#x6570;
def conv_layer(input,
               channels_in,    # &#x8F93;&#x5165;&#x901A;&#x9053;&#x6570;
               channels_out,   # &#x8F93;&#x51FA;&#x901A;&#x9053;&#x6570;
               name=&apos;conv&apos;):   # &#x540D;&#x79F0;
    with tf.name_scope(name):
        weights = tf.Variable(tf.truncated_normal([5, 5, channels_in, channels_out],
                                                  stddev=0.05), name=&apos;W&apos;)
        biases = tf.Variable(tf.constant(0.05, shape=[channels_out]), name=&apos;B&apos;)
        conv = tf.nn.conv2d(input, filter=weights, strides=[1, 1, 1, 1], padding=&apos;SAME&apos;)
        act = tf.nn.relu(conv + biases)

        # &#x6536;&#x96C6;&#x4EE5;&#x4E0B;&#x4E09;&#x4E2A;&#x4FE1;&#x606F;&#xFF0C;&#x7EDF;&#x8BA1;&#x76F4;&#x65B9;&#x56FE;
        tf.summary.histogram(&apos;weights&apos;, weights)   
        tf.summary.histogram(&apos;biases&apos;, biases)     
        tf.summary.histogram(&apos;activations&apos;, act)
        return act
</code></pre>
<h4 id>&#x4EA4;&#x53C9;&#x71B5;&#xFF0C;&#x51C6;&#x786E;&#x7387;&#xFF0C;&#x56FE;&#x50CF;&#x8F93;&#x5165;</h4>
<p>&#x4F7F;&#x7528; <code>tf.summary.scalar</code> &#x6536;&#x96C6;&#x6807;&#x91CF;&#x4FE1;&#x606F;&#xFF0C;&#x4F7F;&#x7528; <code>tf.summary.image</code> &#x6536;&#x96C6;&#x56FE;&#x50CF;&#x3002;</p>
<pre><code class="language-python">tf.summary.scalar(&apos;cross_entropy&apos;, cross_entropy)
tf.summary.scalar(&apos;accuracy&apos;, accuracy)
tf.summary.image(&apos;input&apos;, x_image, 3)
</code></pre>
<h4 id>&#x4FDD;&#x5B58;&#x8FD9;&#x4E9B;&#x4FE1;&#x606F;</h4>
<p>&#x4F7F;&#x7528; <code>tf.summary.merge_all()</code>&#xFF0C;&#x5582;&#x5165;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#xFF0C;&#x53EF;&#x4EE5;&#x6536;&#x96C6;&#x4EE5;&#x4E0A;&#x5B9A;&#x4E49;&#x7684;&#x6240;&#x6709;&#x4FE1;&#x606F;&#x3002;</p>
<pre><code class="language-python">tensorboard_dir = &apos;tensorboard/mnist3&apos;   # &#x4FDD;&#x5B58;&#x5230;&#x65B0;&#x7684;&#x76EE;&#x5F55;
if not os.path.exists(tensorboard_dir):
    os.makedirs(tensorboard_dir)

merged_summary = tf.summary.merge_all()   # &#x4F7F;&#x7528;tf.summary.merge_all()&#xFF0C;&#x53EF;&#x4EE5;&#x6536;&#x96C6;&#x4EE5;&#x4E0A;&#x5B9A;&#x4E49;&#x7684;&#x6240;&#x6709;&#x4FE1;&#x606F;
writer = tf.summary.FileWriter(tensorboard_dir)
writer.add_graph(session.graph)
</code></pre>
<p>&#x901A;&#x8FC7;&#x8BAD;&#x7EC3;&#x8FDB;&#x884C;&#x6570;&#x636E;&#x6536;&#x96C6;</p>
<pre><code class="language-python">train_batch_size = 100

for i in range(2001):
    x_batch, y_batch = data.train.next_batch(train_batch_size)

    feed_dict = {x: x_batch, y: y_batch}

    if i % 5 == 0:   # &#x8FD0;&#x884C;merger_summary&#xFF0C;&#x4F7F;&#x7528;add_summary&#x5199;&#x5165;&#x6570;&#x636E;
        # &#x8FD9;&#x91CC;&#x7684;feed_dict&#x5E94;&#x8BE5;&#x4F7F;&#x7528;&#x9A8C;&#x8BC1;&#x96C6;&#xFF0C;&#x4F46;&#x662F;&#x5F53;&#x524D;&#x4EC5;&#x4F5C;&#x4E3A;&#x6F14;&#x793A;&#x76EE;&#x7684;&#xFF0C;&#x5728;&#x6B64;&#x4E0D;&#x505A;&#x4FEE;&#x6539;
        s = session.run(merged_summary, feed_dict=feed_dict)
        writer.add_summary(s, i)

    if i % 500 == 0:
        train_accuracy = session.run(accuracy, feed_dict=feed_dict)
        print(&quot;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;: {0:&gt;6}, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: {1:&gt;6.4%}&quot;.format(i, train_accuracy))

    session.run(optimizer, feed_dict=feed_dict)
</code></pre>
<p>&#x8FD0;&#x884C; tensorboard&#xFF0C;&#x6307;&#x5411; tensorboard/mnist3&#x3002;&#x70B9;&#x51FB;&#x5BFC;&#x822A;&#x680F; SCALARS&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-6.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x663E;&#x793A;&#x4E86;&#x51C6;&#x786E;&#x7387;&#x548C;&#x4EA4;&#x53C9;&#x71B5;&#x5728;&#x8FED;&#x4EE3;&#x8FC7;&#x7A0B;&#x4E2D;&#x7684;&#x53D8;&#x5316;&#x60C5;&#x51B5;&#xFF0C;&#x51C6;&#x786E;&#x7387;&#x5728;&#x7A33;&#x6B65;&#x4E0A;&#x5347;&#xFF0C;&#x4EA4;&#x53C9;&#x71B5;&#x9010;&#x6E10;&#x4E0B;&#x964D;&#xFF0C;&#x53EF;&#x89C1;&#x8BE5;&#x6A21;&#x578B;&#x7684;&#x6548;&#x679C;&#x8FD8;&#x7B97;&#x7406;&#x60F3;&#x3002;</p>
<p>&#x70B9;&#x51FB;&#x5BFC;&#x822A;&#x680F; HISTOGRAMS&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-7.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x53D8;&#x91CF;&#x5728;&#x4E0D;&#x540C;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;&#x7684;&#x76F4;&#x65B9;&#x56FE;&#x5206;&#x5E03;&#x60C5;&#x51B5;&#x3002;&#x7B2C;&#x4E00;&#x5C42;&#x5377;&#x79EF;&#x7684;&#x6743;&#x91CD;&#x968F;&#x7740;&#x8FED;&#x4EE3;&#x53D8;&#x5316;&#x8F83;&#x4E3A;&#x660E;&#x663E;&#xFF0C;&#x7B2C;&#x4E8C;&#x5C42;&#x8868;&#x73B0;&#x51FA;&#x5E73;&#x6ED1;&#x7684;&#x8D8B;&#x52BF;&#x3002;</p>
<p>&#x70B9;&#x51FB;&#x5BFC;&#x822A;&#x680F; IMAGES&#xFF0C;&#x53EF;&#x4EE5;&#x663E;&#x793A;&#x4E0D;&#x540C;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;&#x7684; 3 &#x5F20;&#x56FE;&#x7247;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-8.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<h3 id>&#x53C2;&#x6570;&#x641C;&#x7D22;</h3>
<p>&#x4EE5;&#x4E0A;&#x7684;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;TensorBoard &#x90FD;&#x53EA;&#x663E;&#x793A;&#x4E86;&#x4E00;&#x4E2A;&#x6A21;&#x578B;&#x7684;&#x53EF;&#x89C6;&#x5316;&#x6570;&#x636E;&#x3002;&#x5BF9;&#x4E8E;&#x4E0D;&#x540C;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x5982;&#x4F55;&#x5C06;&#x591A;&#x4E2A;&#x6A21;&#x578B;&#x663E;&#x793A;&#x5728;&#x4E00;&#x5F20;&#x56FE;&#x4E2D;&#x8FDB;&#x884C;&#x5BF9;&#x6BD4;&#xFF1F;TensorBoard &#x5BF9;&#x8FD9;&#x4E00;&#x95EE;&#x9898;&#x4F5C;&#x4E86;&#x540C;&#x6837;&#x7684;&#x652F;&#x6301;&#x3002;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x8C03;&#x6574;&#x90E8;&#x5206;&#x4EE3;&#x7801;&#xFF0C;&#x5E76;&#x52A0;&#x5165;&#x4E00;&#x4E9B;&#x53C2;&#x6570;&#x641C;&#x7D22;&#x7684;&#x4EE3;&#x7801;&#x3002;</p>
<h4 id="max_poolingrelu">&#x5C06; max_pooling &#x5408;&#x5E76;&#x5230;&#x5377;&#x79EF;&#x4E2D;&#xFF0C;&#x5C06; relu &#x4ECE;&#x5168;&#x8FDE;&#x63A5;&#x62BD;&#x79BB;</h4>
<pre><code class="language-python"># &#x7B80;&#x5355;&#x5377;&#x79EF;&#x5C42;&#xFF0C;&#x4E3A;&#x65B9;&#x4FBF;&#x672C;&#x7AE0;&#x6559;&#x7A0B;&#x53D9;&#x8FF0;&#xFF0C;&#x56FA;&#x5B9A;&#x90E8;&#x5206;&#x53C2;&#x6570;
def conv_layer(input,
               channels_in,    # &#x8F93;&#x5165;&#x901A;&#x9053;&#x6570;
               channels_out,   # &#x8F93;&#x51FA;&#x901A;&#x9053;&#x6570;
               name=&apos;conv&apos;):   # &#x540D;&#x79F0;
    with tf.name_scope(name):
        weights = tf.Variable(tf.truncated_normal([5, 5, channels_in, channels_out],
                                                  stddev=0.05), name=&apos;W&apos;)
        biases = tf.Variable(tf.constant(0.05, shape=[channels_out]), name=&apos;B&apos;)
        conv = tf.nn.conv2d(input, filter=weights, strides=[1, 1, 1, 1], padding=&apos;SAME&apos;)
        act = tf.nn.relu(conv + biases)

        tf.summary.histogram(&apos;weights&apos;, weights)
        tf.summary.histogram(&apos;biases&apos;, biases)
        tf.summary.histogram(&apos;activations&apos;, act)

        return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=&apos;SAME&apos;)

# &#x7B80;&#x5316;&#x5168;&#x8FDE;&#x63A5;&#x5C42;
def fc_layer(input, num_inputs, num_outputs, name=&apos;fc&apos;):
    with tf.name_scope(name):
        weights = tf.Variable(tf.truncated_normal([num_inputs, num_outputs],
                                                  stddev=0.05), name=&apos;W&apos;)
        biases = tf.Variable(tf.constant(0.05, shape=[num_outputs]), name=&apos;B&apos;)
        act = tf.matmul(input, weights) + biases

        tf.summary.histogram(&apos;weights&apos;, weights)
        tf.summary.histogram(&apos;biases&apos;, biases)
        tf.summary.histogram(&apos;activations&apos;, act)

        return act
</code></pre>
<h4 id>&#x4FDD;&#x5B58;&#x5230;&#x65B0;&#x7684;&#x76EE;&#x5F55;</h4>
<pre><code class="language-python">tensorboard_dir = &apos;tensorboard/mnist4/&apos;   # &#x4FDD;&#x5B58;&#x76EE;&#x5F55;
if not os.path.exists(tensorboard_dir):
    os.makedirs(tensorboard_dir)
</code></pre>
<h4 id>&#x6839;&#x636E;&#x4E0D;&#x540C;&#x53C2;&#x6570;&#x6784;&#x5EFA;&#x6A21;&#x578B;</h4>
<pre><code class="language-python">def mnist_model(learning_rate, use_two_fc, use_two_conv, hparam):
    tf.reset_default_graph()    # &#x91CD;&#x7F6E;&#x8BA1;&#x7B97;&#x56FE;
    sess = tf.Session()

    x = tf.placeholder(tf.float32, shape=[None, 784], name=&quot;x&quot;)
    x_image = tf.reshape(x, [-1, 28, 28, 1])
    tf.summary.image(&apos;input&apos;, x_image, 3)
    y = tf.placeholder(tf.float32, shape=[None, 10], name=&quot;labels&quot;)

    if use_two_conv:    # &#x662F;&#x5426;&#x4F7F;&#x7528;&#x4E24;&#x4E2A;&#x5377;&#x79EF;
        conv1 = conv_layer(x_image, 1, 32, &quot;conv1&quot;)
        conv_out = conv_layer(conv1, 32, 64, &quot;conv2&quot;)
    else:
        conv1 = conv_layer(x_image, 1, 64, &quot;conv&quot;)    # &#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x5377;&#x79EF;&#xFF0C;&#x5219;&#x518D;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;max_pooling&#x4FDD;&#x8BC1;&#x7EF4;&#x5EA6;&#x76F8;&#x901A;
        conv_out = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=&quot;SAME&quot;)

    flattened = tf.reshape(conv_out, [-1, 7 * 7 * 64])

    if use_two_fc:    # &#x662F;&#x5426;&#x4F7F;&#x7528;&#x4E24;&#x4E2A;&#x5168;&#x8FDE;&#x63A5;
        fc1 = fc_layer(flattened, 7 * 7 * 64, 1024, &quot;fc1&quot;)
        relu = tf.nn.relu(fc1)
        tf.summary.histogram(&quot;fc1/relu&quot;, relu)
        logits = fc_layer(fc1, 1024, 10, &quot;fc2&quot;)
    else:
        logits = fc_layer(flattened, 7*7*64, 10, &quot;fc&quot;)

    with tf.name_scope(&quot;xent&quot;):
        xent = tf.reduce_mean(
            tf.nn.softmax_cross_entropy_with_logits(
                logits=logits, labels=y), name=&quot;xent&quot;)
        tf.summary.scalar(&quot;xent&quot;, xent)

    with tf.name_scope(&quot;train&quot;):
        train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent)

    with tf.name_scope(&quot;accuracy&quot;):
        correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
        tf.summary.scalar(&quot;accuracy&quot;, accuracy)

    summ = tf.summary.merge_all()    # &#x6536;&#x96C6;&#x6240;&#x6709;&#x7684;summary

    saver = tf.train.Saver()     # &#x4FDD;&#x5B58;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;

    sess.run(tf.global_variables_initializer())
    writer = tf.summary.FileWriter(tensorboard_dir + hparam)
    writer.add_graph(sess.graph)

    for i in range(2001):
        batch = data.train.next_batch(100)
        if i % 5 == 0:   # &#x6BCF;5&#x8F6E;&#x5199;&#x5165;&#x4E00;&#x6B21;
            # &#x540C;&#x4E0A;&#xFF0C;feed_dict&#x5E94;&#x8BE5;&#x4F7F;&#x7528;&#x9A8C;&#x8BC1;&#x96C6;&#xFF0C;&#x4F46;&#x662F;&#x5F53;&#x524D;&#x4EC5;&#x4F5C;&#x4E3A;&#x6F14;&#x793A;&#x76EE;&#x7684;&#xFF0C;&#x5728;&#x6B64;&#x4E0D;&#x505A;&#x4FEE;&#x6539;
            [train_accuracy, s] = sess.run([accuracy, summ], feed_dict={x: batch[0], y: batch[1]})
            writer.add_summary(s, i)

        if i % 100 == 0:    # &#x6BCF;100&#x8F6E;&#x4FDD;&#x5B58;&#x4F9D;&#x5B58;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;
            train_accuracy = sess.run(accuracy, feed_dict={x: batch[0], y: batch[1]})
            saver.save(sess, os.path.join(tensorboard_dir, &quot;model.ckpt&quot;), i)

            print(&quot;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;: {0:&gt;6}, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: {1:&gt;6.4%}&quot;.format(i, train_accuracy))

        sess.run(train_step, feed_dict={x: batch[0], y: batch[1]})
</code></pre>
<p>&#x4EE5;&#x4E0B;&#x51FD;&#x6570;&#x7528;&#x4E8E;&#x751F;&#x6210;&#x8D85;&#x53C2;&#x6570;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#xFF1A;</p>
<pre><code class="language-python">def make_hparam_string(learning_rate, use_two_fc, use_two_conv):
    conv_param = &quot;conv=2&quot; if use_two_conv else &quot;conv=1&quot;
    fc_param = &quot;fc=2&quot; if use_two_fc else &quot;fc=1&quot;
    return &quot;lr_%.0E,%s,%s&quot; % (learning_rate, conv_param, fc_param)
</code></pre>
<p>&#x5F00;&#x59CB;&#x8BAD;&#x7EC3;&#xFF1A;</p>
<pre><code class="language-python">for learning_rate in [1E-3, 1E-4, 1e-5]:
    for use_two_fc in [False, True]:
        for use_two_conv in [False, True]:
            hparam = make_hparam_string(learning_rate, use_two_fc, use_two_conv)
            print(&apos;Starting run for %s&apos; % hparam)

            mnist_model(learning_rate, use_two_fc, use_two_conv, hparam)

print(&apos;Done training!&apos;)
</code></pre>
<p>&#x5728;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;&#x4E2D;&#x5373;&#x53EF;&#x76F4;&#x63A5;&#x6253;&#x5F00;tensorboard&#x5B9E;&#x65F6;&#x67E5;&#x770B;&#x8BAD;&#x7EC3;&#x60C5;&#x51B5;&#xFF1A;</p>
<pre><code class="language-bash">$ tensorboard --logdir tensorboard/mnist4
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-9.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-10.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x4EE5;&#x4E0A;&#x5C31;&#x663E;&#x793A;&#x4E86;&#x4E0D;&#x540C;&#x53C2;&#x6570;&#x60C5;&#x51B5;&#x4E0B;&#x7684;&#x51C6;&#x786E;&#x7387;&#x548C;&#x4EA4;&#x53C9;&#x71B5;&#x53D8;&#x5316;&#x60C5;&#x51B5;&#xFF0C;&#x5DE6;&#x4E0B;&#x89D2;&#x533A;&#x57DF;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x663E;&#x793A;&#x51E0;&#x6761;&#x7EBF;&#x3002;&#x4E2D;&#x95F4;&#x7684; Horizontal Axis &#x540C;&#x6837;&#x7ED9;&#x4E86;&#x4E09;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x663E;&#x793A;&#xFF0C;STEP &#x6309;&#x6B65;&#x957F;&#xFF0C;RELATIVE &#x6309;&#x76F8;&#x5BF9;&#x65F6;&#x95F4;&#xFF0C;WALL &#x5C06;&#x5B83;&#x4EEC;&#x5206;&#x5F00;&#x663E;&#x793A;&#x3002;&#x9F20;&#x6807;&#x79FB;&#x52A8;&#x5230;&#x56FE;&#x50CF;&#x4E0A;&#xFF0C;&#x4F1A;&#x7ED9;&#x51FA;&#x90E8;&#x5206;&#x7684;&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-11.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x5176;&#x4ED6;&#x51E0;&#x4E2A;&#x90E8;&#x5206;&#x4E5F;&#x662F;&#x5982;&#x6B64;&#xFF0C;&#x4E0D;&#x518D;&#x8BE6;&#x8FF0;&#x3002;</p>
<h3 id="embeddings">Embeddings</h3>
<p>Embeddings &#x53EF;&#x80FD;&#x662F; TensorBoard &#x6700;&#x60CA;&#x8273;&#x7684;&#x90E8;&#x5206;&#x3002;&#x5B83;&#x663E;&#x793A;&#x4E86;&#x8BAD;&#x7EC3;&#x6837;&#x672C;&#x5728;&#x4E09;&#x7EF4;&#x7A7A;&#x95F4;&#x7684;&#x8DDD;&#x79BB;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-12.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x4F46;&#x662F;&#x76EE;&#x524D;&#x6211;&#x4EEC;&#x65E0;&#x6CD5;&#x786E;&#x5B9A;&#x67D0;&#x4E2A;&#x6837;&#x672C;&#x7684;&#x6807;&#x7B7E;&#xFF0C;&#x56E0;&#x6B64;&#x65E0;&#x6CD5;&#x786E;&#x8BA4;&#x3002;&#x9700;&#x8981;&#x5BF9;&#x4EE3;&#x7801;&#x505A;&#x4E00;&#x5B9A;&#x7684;&#x4FEE;&#x6539;&#x3002;</p>
<p>&#x8FD9;&#x91CC;&#x53EA;&#x663E;&#x793A; 1024 &#x5F20;&#x56FE;&#x7247;&#xFF0C;&#x9700;&#x8981;&#x4E24;&#x4E2A;&#x989D;&#x5916;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x4E00;&#x4E2A;&#x5B58;&#x50A8;&#x6807;&#x7B7E;&#xFF0C;&#x4E00;&#x4E2A;&#x5B58;&#x50A8;&#x6BCF;&#x4E2A;&#x70B9;&#x7684;&#x7F29;&#x7565;&#x56FE;&#x3002;&#x8FD9;&#x4E24;&#x4E2A;&#x6587;&#x4EF6;&#x53EF;&#x4EE5;&#x5728; <a href="https://github.com/dandelionmane/tf-dev-summit-tensorboard-tutorial/">dandelionmane&#x7684;GitHub</a> &#x4E0B;&#x8F7D;&#x3002;</p>
<pre><code class="language-python">LABELS = os.path.join(os.getcwd(), &quot;labels_1024.tsv&quot;)
SPRITES = os.path.join(os.getcwd(), &quot;sprite_1024.png&quot;)

def mnist_model(learning_rate, use_two_fc, use_two_conv, hparam):
    tf.reset_default_graph()    # &#x91CD;&#x7F6E;&#x8BA1;&#x7B97;&#x56FE;
    sess = tf.Session()

    x = tf.placeholder(tf.float32, shape=[None, 784], name=&quot;x&quot;)
    x_image = tf.reshape(x, [-1, 28, 28, 1])
    tf.summary.image(&apos;input&apos;, x_image, 3)
    y = tf.placeholder(tf.float32, shape=[None, 10], name=&quot;labels&quot;)

    if use_two_conv:    # &#x662F;&#x5426;&#x4F7F;&#x7528;&#x4E24;&#x4E2A;&#x5377;&#x79EF;
        conv1 = conv_layer(x_image, 1, 32, &quot;conv1&quot;)
        conv_out = conv_layer(conv1, 32, 64, &quot;conv2&quot;)
    else:
        conv1 = conv_layer(x_image, 1, 64, &quot;conv&quot;)    # &#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x5377;&#x79EF;&#xFF0C;&#x5219;&#x518D;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;max_pooling&#x4FDD;&#x8BC1;&#x7EF4;&#x5EA6;&#x76F8;&#x901A;
        conv_out = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=&quot;SAME&quot;)

    flattened = tf.reshape(conv_out, [-1, 7 * 7 * 64])

    if use_two_fc:    # &#x662F;&#x5426;&#x4F7F;&#x7528;&#x4E24;&#x4E2A;&#x5168;&#x8FDE;&#x63A5;
        fc1 = fc_layer(flattened, 7 * 7 * 64, 1024, &quot;fc1&quot;)
        relu = tf.nn.relu(fc1)
        embedding_input = relu
        tf.summary.histogram(&quot;fc1/relu&quot;, relu)
        embedding_size = 1024
        logits = fc_layer(fc1, 1024, 10, &quot;fc2&quot;)
    else:
        embedding_input = flattened   # &#x65B0;&#x6DFB;&#x52A0;&#x7684;embedding_input&#x548C;embedding_size
        embedding_size = 7*7*64
        logits = fc_layer(flattened, 7*7*64, 10, &quot;fc&quot;)

    with tf.name_scope(&quot;xent&quot;):
        xent = tf.reduce_mean(
            tf.nn.softmax_cross_entropy_with_logits(
                logits=logits, labels=y), name=&quot;xent&quot;)
        tf.summary.scalar(&quot;xent&quot;, xent)

    with tf.name_scope(&quot;train&quot;):
        train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent)

    with tf.name_scope(&quot;accuracy&quot;):
        correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
        tf.summary.scalar(&quot;accuracy&quot;, accuracy)

    summ = tf.summary.merge_all()    # &#x6536;&#x96C6;&#x6240;&#x6709;&#x7684;summary

    # &#x6DFB;&#x52A0;embedding&#x53D8;&#x91CF;
    embedding = tf.Variable(tf.zeros([1024, embedding_size]), name=&quot;test_embedding&quot;)
    assignment = embedding.assign(embedding_input)
    saver = tf.train.Saver()     # &#x4FDD;&#x5B58;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;

    sess.run(tf.global_variables_initializer())
    writer = tf.summary.FileWriter(tensorboard_dir + hparam)
    writer.add_graph(sess.graph)

    # embedding&#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x8BE6;&#x89C1;&#x5B98;&#x65B9;&#x6587;&#x6863;
    config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig()
    embedding_config = config.embeddings.add()
    embedding_config.tensor_name = embedding.name
    embedding_config.sprite.image_path = SPRITES
    embedding_config.metadata_path = LABELS
    # Specify the width and height of a single thumbnail.
    embedding_config.sprite.single_image_dim.extend([28, 28])
    tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config)

    for i in range(2001):
        batch = data.train.next_batch(100)
        if i % 5 == 0:   # &#x6BCF;5&#x8F6E;&#x5199;&#x5165;&#x4E00;&#x6B21;
            # &#x540C;&#x6837;&#xFF0C;&#x6700;&#x597D;&#x4F7F;&#x7528;&#x9A8C;&#x8BC1;&#x96C6;
            [train_accuracy, s] = sess.run([accuracy, summ], feed_dict={x: batch[0], y: batch[1]})
            writer.add_summary(s, i)

        if i % 100 == 0:    # &#x6BCF;100&#x8F6E;&#x4FDD;&#x5B58;&#x4F9D;&#x5B58;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;
            sess.run(assignment, feed_dict={x: data.test.images[:1024], y: data.test.labels[:1024]})
            train_accuracy = sess.run(accuracy, feed_dict={x: batch[0], y: batch[1]})
            saver.save(sess, os.path.join(tensorboard_dir, &quot;model.ckpt&quot;), i)

            print(&quot;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;: {0:&gt;6}, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: {1:&gt;6.4%}&quot;.format(i, train_accuracy))

        sess.run(train_step, feed_dict={x: batch[0], y: batch[1]})
</code></pre>
<p>&#x521D;&#x59CB;&#x8FD0;&#x884C;&#x65F6;&#xFF0C;&#x6837;&#x672C;&#x57FA;&#x672C;&#x5206;&#x6563;&#x5728;&#x7A7A;&#x95F4;&#x4E2D;&#xFF0C;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x7279;&#x6B8A;&#x7684;&#x89C4;&#x5F8B;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-13.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x5728;&#x7ECF;&#x8FC7;&#x591A;&#x8F6E;&#x7684;&#x8FED;&#x4EE3;&#x540E;&#xFF0C;&#x76F8;&#x540C;&#x7C7B;&#x522B;&#x7684;&#x6837;&#x672C;&#x805A;&#x96C6;&#x5728;&#x4E86;&#x4E00;&#x8D77;&#xFF0C;&#x4E0D;&#x540C;&#x7C7B;&#x522B;&#x7684;&#x6837;&#x672C;&#x5206;&#x6563;&#x5F00;&#x6765;&#xFF0C;&#x5448;&#x73B0;&#x805A;&#x7C7B;&#x8D8B;&#x52BF;&#xFF0C;&#x867D;&#x7136;&#x5B58;&#x5728;&#x90E8;&#x5206;&#x7684;&#x8BEF;&#x5206;&#x6837;&#x672C;&#x3002;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-5-14.png" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x53EF;&#x89C1;&#xFF0C;Embedding &#x80FD;&#x591F;&#x53CD;&#x6620;&#x805A;&#x7C7B;&#x7684;&#x5C5E;&#x6027;&#xFF0C;&#x8FD9;&#x5BF9;&#x6211;&#x4EEC;&#x89C2;&#x5BDF;&#x5206;&#x7C7B;&#x6027;&#x80FD;&#x6709;&#x5F88;&#x76F4;&#x89C2;&#x7684;&#x5E2E;&#x52A9;&#x3002;Embedding &#x5E38;&#x7528;&#x5728;&#x6587;&#x672C;&#x4E2D;&#xFF0C;&#x4F8B;&#x5982;&#x5224;&#x65AD;&#x8BCD;&#x5411;&#x91CF;&#x7684;&#x76F8;&#x4F3C;&#x7A0B;&#x5EA6;&#x3002;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tsne4.gif" class="kg-image" alt="TensorFlow (5) - TensorBoard &#x53EF;&#x89C6;&#x5316;"></figure>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[TensorFlow (4) - 保存/恢复/提前终止]]></title><description><![CDATA[本章主要说明如何对训练过程进行存储，恢复操作。以及在模型长期没有改进时，提前终止训练。]]></description><link>https://gaussic.com/tensorflow-saver/</link><guid isPermaLink="false">626173b75d2e434866501f8c</guid><category><![CDATA[TensorFlow]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Tue, 15 Aug 2017 14:40:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/chameleon-4785224_1280.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/chameleon-4785224_1280.jpg" alt="TensorFlow (4) - &#x4FDD;&#x5B58;/&#x6062;&#x590D;/&#x63D0;&#x524D;&#x7EC8;&#x6B62;"><p>&#x8FD9;&#x662F;&#x51E0;&#x7BC7;&#x4E0E;&#x539F;&#x4F5C;&#x4E0D;&#x5B8C;&#x5168;&#x76F8;&#x540C;&#x7684;&#x6559;&#x7A0B;&#x3002;</p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x8BF4;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/tensorflow-saver/">TensorFlow (4) - &#x4FDD;&#x5B58;/&#x6062;&#x590D;/&#x63D0;&#x524D;&#x7EC8;&#x6B62;</a></p>
<p>&#x539F;&#x4F5C;&#x8005;&#xFF1A;<a href="http://www.hvass-labs.org/">Magnus Erik Hvass Pedersen</a> / <a href="https://github.com/Hvass-Labs/TensorFlow-Tutorials">GitHub</a> / <a href="https://www.youtube.com/playlist?list=PL9Hr9sNUjfsmEu1ZniY0XpHSzl5uihcXZ">Videos on YouTube</a></p>
<p>&#x5728; <a href="https://gaussic.com/tensorflow-layers-api/">&#x7B2C;&#x4E09;&#x7AE0;</a> &#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528; TensorFlow &#x7684; API &#x91CD;&#x65B0;&#x6784;&#x5EFA;&#x4E86;&#x7F51;&#x7EDC;&#xFF0C;&#x5E76;&#x4E14;&#x8BAD;&#x7EC3;&#x4E86; 10000 &#x8F6E;&#x6B21;&#x5F97;&#x5230;&#x4E86; 98.7% &#x7684;&#x6D4B;&#x8BD5;&#x51C6;&#x786E;&#x7387;&#x3002;&#x7136;&#x800C;&#xFF0C;&#x5728;&#x5B9E;&#x9645;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x6A21;&#x578B;&#x7684;&#x7ED3;&#x6784;&#x5F80;&#x5F80;&#x6BD4;&#x8FD9;&#x66F4;&#x52A0;&#x590D;&#x6742;&#xFF0C;&#x6570;&#x636E;&#x91CF;&#x4E5F;&#x66F4;&#x591A;&#xFF0C;&#x8BAD;&#x7EC3; 10000 &#x8F6E;&#x6B21;&#x9700;&#x8981;&#x8F83;&#x957F;&#x7684;&#x65F6;&#x95F4;&#x3002;&#x957F;&#x65F6;&#x95F4;&#x7684;&#x8BAD;&#x7EC3;&#x5B58;&#x5728;&#x591A;&#x4E2A;&#x95EE;&#x9898;&#xFF1A;</p>
<ul>
<li>&#x5982;&#x679C;&#x4E0D;&#x4FDD;&#x5B58;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;&#x4E2D;&#x7684;&#x72B6;&#x6001;&#xFF0C;&#x5728;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x5B8C;&#x540E;&#xFF0C;&#x6574;&#x4E2A;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;&#x88AB;&#x9500;&#x6BC1;&#xFF0C;&#x65E0;&#x6CD5;&#x8FD0;&#x7528;&#x5230;&#x65B0;&#x7684;&#x6570;&#x636E;&#x96C6;&#x4E0A;&#xFF0C;&#x8FD9;&#x6837;&#x7684;&#x6A21;&#x578B;&#x6CA1;&#x6709;&#x610F;&#x4E49;&#x3002;</li>
<li>&#x5982;&#x679C;&#x5728;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;&#x4E2D;&#x4E00;&#x65E6;&#x51FA;&#x73B0;&#x7A81;&#x53D1;&#x60C5;&#x51B5;&#x505C;&#x6B62;&#xFF0C;&#x4E4B;&#x524D;&#x7684;&#x8BAD;&#x7EC3;&#x5C06;&#x524D;&#x529F;&#x5C3D;&#x5F03;&#xFF0C;&#x5FC5;&#x987B;&#x4ECE;&#x5934;&#x5F00;&#x59CB;&#x8BAD;&#x7EC3;&#x3002;</li>
<li>&#x5982;&#x679C;&#x7ECF;&#x8FC7;&#x591A;&#x6B21;&#x7684;&#x8BAD;&#x7EC3;&#xFF0C;&#x6A21;&#x578B;&#x7684;&#x6027;&#x80FD;&#x4E0D;&#x518D;&#x63D0;&#x5347;&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x4E9B;&#x8BAD;&#x7EC3;&#x662F;&#x6CA1;&#x6709;&#x610F;&#x4E49;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x63D0;&#x524D;&#x7EC8;&#x6B62;&#xFF0C;&#x5C06;&#x6D6A;&#x8D39;&#x5927;&#x91CF;&#x65F6;&#x95F4;&#x3002;</li>
</ul>
<!-- -->
<p>&#x4E8B;&#x5B9E;&#x4E0A;&#xFF0C;TensorFlow &#x63D0;&#x4F9B;&#x4E86;&#x4FDD;&#x5B58;&#x548C;&#x6062;&#x590D;&#x8BAD;&#x7EC3;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x8FD9;&#x7C7B;&#x4E8B;&#x60C5;&#x7684;&#x53D1;&#x751F;&#x3002;&#x5728;&#x672C;&#x7AE0;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x7EE7;&#x7EED;&#x4F7F;&#x7528; <a href="https://gaussic.github.io/2017/08/15/tensorflow-layers/">&#x7B2C;&#x4E09;&#x7AE0;</a> &#x7684;&#x5927;&#x90E8;&#x5206;&#x4EE3;&#x7801;&#xFF0C;&#x53EA;&#x505A;&#x5C0F;&#x90E8;&#x5206;&#x7684;&#x4FEE;&#x6539;&#xFF0C;&#x4EE5;&#x5B9E;&#x73B0;&#x6211;&#x4EEC;&#x7684;&#x76EE;&#x7684;&#x3002;</p>
<h3 id>&#x8F7D;&#x5165;&#x6570;&#x636E;&#xFF0C;&#x6784;&#x5EFA;&#x6A21;&#x578B;</h3>
<p>&#x8FD9;&#x4E00;&#x90E8;&#x5206;&#x4E0E;&#x7B2C;&#x4E09;&#x7AE0;&#x76F8;&#x4F3C;&#xFF0C;&#x4F46;&#x662F;&#x6211;&#x4EEC;&#x5728;&#x672C;&#x7AE0;&#x4E2D;&#x4F7F;&#x7528;&#x9A8C;&#x8BC1;&#x96C6;&#x6765;&#x9A8C;&#x8BC1;&#x6A21;&#x578B;&#x6027;&#x80FD;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x7A0D;&#x4F5C;&#x6539;&#x52A8;&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x9700;&#x8981;&#x7528;&#x5230;&#x4E0A;&#x4E00;&#x7AE0;&#x7ED9;&#x51FA;&#x7684; <code>cnn_helper.py</code>&#x3002;</p>
<pre><code class="language-python">from cnn_helper import *

# notebook&#x4F7F;&#x7528;
%load_ext autoreload  
%autoreload 2
%matplotlib inline
</code></pre>
<h4 id>&#x6570;&#x636E;</h4>
<pre><code class="language-python">from tensorflow.examples.tutorials.mnist import input_data
data = input_data.read_data_sets(&apos;data/MNIST/&apos;, one_hot=True)

print()
print(&quot;&#x6570;&#x636E;&#x96C6;&#x5927;&#x5C0F;&#xFF1A;&quot;)
print(&apos;- &#x8BAD;&#x7EC3;&#x96C6;&#xFF1A;{}&apos;.format(len(data.train.labels)))
print(&apos;- &#x6D4B;&#x8BD5;&#x96C6;&#xFF1A;{}&apos;.format(len(data.test.labels)))
print(&apos;- &#x9A8C;&#x8BC1;&#x96C6;&#xFF1A;{}&apos;.format(len(data.validation.labels)))
</code></pre>
<pre><code class="language-python">&#x6570;&#x636E;&#x96C6;&#x5927;&#x5C0F;&#xFF1A;
- &#x8BAD;&#x7EC3;&#x96C6;&#xFF1A;55000
- &#x6D4B;&#x8BD5;&#x96C6;&#xFF1A;10000
- &#x9A8C;&#x8BC1;&#x96C6;&#xFF1A;5000
</code></pre>
<pre><code class="language-python">data.test.cls = np.argmax(data.test.labels, axis=1)
data.validation.cls = np.argmax(data.validation.labels, axis=1)
</code></pre>
<h4 id>&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x53C2;&#x6570;</h4>
<pre><code class="language-python">img_size = 28                        # &#x56FE;&#x7247;&#x7684;&#x9AD8;&#x5EA6;&#x548C;&#x5BBD;&#x5EA6;
img_size_flat = img_size * img_size  # &#x5C55;&#x5E73;&#x4E3A;&#x5411;&#x91CF;&#x7684;&#x5C3A;&#x5BF8;
img_shape = (img_size, img_size)     # &#x56FE;&#x7247;&#x7684;&#x4E8C;&#x7EF4;&#x5C3A;&#x5BF8;

num_channels = 1                     # &#x8F93;&#x5165;&#x4E3A;&#x5355;&#x901A;&#x9053;&#x7070;&#x5EA6;&#x56FE;&#x50CF;
num_classes = 10                     # &#x7C7B;&#x522B;&#x6570;&#x76EE;

# &#x5377;&#x79EF;&#x5C42; 1
filter_size1 = 5          # 5 x 5 &#x5377;&#x79EF;&#x6838;
num_filters1 = 16         # &#x5171; 16 &#x4E2A;&#x5377;&#x79EF;&#x6838;

# &#x5377;&#x79EF;&#x5C42; 2
filter_size2 = 5          # 5 x 5 &#x5377;&#x79EF;&#x6838;
num_filters2 = 36         # &#x5171; 36 &#x4E2A;&#x5377;&#x79EF;&#x6838;

# &#x5168;&#x8FDE;&#x63A5;&#x5C42;
fc_size = 128             # &#x5168;&#x8FDE;&#x63A5;&#x5C42;&#x795E;&#x7ECF;&#x5143;&#x6570;
</code></pre>
<h4 id>&#x5360;&#x4F4D;&#x7B26;</h4>
<pre><code class="language-python">x = tf.placeholder(tf.float32, shape=[None, img_size_flat], name=&apos;x&apos;)          # &#x539F;&#x59CB;&#x8F93;&#x5165;
x_image = tf.reshape(x, [-1, img_size, img_size, num_channels])                # &#x8F6C;&#x6362;&#x4E3A;2&#x7EF4;&#x56FE;&#x50CF;
y_true = tf.placeholder(tf.float32, shape=[None, num_classes], name=&apos;y_true&apos;)  # &#x539F;&#x59CB;&#x8F93;&#x51FA;
y_true_cls = tf.argmax(y_true, axis=1)                                         # &#x8F6C;&#x6362;&#x4E3A;&#x771F;&#x5B9E;&#x7C7B;&#x522B;
</code></pre>
<h4 id>&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</h4>
<pre><code class="language-python">layer_conv1 = tf.layers.conv2d(inputs=x_image,            # &#x8F93;&#x5165;
                               filters=num_filters1,      # &#x5377;&#x79EF;&#x6838;&#x4E2A;&#x6570;
                               kernel_size=filter_size1,  # &#x5377;&#x79EF;&#x6838;&#x5C3A;&#x5BF8;
                               padding=&apos;same&apos;,            # padding&#x65B9;&#x6CD5;
                               activation=tf.nn.relu,     # &#x6FC0;&#x6D3B;&#x51FD;&#x6570;relu
                               name=&apos;layer_conv1&apos;)        # &#x547D;&#x540D;&#x7528;&#x4E8E;&#x83B7;&#x53D6;&#x53D8;&#x91CF;

net = tf.layers.max_pooling2d(inputs=layer_conv1, pool_size=2, strides=(2, 2),  padding=&apos;same&apos;)
layer_conv2 = tf.layers.conv2d(inputs=net,          
                               filters=num_filters2,
                               kernel_size=filter_size2,
                               padding=&apos;same&apos;,
                               activation=tf.nn.relu,
                               name=&apos;layer_conv2&apos;)

net = tf.layers.max_pooling2d(inputs=layer_conv2, pool_size=2, strides=(2, 2),  padding=&apos;same&apos;)
layer_flat = tf.contrib.layers.flatten(net)    # flatten&#x6682;&#x65F6;&#x5728;tf.contrib&#x4E00;&#x5C42;

layer_fc1 = tf.layers.dense(inputs=layer_flat, units=fc_size, activation=tf.nn.relu, name=&apos;layer_fc1&apos;)
layer_fc2 = tf.layers.dense(inputs=layer_fc1, units=num_classes, name=&apos;layer_fc2&apos;)
</code></pre>
<h4 id>&#x4EE3;&#x4EF7;&#x3001;&#x4F18;&#x5316;&#x5668;&#x3001;&#x51C6;&#x786E;&#x7387;</h4>
<pre><code class="language-python">y_pred = tf.nn.softmax(layer_fc2)              # softmax&#x5F52;&#x4E00;&#x5316;
y_pred_cls = tf.argmax(y_pred, axis=1)         # &#x771F;&#x5B9E;&#x7C7B;&#x522B;

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=layer_fc2, labels=y_true)
cost = tf.reduce_mean(cross_entropy)

optimizer = tf.train.AdamOptimizer(learning_rate=1e-4).minimize(cost)

correct_prediction = tf.equal(y_pred_cls, y_true_cls)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
</code></pre>
<h4 id>&#x83B7;&#x53D6;&#x6743;&#x91CD;</h4>
<pre><code class="language-python">def get_weights_variable(layer_name):
    # &#x6839;&#x636E;&#x7ED9;&#x5B9A;&#x7684;layer_name&#xFF0C;&#x8FD4;&#x56DE;&#x540D;&#x4E3A;&apos;kernel&apos;&#x7684;&#x53D8;&#x91CF;
    with tf.variable_scope(layer_name, reuse=True):
        variable = tf.get_variable(&apos;kernel&apos;)
    return variable

weights_conv1 = get_weights_variable(layer_name=&apos;layer_conv1&apos;)
weights_conv2 = get_weights_variable(layer_name=&apos;layer_conv2&apos;)
</code></pre>
<h4 id="saver">Saver</h4>
<p>&#x4E3A;&#x4E86;&#x4FDD;&#x5B58;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x4E2D;&#x7684;&#x53D8;&#x91CF;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x521B;&#x5EFA;&#x4E00;&#x4E2A; Saver &#x5BF9;&#x8C61;&#x7528;&#x6765;&#x5B58;&#x50A8;&#x548C;&#x68C0;&#x7D22; TensorFlow &#x8BA1;&#x7B97;&#x56FE;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x53D8;&#x91CF;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4FDD;&#x5B58;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x7ED3;&#x679C;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x4EC5;&#x4FDD;&#x5B58;&#x6700;&#x4F18;&#x7684;&#x7ED3;&#x679C;&#x3002;</p>
<pre><code class="language-python">saver = tf.train.Saver()    # &#x7528;&#x4E8E;&#x4FDD;&#x5B58;&#x53D8;&#x91CF;

save_dir = &apos;checkpoints/&apos;   # &#x4FDD;&#x5B58;&#x76EE;&#x5F55;
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

save_path = os.path.join(save_dir, &apos;best_validation&apos;)   # &#x6700;&#x4F73;&#x9A8C;&#x8BC1;&#x7ED3;&#x679C;&#x4FDD;&#x5B58;&#x8DEF;&#x5F84;
</code></pre>
<h3 id="tensorflow">&#x8FD0;&#x884C;TensorFlow</h3>
<h4 id="session">&#x521B;&#x5EFA;session&#x5E76;&#x521D;&#x59CB;&#x5316;</h4>
<pre><code class="language-python">session = tf.Session()
session.run(tf.global_variables_initializer())
</code></pre>
<h4 id>&#x4F18;&#x5316;&#x5668;&#x7684;&#x8FED;&#x4EE3;&#x8FC7;&#x7A0B;</h4>
<p>&#x4E3A;&#x4E86;&#x6D4B;&#x8BD5;&#x4F18;&#x5316;&#x5668;&#x7684;&#x6027;&#x80FD;&#xFF0C;&#x9700;&#x8981;&#x591A;&#x6DFB;&#x52A0;&#x51E0;&#x4E2A;&#x6307;&#x6807;&#xFF0C;&#x5BF9;&#x4EE3;&#x7801;&#x8FDB;&#x884C;&#x76F8;&#x5E94;&#x8C03;&#x6574;&#x3002;</p>
<pre><code class="language-python">train_batch_size = 64

best_validation_accuracy = 0.0    # &#x5F53;&#x524D;&#x6700;&#x4F73;&#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;
last_improvement = 0     # &#x4E0A;&#x4E00;&#x6B21;&#x6709;&#x6240;&#x6539;&#x8FDB;&#x7684;&#x8F6E;&#x6B21;
require_improvement = 1000    # &#x5982;&#x679C;&#x5728;1000&#x8F6E;&#x5185;&#x6CA1;&#x6709;&#x6539;&#x8FDB;&#xFF0C;&#x505C;&#x6B62;&#x8FED;&#x4EE3;
</code></pre>
<pre><code class="language-python"># &#x8BA1;&#x7B97;&#x76EE;&#x524D;&#x6267;&#x884C;&#x7684;&#x603B;&#x8FED;&#x4EE3;&#x6B21;&#x6570;
total_iterations = 0

def optimize(num_iterations):
    # &#x4FDD;&#x8BC1;&#x66F4;&#x65B0;&#x5168;&#x5C40;&#x53D8;&#x91CF;.
    global total_iterations
    global best_validation_accuracy
    global last_improvement

    # &#x7528;&#x6765;&#x8F93;&#x51FA;&#x7528;&#x65F6;.
    start_time = time.time()

    for i in range(num_iterations):
        total_iterations += 1

        # &#x83B7;&#x53D6;&#x4E00;&#x6279;&#x6570;&#x636E;&#xFF0C;&#x8FD0;&#x884C;&#x4F18;&#x5316;&#x5668;
        x_batch, y_true_batch = data.train.next_batch(train_batch_size)
        feed_dict_train = {x: x_batch, y_true: y_true_batch}
        session.run(optimizer, feed_dict=feed_dict_train)

        # &#x6BCF;100&#x8F6E;&#x8FED;&#x4EE3;&#x8F93;&#x51FA;&#x72B6;&#x6001;
        if (total_iterations % 100 == 0) or (i == num_iterations - 1):
            # &#x8BA1;&#x7B97;&#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;.
            acc_train = session.run(accuracy, feed_dict=feed_dict_train)
            # &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;&#xFF0C;&#x4E3A;&#x4E86;&#x5C3D;&#x53EF;&#x80FD;&#x91CD;&#x7528;&#x4EE3;&#x7801;&#xFF0C;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x4F1A;&#x5728;&#x540E;&#x9762;&#x5B9E;&#x73B0;
            acc_validation, _ = validation_accuracy()

            if acc_validation &gt; best_validation_accuracy:   # &#x5982;&#x679C;&#x5F53;&#x524D;&#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;&#x5927;&#x4E8E;&#x4E4B;&#x524D;&#x7684;&#x6700;&#x597D;&#x51C6;&#x786E;&#x7387;
                best_validation_accuracy = acc_validation   # &#x66F4;&#x65B0;&#x6700;&#x597D;&#x51C6;&#x786E;&#x7387;
                last_improvement = total_iterations         # &#x66F4;&#x65B0;&#x4E0A;&#x4E00;&#x6B21;&#x63D0;&#x5347;&#x7684;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;

                saver.save(sess=session, save_path=save_path)   # &#x5C06;&#x8FD9;&#x4E00;&#x6B21;&#x66F4;&#x65B0;&#x4FDD;&#x5B58;&#x4E0B;&#x6765;
                improved_str = &apos;*&apos;    # &#x6807;&#x6CE8;&#x4E3A;&#x627E;&#x5230;&#x63D0;&#x5347;
            else:
                improved_str = &apos;&apos;    

            msg = &quot;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;: {0:&gt;6}, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: {1:&gt;6.1%}, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;: {2:&gt;6.1%} {3}&quot;
            print(msg.format(i + 1, acc_train, acc_validation, improved_str))

        # &#x5982;&#x679C;&#x5728;require_improvement&#x8F6E;&#x6B21;&#x5185;&#x672A;&#x6709;&#x63D0;&#x5347;
        if total_iterations - last_improvement &gt; require_improvement:
            print(&quot;&#x957F;&#x65F6;&#x95F4;&#x672A;&#x63D0;&#x5347;, &#x505C;&#x6B62;&#x4F18;&#x5316;&#x3002;&quot;)
            break  # &#x8DF3;&#x51FA;&#x5FAA;&#x73AF;

    end_time = time.time()
    time_dif = end_time - start_time

    # &#x8F93;&#x51FA;&#x7528;&#x65F6;.
    print(&quot;&#x7528;&#x65F6;: &quot; + str(timedelta(seconds=int(round(time_dif)))))
</code></pre>
<h4 id>&#x8BA1;&#x7B97;&#x5206;&#x7C7B;&#x6027;&#x80FD;</h4>
<p>&#x4E3A;&#x4E86;&#x91CD;&#x7528;&#x4EE3;&#x7801;&#x4EE5;&#x8BC4;&#x4F30;&#x9A8C;&#x8BC1;&#x96C6;&#x548C;&#x6D4B;&#x8BD5;&#x96C6;&#x7684;&#x6027;&#x80FD;&#xFF0C;&#x9700;&#x8981;&#x91CD;&#x6784;&#x8FD9;&#x90E8;&#x5206;&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code class="language-python">batch_size = 256

def predict_cls(images, labels, cls_true):
    num_images = len(images)

    # &#x4E3A;&#x9884;&#x6D4B;&#x7ED3;&#x679C;&#x7533;&#x8BF7;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;
    cls_pred = np.zeros(shape=num_images, dtype=np.int)

    i = 0  # &#x6570;&#x636E;&#x96C6;&#x7684;&#x8D77;&#x59CB;id&#x4E3A;0

    while i &lt; num_images:
        # j&#x4E3A;&#x4E0B;&#x4E00;&#x6279;&#x6B21;&#x7684;&#x622A;&#x6B62;id
        j = min(i + batch_size, num_images)

        # &#x521B;&#x5EFA;feed_dict
        feed_dict = {x: images[i:j, :], y_true: labels[i:j, :]}

        # &#x8BA1;&#x7B97;&#x9884;&#x6D4B;&#x7ED3;&#x679C;
        cls_pred[i:j] = session.run(y_pred_cls, feed_dict=feed_dict)

        # &#x8BBE;&#x5B9A;&#x4E3A;&#x4E0B;&#x4E00;&#x6279;&#x6B21;&#x8D77;&#x59CB;&#x503C;.
        i = j

    # &#x6B63;&#x786E;&#x7684;&#x5206;&#x7C7B;
    correct = (cls_true == cls_pred)

    return correct, cls_pred
</code></pre>
<pre><code class="language-python">def predict_cls_test():    # &#x6D4B;&#x8BD5;&#x96C6;&#x5206;&#x7C7B;&#x7ED3;&#x679C;
    return predict_cls(images = data.test.images,
                       labels = data.test.labels,
                       cls_true = data.test.cls)

def predict_cls_validation():   # &#x9A8C;&#x8BC1;&#x96C6;&#x5206;&#x7C7B;&#x7ED3;&#x679C;
    return predict_cls(images = data.validation.images,
                       labels = data.validation.labels,
                       cls_true = data.validation.cls)

def cls_accuracy(correct):    # &#x51C6;&#x786E;&#x7387;
    # &#x8BA1;&#x7B97;&#x603B;&#x7684;&#x6B63;&#x786E;&#x4E2A;&#x6570;
    correct_sum = correct.sum()
    #&#x8BA1;&#x7B97;&#x51C6;&#x786E;&#x7387;
    acc = float(correct_sum) / len(correct)
    return acc, correct_sum

def validation_accuracy():    # optimize()&#x7528;&#x5230;&#x7684;&#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;&#x51FD;&#x6570;
    correct, _ = predict_cls_validation()
    return cls_accuracy(correct)
</code></pre>
<h4 id>&#x6D4B;&#x8BD5;&#x96C6;&#x6027;&#x80FD;&#x8BC4;&#x4F30;</h4>
<pre><code class="language-python">def print_test_accuracy(show_example_errors=False,
                        show_confusion_matrix=False):

    # &#x8FD4;&#x56DE;&#x6D4B;&#x8BD5;&#x96C6;&#x7684;&#x6B63;&#x786E;&#x60C5;&#x51B5;&#x4E0E;&#x9884;&#x6D4B;&#x7ED3;&#x679C;
    correct, cls_pred = predict_cls_test()

    # &#x8BA1;&#x7B97;&#x51C6;&#x786E;&#x7387;&#xFF0C;&#x51C6;&#x786E;&#x6570;
    acc, num_correct = cls_accuracy(correct)

    num_images = len(correct)

    # &#x6253;&#x5370;&#x51C6;&#x786E;&#x7387;.
    msg = &quot;&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: {0:.1%} ({1} / {2})&quot;
    print(msg.format(acc, num_correct, num_images))

    # &#x6253;&#x5370;&#x90E8;&#x5206;&#x9519;&#x8BEF;&#x6837;&#x4F8B;.
    if show_example_errors:
        print(&quot;Example errors:&quot;)
        plot_example_errors(data_test=data.test, cls_pred=cls_pred, correct=correct, img_shape=img_shape)

    # &#x6253;&#x5370;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;.
    if show_confusion_matrix:
        print(&quot;Confusion Matrix:&quot;)
        plot_confusion_matrix(cls_true=data.test.cls, cls_pred=cls_pred)
</code></pre>
<p>&#x4F18;&#x5316;&#x524D;&#x6027;&#x80FD;&#xFF1A;</p>
<pre><code class="language-python">print_test_accuracy()
</code></pre>
<pre><code>&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 13.5% (1348 / 10000)
</code></pre>
<p>&#x6267;&#x884C; 10000 &#x8F6E;&#x8FED;&#x4EE3;&#xFF1A;</p>
<pre><code class="language-python">optimize(num_iterations=10000)
</code></pre>
<pre><code>&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    100, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  81.2%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  78.9% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    200, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  85.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  86.9% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    300, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  93.8%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  90.9% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    400, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  92.2%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  92.1% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    500, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  93.8%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  93.0% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    600, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  95.3%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  93.7% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    700, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  90.6%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  94.3% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    800, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  94.7% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    900, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  95.4% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1000, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  95.5% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1100, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  93.8%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  95.7% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1200, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.0% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1300, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  95.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1400, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.1% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1500, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.3% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1600, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.7% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1700, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  92.2%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.8% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1800, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1900, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2000, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.0% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2100, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.0% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2200, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.4% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2300, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2400, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2500, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.5% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2600, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2700, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  95.3%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2800, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.7% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2900, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.7%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3000, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  93.8%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.8% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3100, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.9% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3200, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3300, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3400, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3500, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3600, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.0% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3700, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3800, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3900, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4000, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.7%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4100, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.1% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4200, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4300, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4400, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.1% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4500, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.1%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4600, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  97.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4700, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.2% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4800, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.2% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4900, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.2%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5000, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.3% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5100, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5200, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5300, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5400, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5500, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5600, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5700, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5800, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5900, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6000, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  95.3%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6100, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6200, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.5% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6300, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6400, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.6% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6500, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6600, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.7% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6700, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.7% *
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6800, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6900, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.6%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7000, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  96.9%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.7%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7100, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7200, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.5%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7300, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.6%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7400, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.6%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7500, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7600, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.6%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7700, &#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;: 100.0%, &#x9A8C;&#x8BC1;&#x96C6;&#x51C6;&#x786E;&#x7387;:  98.7%
&#x957F;&#x65F6;&#x95F4;&#x672A;&#x63D0;&#x5347;, &#x505C;&#x6B62;&#x4F18;&#x5316;&#x3002;
&#x7528;&#x65F6;: 0:13:31
</code></pre>
<p>&#x6211;&#x4EEC;&#x53D1;&#x73B0;&#xFF0C;&#x5728;&#x7ECF;&#x8FC7; 6700 &#x8F6E;&#x6B21;&#x540E;&#xFF0C;&#x7531;&#x4E8E;&#x6027;&#x80FD;&#x4E0D;&#x518D;&#x63D0;&#x5347;&#xFF0C;&#x4F18;&#x5316;&#x5668;&#x63D0;&#x524D;&#x505C;&#x6B62;&#x4E86;&#x8FED;&#x4EE3;&#xFF0C;&#x51CF;&#x5C11;&#x4E86;&#x90E8;&#x5206;&#x7684;&#x8BAD;&#x7EC3;&#x65F6;&#x95F4;&#xFF0C;&#x800C;&#x9A8C;&#x8BC1;&#x96C6;&#x7684;&#x51C6;&#x786E;&#x7387;&#x8FBE;&#x5230;&#x4E86; 98.7%&#x3002;</p>
<pre><code class="language-python">print_test_accuracy(show_example_errors=True, show_confusion_matrix=True)
</code></pre>
<pre><code class="language-python">&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 98.7% (9865 / 10000)
Example errors:
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-4-1.png" class="kg-image" alt="TensorFlow (4) - &#x4FDD;&#x5B58;/&#x6062;&#x590D;/&#x63D0;&#x524D;&#x7EC8;&#x6B62;"></figure>
<!--kg-card-begin: markdown-->
<pre><code class="language-python">Confusion Matrix:
[[ 973    0    1    0    0    1    2    1    2    0]
 [   0 1127    2    0    0    0    2    1    3    0]
 [   0    1 1021    1    1    0    0    3    4    1]
 [   0    0    1  998    0    7    0    1    3    0]
 [   0    0    1    0  979    0    1    1    0    0]
 [   2    0    0    3    0  885    2    0    0    0]
 [   5    3    0    0    3    5  940    0    2    0]
 [   1    1    6    2    0    0    0 1017    1    0]
 [   3    0    4    2    1    2    0    3  957    2]
 [   2    4    1    4   13    6    0    7    4  968]]
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-4-2.png" class="kg-image" alt="TensorFlow (4) - &#x4FDD;&#x5B58;/&#x6062;&#x590D;/&#x63D0;&#x524D;&#x7EC8;&#x6B62;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x6253;&#x5370;&#x6743;&#x91CD;</p>
<pre><code class="language-python">weights1 = session.run(weights_conv1)
plot_conv_weights(weights=weights1)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-4-3.png" class="kg-image" alt="TensorFlow (4) - &#x4FDD;&#x5B58;/&#x6062;&#x590D;/&#x63D0;&#x524D;&#x7EC8;&#x6B62;"></figure>
<!--kg-card-begin: markdown-->
<h4 id>&#x91CD;&#x65B0;&#x521D;&#x59CB;&#x5316;</h4>
<p>&#x518D;&#x6B21;&#x91CD;&#x65B0;&#x521D;&#x59CB;&#x5316;&#x6240;&#x6709;&#x7684;&#x53D8;&#x91CF;</p>
<pre><code>session.run(tf.global_variables_initializer())    # &#x91CD;&#x65B0;&#x521D;&#x59CB;&#x5316;

print_test_accuracy()     # &#x51C6;&#x786E;&#x7387;&#x964D;&#x56DE;&#x968F;&#x673A;
</code></pre>
<pre><code class="language-python">&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 19.4% (1937 / 10000)
</code></pre>
<p>&#x53EF;&#x89C1;&#xFF0C;&#x8F93;&#x51FA;&#x964D;&#x56DE;&#x4E86;&#x968F;&#x673A;&#x7684;&#x60C5;&#x51B5;&#x3002;</p>
<pre><code class="language-python">weights1 = session.run(weights_conv1)   
plot_conv_weights(weights=weights1)     # &#x6743;&#x91CD;&#x4E5F;&#x4E0E;&#x4E0A;&#x9762;&#x7684;&#x6743;&#x91CD;&#x4E0D;&#x540C;
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-4-4.png" class="kg-image" alt="TensorFlow (4) - &#x4FDD;&#x5B58;/&#x6062;&#x590D;/&#x63D0;&#x524D;&#x7EC8;&#x6B62;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x6743;&#x91CD;&#x4E5F;&#x4E0E;&#x8BAD;&#x7EC3;&#x597D;&#x7684;&#x6A21;&#x578B;&#x5927;&#x4E0D;&#x76F8;&#x540C;&#x3002;</p>
<h4 id>&#x6062;&#x590D;&#x8DEF;&#x5F84;&#x4E0B;&#x7684;&#x53D8;&#x91CF;</h4>
<p>&#x73B0;&#x5728;&#x9700;&#x8981;&#x4ECE;&#x53D8;&#x91CF;&#x6240;&#x4FDD;&#x5B58;&#x7684;&#x8DEF;&#x5F84;&#x4E0B;&#x6062;&#x590D;&#x6240;&#x6709;&#x7684;&#x53D8;&#x91CF;&#x3002;</p>
<pre><code class="language-python">saver.restore(sess=session, save_path=save_path)   # &#x73B0;&#x5728;&#x4ECE;&#x4FDD;&#x5B58;&#x7684;&#x76EE;&#x5F55;&#x4E2D;&#x91CD;&#x65B0;&#x8F7D;&#x5165;&#x6240;&#x6709;&#x7684;&#x53D8;&#x91CF;
</code></pre>
<p>&#x518D;&#x6B21;&#x8BA1;&#x7B97;&#x51C6;&#x786E;&#x7387;</p>
<pre><code class="language-python"># &#x518D;&#x6B21;&#x6253;&#x5370;&#x6D4B;&#x8BD5;&#x51C6;&#x786E;&#x7387;
print_test_accuracy(show_example_errors=True, show_confusion_matrix=True)
</code></pre>
<pre><code class="language-python">&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 98.6% (9864 / 10000)
Example errors:
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-4-5-1.png" class="kg-image" alt="TensorFlow (4) - &#x4FDD;&#x5B58;/&#x6062;&#x590D;/&#x63D0;&#x524D;&#x7EC8;&#x6B62;"></figure>
<!--kg-card-begin: markdown-->
<pre><code class="language-python">Confusion Matrix:
[[ 974    0    1    0    0    1    2    0    1    1]
 [   0 1126    3    0    0    0    2    1    3    0]
 [   0    0 1022    1    1    0    0    3    4    1]
 [   0    0    1 1002    0    3    0    1    2    1]
 [   0    0    1    0  980    0    1    0    0    0]
 [   2    0    0    4    0  882    2    0    0    2]
 [   3    2    0    0    3    6  942    0    2    0]
 [   1    3    7    3    0    0    0 1005    1    8]
 [   4    0    6    6    1    3    1    2  946    5]
 [   2    3    2    3    7    4    0    2    1  985]]
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-4-6-2.png" class="kg-image" alt="TensorFlow (4) - &#x4FDD;&#x5B58;/&#x6062;&#x590D;/&#x63D0;&#x524D;&#x7EC8;&#x6B62;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x6D4B;&#x8BD5;&#x96C6;&#x7684;&#x51C6;&#x786E;&#x7387;&#x8FBE;&#x5230;&#x4E86; 98.6%&#xFF0C;&#x4E0E;&#x524D;&#x9762;&#x8BAD;&#x7EC3;&#x597D;&#x7684;&#x6A21;&#x578B;&#x76F8;&#x5DEE;&#x65E0;&#x51E0;&#x3002;</p>
<pre><code class="language-python">weights1 = session.run(weights_conv1)
plot_conv_weights(weights=weights1)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-4-7-1.png" class="kg-image" alt="TensorFlow (4) - &#x4FDD;&#x5B58;/&#x6062;&#x590D;/&#x63D0;&#x524D;&#x7EC8;&#x6B62;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x8FD9;&#x4E00;&#x6B21;&#x6743;&#x91CD;&#x548C;&#x8BAD;&#x7EC3;&#x8FC7;&#x540E;&#x7684;&#x5C31;&#x57FA;&#x672C;&#x76F8;&#x540C;&#x4E86;&#xFF0C;&#x5B58;&#x5728;&#x8F7B;&#x5FAE;&#x4E0D;&#x540C;&#x7684;&#x539F;&#x56E0;&#x662F;&#x539F;&#x59CB;&#x7684;&#x6A21;&#x578B;&#x591A;&#x8BAD;&#x7EC3;&#x4E86; 1000 &#x6B21;&#x3002;</p>
<p>&#x5728;&#x91CD;&#x65B0;&#x8F7D;&#x5165;&#x53D8;&#x91CF;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x53EF;&#x4EE5;&#x7EE7;&#x7EED;&#x4F18;&#x5316;&#x8FD9;&#x4E9B;&#x53D8;&#x91CF;&#x3002;</p>
<h4 id="session">&#x5173;&#x95ED; session</h4>
<pre><code class="language-python">session.close()
</code></pre>
<!--kg-card-end: markdown-->
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[TensorFlow (3) - Layers API]]></title><description><![CDATA[本章主要说明如何使用TensorFlow API简化神经网络构建，以及新的变量获取方法，在原作的基础上会做相应的改变。]]></description><link>https://gaussic.com/tensorflow-layers-api/</link><guid isPermaLink="false">626173b75d2e434866501f8b</guid><category><![CDATA[TensorFlow]]></category><category><![CDATA[API]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Tue, 15 Aug 2017 06:47:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/winter-4708505_1280.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/winter-4708505_1280.jpg" alt="TensorFlow (3) - Layers API"><p>&#x8FD9;&#x662F;&#x51E0;&#x7BC7;&#x4E0E;&#x539F;&#x4F5C;&#x4E0D;&#x5B8C;&#x5168;&#x76F8;&#x540C;&#x7684;&#x6559;&#x7A0B;&#x3002;</p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x8BF4;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/tensorflow-layers-api/">TensorFlow (3) - Layers API</a></p>
<p>&#x539F;&#x4F5C;&#x8005;&#xFF1A;<a href="http://www.hvass-labs.org/">Magnus Erik Hvass Pedersen</a> / <a href="https://github.com/Hvass-Labs/TensorFlow-Tutorials">GitHub</a> / <a href="https://www.youtube.com/playlist?list=PL9Hr9sNUjfsmEu1ZniY0XpHSzl5uihcXZ">Videos on YouTube</a></p>
<p>&#x5728; <a href="https://gaussic.github.io/2017/08/14/tensorflow-cnn/">&#x7B2C;&#x4E8C;&#x7AE0;</a> &#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5B9E;&#x73B0;&#x4E86;&#x4F7F;&#x7528;&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x5BF9; MNIST &#x6570;&#x636E;&#x96C6;&#x8FDB;&#x884C;&#x5206;&#x7C7B;&#x3002;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x9700;&#x8981;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684; CNN &#x6A21;&#x578B;&#xFF0C;&#x4E5F;&#x9700;&#x8981;&#x5B9E;&#x73B0;&#x5F88;&#x591A;&#x7EC6;&#x8282;&#x7C7B;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x5982;&#x5B9A;&#x4E49;&#x6743;&#x91CD;&#x3001;&#x504F;&#x7F6E;&#x3001;&#x5C55;&#x5E73;&#x64CD;&#x4F5C;&#x7B49;&#x3002;TensorFlow &#x5BF9;&#x8FD9;&#x4E9B;&#x6A21;&#x578B;&#x505A;&#x4E86;&#x4E00;&#x5B9A;&#x7684; API &#x5C01;&#x88C5;&#xFF0C;&#x4F7F;&#x5F97;&#x4F7F;&#x7528;&#x8005;&#x53EF;&#x4EE5;&#x66F4;&#x52A0;&#x65B9;&#x4FBF;&#x5730;&#x5B9E;&#x73B0;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x6784;&#x5EFA;&#x3002;</p>
<p>&#x5728; TensorFlow &#x4E2D;&#x5B58;&#x5728;&#x7684; API &#x6709;&#x591A;&#x4E2A;&#xFF0C;&#x6700;&#x5927;&#x7684;&#x662F; <code>tf.contrib</code> &#xFF0C;&#x5176;&#x4E2D;&#x5C01;&#x88C5;&#x4E86;&#x5927;&#x91CF;&#x7684;&#x7F51;&#x7EDC;&#x5C42;layers&#xFF0C;&#x4EE5;&#x53CA;&#x65B0;&#x96C6;&#x6210;&#x7684; keras &#x7F51;&#x7EDC;&#x5C42;&#x3002;&#x90E8;&#x5206;&#x7684; layers &#x4E5F;&#x91CD;&#x5B9A;&#x5411;&#x5230;&#x4E86;&#x5916;&#x5C42;&#xFF0C;&#x53EF;&#x76F4;&#x63A5;&#x4F7F;&#x7528; <code>tf.layers</code>&#xFF0C;&#x800C;&#x4E0D;&#x9700;&#x8981; <code>tf.contrib.layers</code>&#x3002;&#x8BBF;&#x95EE; <a href="https://www.tensorflow.org/api_docs/python/tf/layers">&#x8FD9;&#x4E2A;&#x94FE;&#x63A5;</a> &#x53EF;&#x4EE5;&#x4E86;&#x89E3; <code>tf.layers</code> &#x6240;&#x652F;&#x6301;&#x7684;&#x7F51;&#x7EDC;&#x5C42;&#x3002;</p>
<p>&#x672C;&#x7AE0;&#x8282;&#x5C1D;&#x8BD5;&#x4F7F;&#x7528; <code>tf.layers</code> &#x6765;&#x91CD;&#x65B0;&#x5B9E;&#x73B0; <a href="https://gaussic.github.io/2017/08/14/tensorflow-cnn/">&#x7B2C;&#x4E8C;&#x7AE0;</a> &#x7684;&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x3002;&#x5176;&#x4E2D;&#x5927;&#x91CF;&#x7684;&#x5E2E;&#x52A9;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x91CD;&#x7528;&#x3002;&#x91CD;&#x7528;&#x8FD9;&#x4E9B;&#x51FD;&#x6570;&#x9700;&#x8981;&#x505A;&#x4E00;&#x5B9A;&#x7684;&#x4FEE;&#x6539;&#x3002;&#x73B0;&#x5728;&#x628A;&#x8FD9;&#x4E9B;&#x51FD;&#x6570;&#x653E;&#x5728;&#x4E00;&#x4E2A;&#x5355;&#x72EC;&#x7684;&#x811A;&#x672C;&#x4E2D;&#x3002;</p>
<p>&#x6587;&#x4EF6;&#xFF1A;<code>cnn_helper.py</code></p>
<pre><code class="language-python">import tensorflow as tf          # TensorFlow
import matplotlib.pyplot as plt  # matplotlib&#x7ED8;&#x56FE;
import numpy as np               # Numpy
from sklearn.metrics import confusion_matrix    # &#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#xFF0C;&#x5206;&#x6790;&#x6A21;&#x578B;&#x8BEF;&#x5DEE;

import time       # &#x8BA1;&#x65F6;
from datetime import timedelta
import math


def plot_images(images, cls_true, img_shape, cls_pred=None):
    &quot;&quot;&quot;
    &#x7ED8;&#x5236;&#x56FE;&#x50CF;&#xFF0C;&#x8F93;&#x51FA;&#x771F;&#x5B9E;&#x6807;&#x7B7E;&#x4E0E;&#x9884;&#x6D4B;&#x6807;&#x7B7E;
    images:   &#x56FE;&#x50CF;&#xFF08;9&#x5F20;&#xFF09;
    cls_true: &#x771F;&#x5B9E;&#x7C7B;&#x522B;
    cls_pred: &#x9884;&#x6D4B;&#x7C7B;&#x522B;
    &quot;&quot;&quot;
    assert len(images) == len(cls_true) == 9   # &#x4FDD;&#x8BC1;&#x5B58;&#x5728;9&#x5F20;&#x56FE;&#x7247;


    fig, axes = plt.subplots(3, 3)   # &#x521B;&#x5EFA;3x3&#x4E2A;&#x5B50;&#x56FE;&#x7684;&#x753B;&#x5E03;
    fig.subplots_adjust(hspace=0.3, wspace=0.3)  # &#x8C03;&#x6574;&#x6BCF;&#x5F20;&#x56FE;&#x4E4B;&#x95F4;&#x7684;&#x95F4;&#x9694;

    for i, ax in enumerate(axes.flat):
        # &#x7ED8;&#x56FE;&#xFF0C;&#x5C06;&#x4E00;&#x7EF4;&#x5411;&#x91CF;&#x53D8;&#x4E3A;&#x4E8C;&#x7EF4;&#x77E9;&#x9635;&#xFF0C;&#x9ED1;&#x767D;&#x4E8C;&#x503C;&#x56FE;&#x50CF;&#x4F7F;&#x7528; binary
        ax.imshow(images[i].reshape(img_shape), cmap=&apos;binary&apos;)

        if cls_pred is None:  # &#x5982;&#x679C;&#x672A;&#x4F20;&#x5165;&#x9884;&#x6D4B;&#x7C7B;&#x522B;
            xlabel = &quot;True: {0}&quot;.format(cls_true[i])
        else:
            xlabel = &quot;True: {0}, Pred: {1}&quot;.format(cls_true[i], cls_pred[i])
        ax.set_xlabel(xlabel)

        # &#x5220;&#x9664;&#x5750;&#x6807;&#x4FE1;&#x606F;
        ax.set_xticks([])
        ax.set_yticks([])    
    plt.show()


def plot_example_errors(data_test, cls_pred, correct, img_shape):
    # &#x8BA1;&#x7B97;&#x9519;&#x8BEF;&#x60C5;&#x51B5;
    incorrect = (correct == False)
    images = data_test.images[incorrect]
    cls_pred = cls_pred[incorrect]
    cls_true = data_test.cls[incorrect]

    # &#x968F;&#x673A;&#x6311;&#x9009;9&#x4E2A;
    indices = np.arange(len(images))
    np.random.shuffle(indices)
    indices = indices[:9]

    plot_images(images[indices], cls_true[indices], img_shape, cls_pred[indices])


def plot_confusion_matrix(cls_true, cls_pred):  

    # &#x4F7F;&#x7528;scikit-learn&#x7684;confusion_matrix&#x6765;&#x8BA1;&#x7B97;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;
    cm = confusion_matrix(y_true=cls_true, y_pred=cls_pred)

    # &#x6253;&#x5370;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;
    print(cm)

    num_classes = cm.shape[0]

    # &#x5C06;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#x8F93;&#x51FA;&#x4E3A;&#x56FE;&#x50CF;
    plt.imshow(cm, interpolation=&apos;nearest&apos;, cmap=plt.cm.Blues)

    # &#x8C03;&#x6574;&#x56FE;&#x50CF;
    plt.tight_layout()
    plt.colorbar()
    tick_marks = np.arange(num_classes)
    plt.xticks(tick_marks, range(num_classes))
    plt.yticks(tick_marks, range(num_classes))
    plt.xlabel(&apos;Predicted&apos;)
    plt.ylabel(&apos;True&apos;)
    plt.show()


def plot_conv_weights(weights, input_channel=0):
    # weights_conv1 or weights_conv2.


    # &#x83B7;&#x53D6;&#x6743;&#x91CD;&#x6700;&#x5C0F;&#x503C;&#x6700;&#x5927;&#x503C;&#xFF0C;&#x8FD9;&#x5C06;&#x7528;&#x6237;&#x7EA0;&#x6B63;&#x6574;&#x4E2A;&#x56FE;&#x50CF;&#x7684;&#x989C;&#x8272;&#x5BC6;&#x96C6;&#x5EA6;&#xFF0C;&#x6765;&#x8FDB;&#x884C;&#x5BF9;&#x6BD4;
    w_min = np.min(weights)
    w_max = np.max(weights)

    # &#x5377;&#x79EF;&#x6838;&#x6811;&#x6728;
    num_filters = weights.shape[3]

    # &#x6BCF;&#x884C;&#x9700;&#x8981;&#x8F93;&#x51FA;&#x7684;&#x5377;&#x79EF;&#x6838;&#x7F51;&#x683C;&#x6570;
    num_grids = math.ceil(math.sqrt(num_filters))

    fig, axes = plt.subplots(num_grids, num_grids)
    for i, ax in enumerate(axes.flat):
        # &#x53EA;&#x8F93;&#x51FA;&#x6709;&#x7528;&#x7684;&#x5B50;&#x56FE;.
        if i&lt;num_filters:
            # &#x83B7;&#x5F97;&#x7B2C;i&#x4E2A;&#x5377;&#x79EF;&#x6838;&#x5728;&#x7279;&#x5B9A;&#x8F93;&#x5165;&#x901A;&#x9053;&#x4E0A;&#x7684;&#x6743;&#x91CD;
            img = weights[:, :, input_channel, i]

            ax.imshow(img, vmin=w_min, vmax=w_max,
                      interpolation=&apos;nearest&apos;, cmap=&apos;seismic&apos;)

        # &#x79FB;&#x9664;&#x5750;&#x6807;.
        ax.set_xticks([])
        ax.set_yticks([])
    plt.show()


def plot_conv_layer(values):
    # layer_conv1 or layer_conv2

    # &#x5377;&#x79EF;&#x6838;&#x6570;&#x76EE;
    num_filters = values.shape[3]

    # &#x6BCF;&#x884C;&#x9700;&#x8981;&#x8F93;&#x51FA;&#x7684;&#x5377;&#x79EF;&#x6838;&#x7F51;&#x683C;&#x6570;
    num_grids = math.ceil(math.sqrt(num_filters))

    fig, axes = plt.subplots(num_grids, num_grids)
    for i, ax in enumerate(axes.flat):
        # &#x53EA;&#x8F93;&#x51FA;&#x6709;&#x7528;&#x7684;&#x5B50;&#x56FE;.
        if i&lt;num_filters:
            # &#x83B7;&#x53D6;&#x7B2C;i&#x4E2A;&#x5377;&#x79EF;&#x6838;&#x7684;&#x8F93;&#x51FA;
            img = values[0, :, :, i]

            ax.imshow(img, interpolation=&apos;nearest&apos;, cmap=&apos;binary&apos;)

        # &#x79FB;&#x9664;&#x5750;&#x6807;.
        ax.set_xticks([])
        ax.set_yticks([])
    plt.show()


def plot_image(image, img_shape):
    plt.imshow(image.reshape(img_shape),
               interpolation=&apos;nearest&apos;,
               cmap=&apos;binary&apos;)
    plt.show()
</code></pre>
<h3 id>&#x5F15;&#x5165;</h3>
<pre><code class="language-python">from cnn_helper import *

# notebook&#x4F7F;&#x7528;
%load_ext autoreload  
%autoreload 2
%matplotlib inline
</code></pre>
<h3 id>&#x8F7D;&#x5165;&#x6570;&#x636E;</h3>
<p>&#x8FD9;&#x4E00;&#x5757;&#x4E0E;&#x524D;&#x51E0;&#x7AE0;&#x4E00;&#x6837;&#xFF0C;&#x4E0D;&#x505A;&#x4ECB;&#x7ECD;&#xFF1A;</p>
<pre><code class="language-python">from tensorflow.examples.tutorials.mnist import input_data
data = input_data.read_data_sets(&apos;data/MNIST/&apos;, one_hot=True)

print(&quot;&#x6570;&#x636E;&#x96C6;&#x5927;&#x5C0F;&#xFF1A;&quot;)
print(&apos;- &#x8BAD;&#x7EC3;&#x96C6;&#xFF1A;{}&apos;.format(len(data.train.labels)))
print(&apos;- &#x6D4B;&#x8BD5;&#x96C6;&#xFF1A;{}&apos;.format(len(data.test.labels)))
print(&apos;- &#x9A8C;&#x8BC1;&#x96C6;&#xFF1A;{}&apos;.format(len(data.validation.labels)))
</code></pre>
<pre><code class="language-python">&#x6570;&#x636E;&#x96C6;&#x5927;&#x5C0F;&#xFF1A;
- &#x8BAD;&#x7EC3;&#x96C6;&#xFF1A;55000
- &#x6D4B;&#x8BD5;&#x96C6;&#xFF1A;10000
- &#x9A8C;&#x8BC1;&#x96C6;&#xFF1A;5000
</code></pre>
<pre><code class="language-python">data.test.cls = np.argmax(data.test.labels, axis=1)
print(&quot;&#x6837;&#x672C;&#x7EF4;&#x5EA6;&#xFF1A;&quot;, data.train.images.shape)
print(&quot;&#x6807;&#x7B7E;&#x7EF4;&#x5EA6;&#xFF1A;&quot;, data.train.labels.shape)
</code></pre>
<pre><code class="language-python">&#x6837;&#x672C;&#x7EF4;&#x5EA6;&#xFF1A; (55000, 784)
&#x6807;&#x7B7E;&#x7EF4;&#x5EA6;&#xFF1A; (55000, 10)
</code></pre>
<pre><code class="language-python">img_size = 28                        # &#x56FE;&#x7247;&#x7684;&#x9AD8;&#x5EA6;&#x548C;&#x5BBD;&#x5EA6;
img_size_flat = img_size * img_size  # &#x5C55;&#x5E73;&#x4E3A;&#x5411;&#x91CF;&#x7684;&#x5C3A;&#x5BF8;
img_shape = (img_size, img_size)     # &#x56FE;&#x7247;&#x7684;&#x4E8C;&#x7EF4;&#x5C3A;&#x5BF8;

num_channels = 1                     # &#x8F93;&#x5165;&#x4E3A;&#x5355;&#x901A;&#x9053;&#x7070;&#x5EA6;&#x56FE;&#x50CF;
num_classes = 10                     # &#x7C7B;&#x522B;&#x6570;&#x76EE;

# &#x968F;&#x673A;&#x53D6;9&#x5F20;&#x56FE;&#x7247;
indices = np.arange(len(data.test.cls))
np.random.shuffle(indices)
indices = indices[:9]    

images = data.test.images[indices]
cls_true = data.test.cls[indices]

plot_images(images, cls_true, img_shape)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-3-1.png" class="kg-image" alt="TensorFlow (3) - Layers API"></figure>
<!--kg-card-begin: markdown-->
<h3 id>&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x5360;&#x4F4D;&#x7B26;</h3>
<pre><code class="language-python"># &#x5377;&#x79EF;&#x5C42; 1
filter_size1 = 5          # 5 x 5 &#x5377;&#x79EF;&#x6838;
num_filters1 = 16         # &#x5171; 16 &#x4E2A;&#x5377;&#x79EF;&#x6838;

# &#x5377;&#x79EF;&#x5C42; 2
filter_size2 = 5          # 5 x 5 &#x5377;&#x79EF;&#x6838;
num_filters2 = 36         # &#x5171; 36 &#x4E2A;&#x5377;&#x79EF;&#x6838;

# &#x5168;&#x8FDE;&#x63A5;&#x5C42;
fc_size = 128             # &#x5168;&#x8FDE;&#x63A5;&#x5C42;&#x795E;&#x7ECF;&#x5143;&#x6570;

x = tf.placeholder(tf.float32, shape=[None, img_size_flat], name=&apos;x&apos;)          # &#x539F;&#x59CB;&#x8F93;&#x5165;
x_image = tf.reshape(x, [-1, img_size, img_size, num_channels])                # &#x8F6C;&#x6362;&#x4E3A;2&#x7EF4;&#x56FE;&#x50CF;
y_true = tf.placeholder(tf.float32, shape=[None, num_classes], name=&apos;y_true&apos;)  # &#x539F;&#x59CB;&#x8F93;&#x51FA;
y_true_cls = tf.argmax(y_true, axis=1)                                         # &#x8F6C;&#x6362;&#x4E3A;&#x771F;&#x5B9E;&#x7C7B;&#x522B;
</code></pre>
<h3 id="layersapi">&#x4F7F;&#x7528;layers API&#x6784;&#x5EFA;&#x7F51;&#x7EDC;</h3>
<pre><code class="language-python">layer_conv1 = tf.layers.conv2d(inputs=x_image,            # &#x8F93;&#x5165;
                               filters=num_filters1,      # &#x5377;&#x79EF;&#x6838;&#x4E2A;&#x6570;
                               kernel_size=filter_size1,  # &#x5377;&#x79EF;&#x6838;&#x5C3A;&#x5BF8;
                               padding=&apos;same&apos;,            # padding&#x65B9;&#x6CD5;
                               activation=tf.nn.relu,     # &#x6FC0;&#x6D3B;&#x51FD;&#x6570;relu
                               name=&apos;layer_conv1&apos;)        # &#x547D;&#x540D;&#x7528;&#x4E8E;&#x83B7;&#x53D6;&#x53D8;&#x91CF;
print(layer_conv1)
</code></pre>
<pre><code class="language-python">Tensor(&quot;layer_conv1/Relu:0&quot;, shape=(?, 28, 28, 16), dtype=float32)
</code></pre>
<p>&#x8F93;&#x51FA;&#x4E3A; <code>(?, 28, 28, 16)</code> &#x7684; Tensor&#xFF0C;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x4F7F;&#x7528; API &#x7701;&#x53BB;&#x4E86;&#x5927;&#x91CF;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x5982;&#x5B9A;&#x4E49; weight, biase, strides, relu &#x7B49;&#x53C2;&#x6570;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x4F20;&#x5165;&#x9002;&#x5F53;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5B8C;&#x6210;&#x4E0E;&#x4E4B;&#x524D;&#x540C;&#x6837;&#x7684;&#x64CD;&#x4F5C;&#x3002;</p>
<pre><code class="language-python">net = tf.layers.max_pooling2d(inputs=layer_conv1, pool_size=2, strides=(2, 2),  padding=&apos;same&apos;)
layer_conv2 = tf.layers.conv2d(inputs=net,          
                               filters=num_filters2,
                               kernel_size=filter_size2,
                               padding=&apos;same&apos;,
                               activation=tf.nn.relu,
                               name=&apos;layer_conv2&apos;)
print(layer_conv2)
</code></pre>
<pre><code class="language-python">Tensor(&quot;layer_conv2/Relu:0&quot;, shape=(?, 14, 14, 36), dtype=float32)
</code></pre>
<p>&#x6211;&#x4EEC;&#x4E3A;&#x4E24;&#x4E2A;&#x5377;&#x79EF;&#x5C42;&#x90FD;&#x52A0;&#x4E86;&#x4E00;&#x4E2A; <code>name</code> &#x53C2;&#x6570;&#xFF0C;&#x8FD9;&#x4E2A;&#x53C2;&#x6570;&#x7528;&#x6765;&#x6307;&#x660E;&#x8BE5;&#x7F51;&#x7EDC;&#x5C42;&#x5728; TensorFlow &#x8BA1;&#x7B97;&#x56FE;&#x4E2D;&#x7684;&#x540D;&#x5B57;&#xFF0C;&#x5728;&#x540E;&#x9762;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x8FD9;&#x4E2A;&#x540D;&#x5B57;&#x6765;&#x8BBF;&#x95EE;&#x8FD9;&#x4E00;&#x5C42;&#x7684;&#x4FE1;&#x606F;&#x3002;</p>
<pre><code class="language-python">net = tf.layers.max_pooling2d(inputs=layer_conv2, pool_size=2, strides=(2, 2),  padding=&apos;same&apos;)
layer_flat = tf.contrib.layers.flatten(net)    # flatten&#x6682;&#x65F6;&#x5728;tf.contrib&#x4E00;&#x5C42;
print(layer_flat)
</code></pre>
<pre><code class="language-python">Tensor(&quot;Flatten/Reshape:0&quot;, shape=(?, 1764), dtype=float32)
</code></pre>
<p>&#x5C55;&#x5E73;&#x5C42;&#x81EA;&#x52A8;&#x7684;&#x5C06;&#x8F93;&#x5165;&#x5C55;&#x5E73;&#x6210; 2 &#x7EF4;&#x7684; tensor&#xFF0C;&#x800C;&#x4E0D;&#x9700;&#x8981;&#x4EBA;&#x4E3A;&#x7684;&#x4F7F;&#x7528; <code>tf.reshape</code> &#x6765;&#x64CD;&#x4F5C;&#x3002;&#x76EE;&#x524D;&#x8BE5;&#x5C42;&#x4ECD;&#x7136;&#x5728; <code>tf.contrib.layers</code> &#x4E0B;&#xFF0C;&#x672A;&#x6765;&#x53EF;&#x80FD;&#x4F1A;&#x76F4;&#x63A5;&#x5230; <code>tf.layers</code> &#x4E0B;&#x3002;</p>
<pre><code class="language-python">layer_fc1 = tf.layers.dense(inputs=layer_flat, units=fc_size, activation=tf.nn.relu, name=&apos;layer_fc1&apos;)
print(layer_fc1)
</code></pre>
<pre><code class="language-python">Tensor(&quot;layer_fc1/Relu:0&quot;, shape=(?, 128), dtype=float32)
</code></pre>
<p>TensorFlow &#x4E0E; Keras &#x4E00;&#x6837;&#xFF0C;&#x4F7F;&#x7528;&#x4E86; dense &#x6765;&#x8868;&#x793A;&#x5168;&#x8FDE;&#x63A5;&#x5C42;&#xFF0C;&#x7528;&#x6237;&#x65E0;&#x9700;&#x5728;&#x4F7F;&#x7528; <code>tf.matmul</code> &#x6765;&#x5B9A;&#x4E49;&#x8FD9;&#x4E00;&#x5C42;&#x3002;</p>
<pre><code class="language-python">layer_fc2 = tf.layers.dense(inputs=layer_fc1, units=num_classes, name=&apos;layer_fc2&apos;)
print(layer_fc2)
</code></pre>
<pre><code class="language-python">Tensor(&quot;layer_fc2/BiasAdd:0&quot;, shape=(?, 10), dtype=float32)
</code></pre>
<p>&#x6700;&#x540E;&#x4F7F;&#x7528;&#x4E00;&#x4E2A; dense &#x5C42;&#x5C06;&#x5176;&#x6620;&#x5C04;&#x4E3A; <code>(?, 10)</code> &#x7684; tensor&#xFF0C;&#x7528;&#x4E8E;&#x540E;&#x7EED;&#x7684;&#x5206;&#x7C7B;&#x3002;</p>
<h3 id>&#x9884;&#x6D4B;</h3>
<p>&#x8FD9;&#x4E00;&#x90E8;&#x5206;&#x7684;&#x4EE3;&#x7801;&#x4E0E;&#x7B2C;&#x4E8C;&#x7AE0;&#x5B8C;&#x5168;&#x76F8;&#x540C;&#xFF1A;</p>
<pre><code class="language-python">y_pred = tf.nn.softmax(layer_fc2)              # softmax&#x5F52;&#x4E00;&#x5316;
y_pred_cls = tf.argmax(y_pred, axis=1)         # &#x771F;&#x5B9E;&#x7C7B;&#x522B;

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=layer_fc2,
                                                        labels=y_true)
cost = tf.reduce_mean(cross_entropy)

optimizer = tf.train.AdamOptimizer(learning_rate=1e-4).minimize(cost)

correct_prediction = tf.equal(y_pred_cls, y_true_cls)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
</code></pre>
<h3 id>&#x6743;&#x91CD;&#x8F93;&#x51FA;</h3>
<p>&#x4E3A;&#x4E86;&#x8F93;&#x51FA;&#x7F51;&#x7EDC;&#x7684;&#x6743;&#x91CD;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x4E00;&#x4E9B;&#x5176;&#x4ED6;&#x7684;&#x64CD;&#x4F5C;&#x3002;TensorFlow &#x5185;&#x90E8;&#x7EF4;&#x62A4;&#x4E86;&#x4E00;&#x7CFB;&#x5217;&#x7684;&#x53D8;&#x91CF;&#x540D;&#x3002;</p>
<p>&#x5C1D;&#x8BD5;&#x6253;&#x5370;&#x6240;&#x6709;&#x7684;&#x53D8;&#x91CF;&#x540D;&#xFF1A;</p>
<pre><code class="language-python">for var in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES):
    print(var)
</code></pre>
<pre><code class="language-python">&lt;tf.Variable &apos;layer_conv1/kernel:0&apos; shape=(5, 5, 1, 16) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv1/bias:0&apos; shape=(16,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv2/kernel:0&apos; shape=(5, 5, 16, 36) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv2/bias:0&apos; shape=(36,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc1/kernel:0&apos; shape=(1764, 128) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc1/bias:0&apos; shape=(128,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc2/kernel:0&apos; shape=(128, 10) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc2/bias:0&apos; shape=(10,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;beta1_power:0&apos; shape=() dtype=float32_ref&gt;
&lt;tf.Variable &apos;beta2_power:0&apos; shape=() dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv1/kernel/Adam:0&apos; shape=(5, 5, 1, 16) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv1/kernel/Adam_1:0&apos; shape=(5, 5, 1, 16) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv1/bias/Adam:0&apos; shape=(16,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv1/bias/Adam_1:0&apos; shape=(16,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv2/kernel/Adam:0&apos; shape=(5, 5, 16, 36) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv2/kernel/Adam_1:0&apos; shape=(5, 5, 16, 36) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv2/bias/Adam:0&apos; shape=(36,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_conv2/bias/Adam_1:0&apos; shape=(36,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc1/kernel/Adam:0&apos; shape=(1764, 128) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc1/kernel/Adam_1:0&apos; shape=(1764, 128) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc1/bias/Adam:0&apos; shape=(128,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc1/bias/Adam_1:0&apos; shape=(128,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc2/kernel/Adam:0&apos; shape=(128, 10) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc2/kernel/Adam_1:0&apos; shape=(128, 10) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc2/bias/Adam:0&apos; shape=(10,) dtype=float32_ref&gt;
&lt;tf.Variable &apos;layer_fc2/bias/Adam_1:0&apos; shape=(10,) dtype=float32_ref&gt;
</code></pre>
<p>&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x5728; layer_conv1 &#x548C; layer_conv2 &#x4E0B;&#x7684;&#x53D8;&#x91CF; kernel &#x4E0E;&#x6211;&#x4EEC;&#x6240;&#x9700;&#x7684;&#x6743;&#x91CD;&#x6709;&#x7740;&#x540C;&#x6837;&#x7684; shape&#xFF0C;&#x8FD9;&#x6B63;&#x662F;&#x6211;&#x4EEC;&#x6240;&#x9700;&#x8981;&#x7684;&#x6743;&#x91CD;&#x7684;&#x53D8;&#x91CF;&#x540D;&#x3002;&#x73B0;&#x5728;&#x6211;&#x4EEC;&#x5C1D;&#x8BD5;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x53D8;&#x91CF;&#x540D;&#x83B7;&#x53D6;&#x6743;&#x91CD;&#x8FD9;&#x4E00;&#x53D8;&#x91CF;&#xFF1A;</p>
<pre><code class="language-python">def get_weights_variable(layer_name):
    # &#x6839;&#x636E;&#x7ED9;&#x5B9A;&#x7684;layer_name&#xFF0C;&#x8FD4;&#x56DE;&#x540D;&#x4E3A;&apos;kernel&apos;&#x7684;&#x53D8;&#x91CF;
    with tf.variable_scope(layer_name, reuse=True):
        variable = tf.get_variable(&apos;kernel&apos;)
    return variable

weights_conv1 = get_weights_variable(layer_name=&apos;layer_conv1&apos;)
weights_conv2 = get_weights_variable(layer_name=&apos;layer_conv2&apos;)
</code></pre>
<h3 id>&#x4F18;&#x5316;&#x4E0E;&#x6D4B;&#x8BD5;</h3>
<p>&#x521B;&#x5EFA; session&#xFF1A;</p>
<pre><code class="language-python">session = tf.Session()
session.run(tf.global_variables_initializer())
</code></pre>
<p>&#x4EE5;&#x4E0B;&#x7684;&#x4EE3;&#x7801;&#x4E3A;&#x4E86;&#x9002;&#x5E94;&#x72EC;&#x7ACB;&#x51FA;&#x6765;&#x7684; <code>cnn_helper.py</code> &#x505A;&#x4E86;&#x5C0F;&#x90E8;&#x5206;&#x7684;&#x6539;&#x53D8;&#xFF1A;</p>
<pre><code class="language-python">train_batch_size = 64

# &#x8BA1;&#x7B97;&#x76EE;&#x524D;&#x6267;&#x884C;&#x7684;&#x603B;&#x8FED;&#x4EE3;&#x6B21;&#x6570;
total_iterations = 0

def optimize(num_iterations):
    # &#x4FDD;&#x8BC1;&#x66F4;&#x65B0;&#x5168;&#x5C40;&#x53D8;&#x91CF;.
    global total_iterations

    # &#x7528;&#x6765;&#x8F93;&#x51FA;&#x7528;&#x65F6;.
    start_time = time.time()

    for i in range(total_iterations, total_iterations + num_iterations):
        # &#x83B7;&#x53D6;&#x4E00;&#x6279;&#x6570;&#x636E;&#xFF0C;&#x653E;&#x5165;dict&#xFF0C;&#x540C;&#x7B2C;&#x4E00;&#x7AE0;
        x_batch, y_true_batch = data.train.next_batch(train_batch_size)
        feed_dict_train = {x: x_batch,
                           y_true: y_true_batch}
        # &#x8FD0;&#x884C;&#x4F18;&#x5316;&#x5668;
        session.run(optimizer, feed_dict=feed_dict_train)

        # &#x6BCF;100&#x8F6E;&#x8FED;&#x4EE3;&#x8F93;&#x51FA;&#x72B6;&#x6001;
        if i % 100 == 0:
            # &#x8BA1;&#x7B97;&#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;.
            acc = session.run(accuracy, feed_dict=feed_dict_train)
            msg = &quot;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;: {0:&gt;6}, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: {1:&gt;6.1%}&quot;
            print(msg.format(i + 1, acc))

    total_iterations += num_iterations

    end_time = time.time()
    time_dif = end_time - start_time

    # &#x8F93;&#x51FA;&#x7528;&#x65F6;.
    print(&quot;&#x7528;&#x65F6;: &quot; + str(timedelta(seconds=int(round(time_dif)))))

# &#x5C06;&#x6D4B;&#x8BD5;&#x96C6;&#x5206;&#x6210;&#x66F4;&#x5C0F;&#x7684;&#x6279;&#x6B21;
test_batch_size = 256

def print_test_accuracy(show_example_errors=False,
                        show_confusion_matrix=False):
    # &#x6D4B;&#x8BD5;&#x96C6;&#x56FE;&#x50CF;&#x6570;&#x91CF;.
    num_test = len(data.test.images)

    # &#x4E3A;&#x9884;&#x6D4B;&#x7ED3;&#x679C;&#x7533;&#x8BF7;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;.
    cls_pred = np.zeros(shape=num_test, dtype=np.int)

    # &#x6570;&#x636E;&#x96C6;&#x7684;&#x8D77;&#x59CB;id&#x4E3A;0
    i = 0
    while i &lt; num_test:
        # j&#x4E3A;&#x4E0B;&#x4E00;&#x6279;&#x6B21;&#x7684;&#x622A;&#x6B62;id
        j = min(i + test_batch_size, num_test)

        # &#x83B7;&#x53D6;i&#xFF0C;j&#x4E4B;&#x95F4;&#x7684;&#x56FE;&#x50CF;
        images = data.test.images[i:j, :]

        # &#x83B7;&#x53D6;&#x76F8;&#x5E94;&#x6807;&#x7B7E;.
        labels = data.test.labels[i:j, :]

        # &#x521B;&#x5EFA;feed_dict
        feed_dict = {x: images,
                     y_true: labels}

        # &#x8BA1;&#x7B97;&#x9884;&#x6D4B;&#x7ED3;&#x679C;
        cls_pred[i:j] = session.run(y_pred_cls, feed_dict=feed_dict)

        # &#x8BBE;&#x5B9A;&#x4E3A;&#x4E0B;&#x4E00;&#x6279;&#x6B21;&#x8D77;&#x59CB;&#x503C;.
        i = j

    cls_true = data.test.cls
    # &#x6B63;&#x786E;&#x7684;&#x5206;&#x7C7B;
    correct = (cls_true == cls_pred)
    # &#x6B63;&#x786E;&#x5206;&#x7C7B;&#x7684;&#x6570;&#x91CF;
    correct_sum = correct.sum()
    # &#x5206;&#x7C7B;&#x51C6;&#x786E;&#x7387;
    acc = float(correct_sum) / num_test

    # &#x6253;&#x5370;&#x51C6;&#x786E;&#x7387;.
    msg = &quot;&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: {0:.1%} ({1} / {2})&quot;
    print(msg.format(acc, correct_sum, num_test))

    # &#x6253;&#x5370;&#x90E8;&#x5206;&#x9519;&#x8BEF;&#x6837;&#x4F8B;.
    if show_example_errors:
        print(&quot;Example errors:&quot;)
        plot_example_errors(data_test=data.test, cls_pred=cls_pred, correct=correct, img_shape=img_shape)

    # &#x6253;&#x5370;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;.
    if show_confusion_matrix:
        print(&quot;Confusion Matrix:&quot;)
        plot_confusion_matrix(cls_true=cls_true, cls_pred=cls_pred)
</code></pre>
<h3 id>&#x7ED3;&#x679C;</h3>
<p>&#x76F4;&#x63A5;&#x8FED;&#x4EE3; 10000 &#x8F6E;&#xFF1A;</p>
<pre><code class="language-python">optimize(num_iterations=10000)
print_test_accuracy(show_example_errors=True, show_confusion_matrix=True)
</code></pre>
<pre><code>&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:      1, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  15.6%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  76.6%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  87.5%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  87.5%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  90.6%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  89.1%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  90.6%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x7528;&#x65F6;: 0:13:00
&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 98.7% (9867 / 10000)
Example errors:
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-3-2.png" class="kg-image" alt="TensorFlow (3) - Layers API"></figure>
<!--kg-card-begin: markdown-->
<pre><code class="language-python">Confusion Matrix:
[[ 973    0    1    0    0    1    2    1    2    0]
 [   0 1133    1    0    0    0    0    1    0    0]
 [   2    3 1018    0    1    0    0    4    3    1]
 [   1    0    1  992    0   12    0    3    1    0]
 [   0    0    1    0  979    0    0    1    0    1]
 [   1    0    1    1    0  888    1    0    0    0]
 [   6    3    0    0    4   12  933    0    0    0]
 [   0    2    6    1    1    0    0 1017    1    0]
 [   4    0    1    2    1    4    0    2  957    3]
 [   2    4    0    0   11    6    0    8    1  977]]
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-3-3.png" class="kg-image" alt="TensorFlow (3) - Layers API"></figure>
<!--kg-card-begin: markdown-->
<h3 id>&#x6743;&#x91CD;&#x4E0E;&#x5C42;&#x7684;&#x53EF;&#x89C6;&#x5316;</h3>
<h4 id>&#x7B2C;&#x4E00;&#x5C42;&#x6743;&#x91CD;</h4>
<pre><code class="language-python">weights1 = session.run(weights_conv1)
plot_conv_weights(weights=weights1)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-3-4.png" class="kg-image" alt="TensorFlow (3) - Layers API"></figure>
<!--kg-card-begin: markdown-->
<h4 id>&#x7B2C;&#x4E00;&#x5C42;&#x8F93;&#x51FA;</h4>
<pre><code class="language-python">image1 = data.test.images[0]
layer1 = session.run(layer_conv1, feed_dict={x: [image1]})
plot_conv_layer(values=layer1)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-3-5.png" class="kg-image" alt="TensorFlow (3) - Layers API"></figure>
<!--kg-card-begin: markdown-->
<pre><code class="language-python">image2 = data.test.images[13]
layer1 = session.run(layer_conv1, feed_dict={x: [image2]})
plot_conv_layer(values=layer1)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-3-6.png" class="kg-image" alt="TensorFlow (3) - Layers API"></figure>
<!--kg-card-begin: markdown-->
<h4 id>&#x7B2C;&#x4E8C;&#x5C42;&#x6743;&#x91CD;</h4>
<pre><code class="language-python">weights2 = session.run(weights_conv2)
plot_conv_weights(weights=weights2, input_channel=0)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-3-7.png" class="kg-image" alt="TensorFlow (3) - Layers API"></figure>
<!--kg-card-begin: markdown-->
<pre><code class="language-python">plot_conv_weights(weights=weights2, input_channel=0)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-3-8.png" class="kg-image" alt="TensorFlow (3) - Layers API"></figure>
<!--kg-card-begin: markdown-->
<h4 id>&#x7B2C;&#x4E8C;&#x5C42;&#x8F93;&#x51FA;</h4>
<pre><code class="language-python">layer2 = session.run(layer_conv2, feed_dict={x: [image1]})
plot_conv_layer(values=layer2)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-3-9.png" class="kg-image" alt="TensorFlow (3) - Layers API"></figure>
<!--kg-card-begin: markdown-->
<pre><code class="language-python">layer2 = session.run(layer_conv2, feed_dict={x: [image2]})
plot_conv_layer(values=layer2)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-3-10.png" class="kg-image" alt="TensorFlow (3) - Layers API"></figure>
<!--kg-card-begin: markdown-->
<h3 id="session">&#x5173;&#x95ED;session</h3>
<pre><code class="language-python">session.close()
</code></pre>
<p>&#x5C3D;&#x7BA1; TensorFlow &#x4E3A;&#x4F7F;&#x7528;&#x8005;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E9B;&#x7B80;&#x5316;&#x4EE3;&#x7801;&#x7684;&#x4FBF;&#x5229;&#xFF0C;&#x6211;&#x4EEC;&#x4ECD;&#x7136;&#x5E94;&#x5F53;&#x5148;&#x4E86;&#x89E3;&#x5176;&#x4E2D;&#x7684;&#x539F;&#x7406;&#x518D;&#x4F7F;&#x7528;&#xFF0C;&#x4E0D;&#x8981;&#x4E00;&#x5473;&#x5730;&#x628A;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x5F53;&#x6210;&#x9ED1;&#x76D2;&#x5B50;&#x6765;&#x4F7F;&#x7528;&#x3002;</p>
<!--kg-card-end: markdown-->
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[TensorFlow (2) - 卷积神经网络]]></title><description><![CDATA[本章主要说明如何使用神经网络训练MNIST手写体字符识别，以及如何可视化权重。]]></description><link>https://gaussic.com/tensorflow-cnn/</link><guid isPermaLink="false">626173b75d2e434866501f8a</guid><category><![CDATA[TensorFlow]]></category><category><![CDATA[CNN]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Mon, 14 Aug 2017 15:20:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/seagull-4791926_1280.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/seagull-4791926_1280.jpg" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"><p>&#x8FD9;&#x662F;&#x51E0;&#x7BC7;&#x4E0E;&#x539F;&#x4F5C;&#x4E0D;&#x5B8C;&#x5168;&#x76F8;&#x540C;&#x7684;&#x6559;&#x7A0B;&#x3002;</p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x8BF4;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/tensorflow-cnn/">TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</a></p>
<p>&#x539F;&#x4F5C;&#x8005;&#xFF1A;<a href="http://www.hvass-labs.org/">Magnus Erik Hvass Pedersen</a> / <a href="https://github.com/Hvass-Labs/TensorFlow-Tutorials">GitHub</a> / <a href="https://www.youtube.com/playlist?list=PL9Hr9sNUjfsmEu1ZniY0XpHSzl5uihcXZ">Videos on YouTube</a></p>
<p>&#x5728;<a href="https://gaussic.com/tensorflow-linear-model/">&#x4E0A;&#x4E00;&#x7AE0;&#x8282;</a> &#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5728; MNIST &#x6570;&#x636E;&#x96C6;&#x4E0A;&#x5F97;&#x5230;&#x4E86; 91% &#x7684;&#x6D4B;&#x8BD5;&#x51C6;&#x786E;&#x7387;&#x3002;&#x8FD9;&#x4E2A;&#x7ED3;&#x679C;&#x5176;&#x5B9E;&#x5E76;&#x4E0D;&#x592A;&#x7406;&#x60F3;&#x3002;</p>
<p>&#x5728;&#x672C;&#x7AE0;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x4F7F;&#x7528;&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x6765;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x51C6;&#x786E;&#x7387;&#x66F4;&#x9AD8;&#x7684;&#x6A21;&#x578B;&#xFF0C;&#x63A5;&#x8FD1; 99%&#x3002;&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x4F7F;&#x7528;&#x5171;&#x4EAB;&#x7684;&#x5377;&#x79EF;&#x6838;&#x5BF9;&#x56FE;&#x50CF;&#x8FDB;&#x884C;&#x5377;&#x79EF;&#x64CD;&#x4F5C;&#xFF0C;&#x4EE5;&#x63D0;&#x53D6;&#x56FE;&#x50CF;&#x6DF1;&#x5C42;&#x7279;&#x5F81;&#x3002;&#x8FD9;&#x4E9B;&#x6DF1;&#x5C42;&#x7279;&#x5F81;&#x7136;&#x540E;&#x7EC4;&#x5408;&#x6210;&#x7279;&#x5F81;&#x5411;&#x91CF;&#x8F93;&#x5165;&#x5168;&#x8FDE;&#x63A5;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x4E2D;&#xFF0C;&#x518D;&#x4F7F;&#x7528;&#x7C7B;&#x4F3C;&#x4E0A;&#x4E00;&#x7AE0;&#x7684;&#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x5206;&#x7C7B;&#x3002;</p>
<h3 id>&#x7F51;&#x7EDC;&#x7ED3;&#x6784;&#x56FE;</h3>
<p>&#x5728;&#x672C;&#x7AE0;&#x4E2D;&#x9700;&#x8981;&#x5B9E;&#x73B0;&#x7684;&#x6574;&#x4E2A;&#x7F51;&#x7EDC;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-1.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x8F93;&#x5165;&#x4E3A;&#x539F;&#x59CB;&#x7684; 28x28 &#x7684;&#x56FE;&#x50CF;&#xFF0C;&#x5B83;&#x9996;&#x5148;&#x8FDB;&#x5165;&#x7B2C;&#x4E00;&#x4E2A;&#x62E5;&#x6709; 16 &#x4E2A; 5x5 &#x5377;&#x79EF;&#x6838;&#x7684;&#x5377;&#x79EF;&#x5C42;&#xFF0C;&#x5F97;&#x5230; 16 &#x5F20; 28x28 &#x7684;&#x5377;&#x79EF;&#x540E;&#x7684;&#x56FE;&#x50CF;&#xFF0C;&#x518D;&#x8FDB;&#x5165;&#x964D;&#x91C7;&#x6837;&#x5C42;&#xFF08;&#x56FE;&#x4E2D;&#x672A;&#x4F53;&#x73B0;&#xFF09;&#x6700;&#x7EC8;&#x5F97;&#x5230; 16 &#x5F20; 14x14 &#x7684;&#x56FE;&#x50CF;&#xFF08;&#x53EF;&#x79F0;&#x4E3A; 16 &#x4E2A;&#x901A;&#x9053;&#xFF09;&#x3002;&#x4E3A;&#x4E86;&#x4FDD;&#x8BC1;&#x5377;&#x79EF;&#x524D;&#x540E;&#x56FE;&#x50CF;&#x7684;&#x50CF;&#x7D20;&#x4E0D;&#x53D8;&#xFF0C;&#x5728;&#x5377;&#x79EF;&#x8FC7;&#x540E;&#xFF0C;&#x5BF9;&#x56FE;&#x50CF;&#x8FB9;&#x6846;&#x91C7;&#x53D6;&#x8865;&#x96F6;&#x7684;&#x64CD;&#x4F5C;&#xFF08;&#x5728; TensorFlow &#x4E2D;&#x7684; conv2d &#x7684; padding &#x53C2;&#x6570;&#x4E3A; &apos;SAME&apos;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x91C7;&#x53D6;&#x8865;&#x96F6;&#x800C;&#x662F;&#x7F29;&#x5C0F;&#x50CF;&#x7D20;&#x503C;&#xFF0C; padding &#x53C2;&#x6570;&#x503C;&#x8BBE;&#x7F6E;&#x4E3A; &apos;VALID&apos;&#xFF09;&#x3002;&#x964D;&#x91C7;&#x6837;&#x5C42;&#x4F7F;&#x7528; max pooling &#x64CD;&#x4F5C;&#xFF0C;&#x5C06; 2x2 &#x7684;&#x50CF;&#x7D20;&#x5757;&#x53D6;&#x6700;&#x5927;&#x503C;&#x5408;&#x5E76;&#x4E3A;&#x4E00;&#x4E2A;&#x50CF;&#x7D20;&#x70B9;&#xFF0C;&#x8FD9;&#x4E2A;&#x64CD;&#x4F5C;&#x4F1A;&#x5C06;&#x56FE;&#x50CF;&#x7F29;&#x5C0F; 1 &#x500D;&#x3002;</p>
<p>&#x5BF9;&#x4E8E;&#x5F97;&#x5230;&#x7684; 16 &#x901A;&#x9053;&#x7684; 14x14 &#x56FE;&#x50CF;&#xFF0C;&#x8FDB;&#x5165;&#x7B2C;&#x4E8C;&#x4E2A;&#x62E5;&#x6709; 36 &#x4E2A;&#x5377;&#x79EF;&#x6838;&#x7684;&#x5377;&#x79EF;&#x5C42;&#xFF0C;&#x5F97;&#x5230; 36 &#x5F20; 14x14 &#x7684;&#x5377;&#x79EF;&#x540E;&#x56FE;&#x50CF;&#xFF0C;&#x518D;&#x8FDB;&#x5165;&#x964D;&#x91C7;&#x6837;&#x5C42;&#x5F97;&#x5230; 36 &#x5F20; 7x7 &#x7684;&#x56FE;&#x50CF;&#x3002;&#x5728;&#x8FD9;&#x91CC;&#x5305;&#x62EC;&#x4E86;&#x4E00;&#x4E9B;&#x9690;&#x542B;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x5BF9;&#x4E8E; 16 &#x5F20;&#x539F;&#x59CB;&#x56FE;&#x50CF;&#xFF0C;&#x6BCF;&#x4E00;&#x5F20;&#x56FE;&#x50CF;&#x4F7F;&#x7528; 36 &#x4E2A;&#x5377;&#x79EF;&#x6838;&#x5377;&#x79EF;&#xFF0C;&#x5E94;&#x8BE5;&#x5F97;&#x5230; 16x36 &#x5F20;&#x65B0;&#x7684;&#x56FE;&#x50CF;&#xFF0C;&#x4F46;&#x662F;&#x4E3A;&#x4E86;&#x51CF;&#x5C11;&#x6A21;&#x578B;&#x7684;&#x53C2;&#x6570;&#x91CF;&#xFF0C;&#x964D;&#x4F4E;&#x590D;&#x6742;&#x5EA6;&#xFF0C;&#x5377;&#x79EF;&#x5C42;&#x5BF9;&#x6BCF;&#x4E2A;&#x5377;&#x79EF;&#x6838;&#x5F97;&#x5230;&#x7684; 16 &#x5F20;&#x56FE;&#x50CF;&#x76F8;&#x52A0;&#xFF0C;&#x6700;&#x540E;&#x5F97;&#x5230; 36 &#x5F20;&#x5377;&#x79EF;&#x540E;&#x56FE;&#x50CF;&#x3002;</p>
<p>&#x7ECF;&#x8FC7;&#x4E24;&#x5C42;&#x5377;&#x79EF;&#x540E;&#xFF0C;&#x5C06; 36 &#x5F20; 7x7 &#x7684;&#x56FE;&#x50CF;&#x5C55;&#x5E73;&#xFF0C;&#x5F97;&#x5230;&#x4E00;&#x4E2A; 7x7x3 6&#x7684;&#x5411;&#x91CF;&#xFF0C;&#x8F93;&#x5165;&#x5230;&#x4E00;&#x4E2A; 128 &#x7EF4;&#x7684;&#x5168;&#x8FDE;&#x63A5;&#x5C42;&#xFF0C;&#x518D;&#x8F93;&#x5165;&#x5230; 10 &#x7EF4;&#x7684; softmx &#x5C42;&#x8FDB;&#x884C;&#x5206;&#x7C7B;&#xFF0C;&#x8FD9;&#x4E00;&#x5757;&#x4E0E;&#x4E0A;&#x4E00;&#x7AE0;&#x7C7B;&#x4F3C;&#x3002;</p>
<h4 id>&#x5377;&#x79EF;&#x5C42;</h4>
<p>&#x5377;&#x79EF;&#x5C42;&#x4F7F;&#x7528;&#x591A;&#x4E2A;&#x5377;&#x79EF;&#x6838;&#x4F5C;&#x7528;&#x4E8E;&#x540C;&#x4E00;&#x5E45;&#x56FE;&#x50CF;&#xFF0C;&#x4EE5;&#x5F97;&#x5230;&#x591A;&#x4E2A;&#x5377;&#x79EF;&#x540E;&#x7684;&#x56FE;&#x50CF;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-2.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x5BF9;&#x4E8E;&#x539F;&#x59CB;&#x7684;&#x56FE;&#x50CF; 7&#xFF0C;&#x4F7F;&#x7528;&#x4E00;&#x4E2A; 5x5 &#x7684;&#x5377;&#x79EF;&#x6838;&#xFF0C;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#x6ED1;&#x52A8;&#x3002;&#x6ED1;&#x52A8;&#x7684;&#x8FC7;&#x7A0B;&#x79F0;&#x4E3A; stride&#xFF0C;&#x4E00;&#x4E2A;&#x5377;&#x79EF;&#x5C42;&#x6709;&#x4E24;&#x4E2A; stride&#xFF0C;&#x5206;&#x522B;&#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#xFF0C;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#xFF0C;&#x6B65;&#x957F;&#x4E00;&#x822C;&#x8BBE;&#x5B9A;&#x4E3A; 1 &#x6216; 2&#x3002;&#x5BF9;&#x5377;&#x79EF;&#x6838;&#x8986;&#x76D6;&#x7684;&#x533A;&#x57DF;&#x4E8E;&#x5377;&#x79EF;&#x6838;&#x8FDB;&#x884C;&#x70B9;&#x4E58;&#x64CD;&#x4F5C;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x503C;&#x4F5C;&#x4E3A;&#x8BE5;&#x533A;&#x57DF;&#x7684;&#x4E2D;&#x5FC3;&#x70B9;&#x7684;&#x50CF;&#x7D20;&#x3002;&#x5728;&#x4E0A;&#x56FE;&#x4E2D;&#xFF0C;&#x7EA2;&#x8272;&#x4EE3;&#x8868;&#x8FD9;&#x90E8;&#x5206;&#x7684;&#x50CF;&#x7D20;&#x5BF9;&#x539F;&#x59CB;&#x56FE;&#x50CF;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x6B63;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x800C;&#x84DD;&#x8272;&#x8868;&#x793A;&#x8D1F;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x5728;&#x8FD9;&#x4E2A;&#x6837;&#x4F8B;&#x4E2D;&#x5377;&#x79EF;&#x6838;&#x4F3C;&#x4E4E;&#x5728;&#x8BC6;&#x522B;&#x56FE;&#x50CF;&#x4E2D;&#x7684;&#x6A2A;&#x7EBF;&#x90E8;&#x5206;&#xFF0C;&#x56E0;&#x4E3A;&#x4ECE;&#x7ED3;&#x679C;&#x770B;&#x6765; 7 &#x7684;&#x90A3;&#x4E00;&#x6A2A;&#x5177;&#x6709;&#x66F4;&#x5F3A;&#x70C8;&#x7684;&#x53CD;&#x5E94;&#x3002;</p>
<p>&#x6B64;&#x5916;&#xFF0C;&#x5BF9;&#x4E8E;&#x6BCF;&#x4E00;&#x4E2A;&#x5377;&#x79EF;&#x5C42;&#x7684;&#x8F93;&#x51FA;&#xFF0C;&#x4E00;&#x822C;&#x4F1A;&#x7ECF;&#x8FC7;&#x4E00;&#x4E2A; relu &#x5C42;&#xFF0C;&#x4EE5;&#x4FDD;&#x8BC1;&#x5168;&#x90E8;&#x7684;&#x50CF;&#x7D20;&#x503C;&#x90FD;&#x4E3A;&#x6B63;&#xFF08;&#x56E0;&#x4E3A;&#x6240;&#x6709;&#x4E3A;&#x8D1F;&#x7684;&#x50CF;&#x7D20;&#x503C;&#x90FD;&#x88AB;&#x8BBE;&#x5B9A;&#x4E3A; 0&#xFF09;&#x3002;</p>
<h3 id>&#x9700;&#x8981;&#x5BFC;&#x5165;&#x7684;&#x5305;</h3>
<pre><code class="language-python">import tensorflow as tf          # TensorFlow
import matplotlib.pyplot as plt  # matplotlib&#x7ED8;&#x56FE;
import numpy as np              # Numpy
from sklearn.metrics import confusion_matrix    # &#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#xFF0C;&#x5206;&#x6790;&#x6A21;&#x578B;&#x8BEF;&#x5DEE;

import time      # &#x8BA1;&#x65F6;
from datetime import timedelta
import math

# notebook&#x4F7F;&#x7528;
%matplotlib inline
</code></pre>
<h3 id>&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x914D;&#x7F6E;</h3>
<pre><code class="language-python"># &#x5377;&#x79EF;&#x5C42; 1
filter_size1 = 5          # 5 x 5 &#x5377;&#x79EF;&#x6838;
num_filters1 = 16        # &#x5171; 16 &#x4E2A;&#x5377;&#x79EF;&#x6838;

# &#x5377;&#x79EF;&#x5C42; 2
filter_size2 = 5          # 5 x 5 &#x5377;&#x79EF;&#x6838;
num_filters2 = 36        # &#x5171; 36 &#x4E2A;&#x5377;&#x79EF;&#x6838;

# Fully-connected layer.
fc_size = 128            # Number of neurons in fully-connected layer.
</code></pre>
<h3 id>&#x8F7D;&#x5165;&#x6570;&#x636E;</h3>
<p>TensorFlow &#x5728;&#x6837;&#x4F8B;&#x6559;&#x7A0B;&#x4E2D;&#x5DF2;&#x7ECF;&#x505A;&#x4E86;&#x4E0B;&#x8F7D;&#x5E76;&#x5BFC;&#x5165; MNIST &#x6570;&#x5B57;&#x624B;&#x5199;&#x4F53;&#x8BC6;&#x522B;&#x6570;&#x636E;&#x96C6;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x3002;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x4F1A;&#x5C06; MNIST &#x6570;&#x636E;&#x96C6;&#x4E0B;&#x8F7D;&#x5230; <code>data/MNIST</code> &#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x5C06;&#x6807;&#x7B7E;&#x4FDD;&#x5B58;&#x4E3A; <code>one-hot</code> &#x7F16;&#x7801;&#x3002;</p>
<pre><code class="language-python">from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(&apos;data/MNIST&apos;, one_hot=True)
</code></pre>
<p>MNIST &#x6570;&#x636E;&#x96C6;&#x603B;&#x5171;&#x6709; 70000 &#x5F20;&#x624B;&#x5199;&#x6570;&#x5B57;&#x56FE;&#x7247;&#xFF0C;&#x6570;&#x636E;&#x96C6;&#x88AB;&#x5206;&#x4E3A;&#x8BAD;&#x7EC3;&#x96C6;&#x3001;&#x6D4B;&#x8BD5;&#x96C6;&#x548C;&#x9A8C;&#x8BC1;&#x96C6;&#x4E09;&#x90E8;&#x5206;&#x3002;</p>
<pre><code class="language-python">print(&quot;&#x6570;&#x636E;&#x96C6;&#x5927;&#x5C0F;&#xFF1A;&quot;)
print(&apos;- &#x8BAD;&#x7EC3;&#x96C6;&#xFF1A;{}&apos;.format(len(data.train.labels)))
print(&apos;- &#x6D4B;&#x8BD5;&#x96C6;&#xFF1A;{}&apos;.format(len(data.test.labels)))
print(&apos;- &#x9A8C;&#x8BC1;&#x96C6;&#xFF1A;{}&apos;.format(len(data.validation.labels)))
</code></pre>
<pre><code class="language-python">&#x6570;&#x636E;&#x96C6;&#x5927;&#x5C0F;&#xFF1A;
- &#x8BAD;&#x7EC3;&#x96C6;&#xFF1A;55000
- &#x6D4B;&#x8BD5;&#x96C6;&#xFF1A;10000
- &#x9A8C;&#x8BC1;&#x96C6;&#xFF1A;5000
</code></pre>
<h4 id="onehot">One-hot &#x7F16;&#x7801;</h4>
<p>&#x6BCF;&#x4E00;&#x5F20;&#x56FE;&#x7684;&#x6807;&#x7B7E;&#x4F7F;&#x7528;&#x4E86; <code>one-hot</code> &#x7F16;&#x7801;&#x4FDD;&#x5B58;&#x5728; numpy &#x77E9;&#x9635;&#x4E2D;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x539F;&#x672C;&#x7684;&#x7C7B;&#x522B;&#xFF0C;&#x8FD9;&#x662F;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x5904;&#x7406;&#x3002;</p>
<pre><code class="language-python">print(data.test.labels[:5])
</code></pre>
<pre><code class="language-python">[[ 0.  0.  0.  0.  0.  0.  0.  1.  0.  0.]
 [ 0.  0.  1.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  1.  0.  0.  0.  0.  0.]]
</code></pre>
<p>&#x5728; <code>one-hot</code> &#x7F16;&#x7801;&#x4E2D;&#xFF0C;&#x53EA;&#x6709;&#x5BF9;&#x5E94;&#x7C7B;&#x522B;&#x7684;&#x90A3;&#x4E2A;&#x4F4D;&#x7F6E;&#x4E3A; 1&#xFF0C;&#x5176;&#x4F59;&#x90FD;&#x4E3A; 0&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x5C06;&#x5176;&#x8F6C;&#x6362;&#x4E3A;&#x771F;&#x5B9E;&#x7C7B;&#x522B;&#xFF1A;</p>
<pre><code class="language-python">data.test.cls = np.argmax(data.test.labels, axis=1)
print(data.test.cls[:5])
</code></pre>
<pre><code class="language-python">[7 2 1 0 4]
</code></pre>
<h4 id>&#x6570;&#x636E;&#x7EF4;&#x5EA6;</h4>
<p>&#x5728; MNIST &#x6570;&#x636E;&#x96C6;&#x4E2D;&#xFF0C;&#x539F;&#x59CB;&#x7684; 28*28 &#x50CF;&#x7D20;&#x7684;&#x9ED1;&#x767D;&#x56FE;&#x7247;&#x88AB;&#x5C55;&#x5E73;&#x4E3A; 784 &#x7EF4;&#x7684;&#x5411;&#x91CF;&#x3002;</p>
<pre><code class="language-python">print(&quot;&#x6837;&#x672C;&#x7EF4;&#x5EA6;&#xFF1A;&quot;, data.train.images.shape)
print(&quot;&#x6807;&#x7B7E;&#x7EF4;&#x5EA6;&#xFF1A;&quot;, data.train.labels.shape)
</code></pre>
<pre><code class="language-python">&#x6837;&#x672C;&#x7EF4;&#x5EA6;&#xFF1A; (55000, 784)
&#x6807;&#x7B7E;&#x7EF4;&#x5EA6;&#xFF1A; (55000, 10)
</code></pre>
<p>&#x4E3A;&#x4F7F;&#x5F97;&#x7F51;&#x7EDC;&#x7ED3;&#x6784;&#x66F4;&#x52A0;&#x6E05;&#x6670;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x5BF9;&#x8FD9;&#x4E9B;&#x56FA;&#x5B9A;&#x7EF4;&#x5EA6;&#x505A;&#x5982;&#x4E0B;&#x5B9A;&#x4E49;&#xFF1A;</p>
<pre><code class="language-python">img_size = 28                        # &#x56FE;&#x7247;&#x7684;&#x9AD8;&#x5EA6;&#x548C;&#x5BBD;&#x5EA6;
img_size_flat = img_size * img_size  # &#x5C55;&#x5E73;&#x4E3A;&#x5411;&#x91CF;&#x7684;&#x5C3A;&#x5BF8;
img_shape = (img_size, img_size)    # &#x56FE;&#x7247;&#x7684;&#x4E8C;&#x7EF4;&#x5C3A;&#x5BF8;

num_channels = 1                    # &#x8F93;&#x5165;&#x4E3A;&#x5355;&#x901A;&#x9053;&#x7070;&#x5EA6;&#x56FE;&#x50CF;
num_classes = 10                    # &#x7C7B;&#x522B;&#x6570;&#x76EE;
</code></pre>
<h4 id>&#x6253;&#x5370;&#x90E8;&#x5206;&#x6837;&#x4F8B;&#x56FE;&#x7247;</h4>
<pre><code class="language-python">def plot_images(images, cls_true, cls_pred=None):
    &quot;&quot;&quot;
    &#x7ED8;&#x5236;&#x56FE;&#x50CF;&#xFF0C;&#x8F93;&#x51FA;&#x771F;&#x5B9E;&#x6807;&#x7B7E;&#x4E0E;&#x9884;&#x6D4B;&#x6807;&#x7B7E;
    images:  &#x56FE;&#x50CF;&#xFF08;9&#x5F20;&#xFF09;
    cls_true: &#x771F;&#x5B9E;&#x7C7B;&#x522B;
    cls_pred: &#x9884;&#x6D4B;&#x7C7B;&#x522B;
    &quot;&quot;&quot;
    assert len(images) == len(cls_true) == 9  # &#x4FDD;&#x8BC1;&#x5B58;&#x5728;9&#x5F20;&#x56FE;&#x7247;

    fig, axes = plt.subplots(3, 3)  # &#x521B;&#x5EFA;3x3&#x4E2A;&#x5B50;&#x56FE;&#x7684;&#x753B;&#x5E03;
    fig.subplots_adjust(hspace=0.3, wspace=0.3)  # &#x8C03;&#x6574;&#x6BCF;&#x5F20;&#x56FE;&#x4E4B;&#x95F4;&#x7684;&#x95F4;&#x9694;

    for i, ax in enumerate(axes.flat):
        # &#x7ED8;&#x56FE;&#xFF0C;&#x5C06;&#x4E00;&#x7EF4;&#x5411;&#x91CF;&#x53D8;&#x4E3A;&#x4E8C;&#x7EF4;&#x77E9;&#x9635;&#xFF0C;&#x9ED1;&#x767D;&#x4E8C;&#x503C;&#x56FE;&#x50CF;&#x4F7F;&#x7528; binary
        ax.imshow(images[i].reshape(img_shape), cmap=&apos;binary&apos;)

        if cls_pred is None:  # &#x5982;&#x679C;&#x672A;&#x4F20;&#x5165;&#x9884;&#x6D4B;&#x7C7B;&#x522B;
            xlabel = &quot;True: {0}&quot;.format(cls_true[i])
        else:
            xlabel = &quot;True: {0}, Pred: {1}&quot;.format(cls_true[i], cls_pred[i])
        ax.set_xlabel(xlabel)

        # &#x5220;&#x9664;&#x5750;&#x6807;&#x4FE1;&#x606F;
        ax.set_xticks([])
        ax.set_yticks([])    
    plt.show()
</code></pre>
<pre><code class="language-python"># &#x968F;&#x673A;&#x53D6;9&#x5F20;&#x56FE;&#x7247;
indices = np.arange(len(data.test.cls))
np.random.shuffle(indices)
indices = indices[:9]    

images = data.test.images[indices]
cls_true = data.test.cls[indices]

plot_images(images, cls_true)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-3.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<h3 id="tensorflow">TensorFlow &#x8BA1;&#x7B97;&#x56FE;</h3>
<p>TensorFlow &#x4F7F;&#x7528;&#x8BA1;&#x7B97;&#x56FE;&#x6A21;&#x578B;&#x6765;&#x6784;&#x5EFA;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x3002;&#x5176;&#x4E3B;&#x8981;&#x6D41;&#x7A0B;&#x662F;&#x5148;&#x5EFA;&#x7ACB;&#x597D;&#x6574;&#x4E2A;&#x7F51;&#x7EDC;&#x7684;&#x8BA1;&#x7B97;&#x56FE;&#x6A21;&#x578B;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x5BFC;&#x5165;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x8BA1;&#x7B97;&#x3002;</p>
<p>&#x4E00;&#x4E2A; TensorFlow &#x8BA1;&#x7B97;&#x56FE;&#x5305;&#x542B;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x90E8;&#x5206;&#xFF1A;</p>
<ul>
<li>Placeholder: &#x5360;&#x4F4D;&#x7B26;&#xFF0C;&#x7528;&#x6765;&#x8BFB;&#x53D6;&#x7528;&#x6237;&#x8F93;&#x5165;&#x4E0E;&#x8F93;&#x51FA;&#xFF1B;</li>
<li>Variable: &#x6A21;&#x578B;&#x7684;&#x53D8;&#x91CF;&#xFF0C;&#x4E5F;&#x79F0;&#x4E3A;&#x53C2;&#x6570;&#xFF0C;&#x5728;&#x8BA1;&#x7B97;&#x8FC7;&#x7A0B;&#x4E2D;&#x9010;&#x6B65;&#x4F18;&#x5316;&#xFF1B;</li>
<li>Model: &#x4F7F;&#x7528;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x6A21;&#x578B;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4E00;&#x4E9B;&#x7B80;&#x5355;&#x7684;&#x8BA1;&#x7B97;&#xFF1B;</li>
<li>Cost Function&#xFF1A; &#x4EE3;&#x4EF7;&#x51FD;&#x6570;&#xFF0C;&#x4E5F;&#x79F0;&#x635F;&#x5931;&#x51FD;&#x6570;&#xFF0C;&#x5982;&#x4F55;&#x8BA1;&#x7B97;&#x6A21;&#x578B;&#x7684;&#x8BEF;&#x5DEE;&#xFF1B;</li>
<li>Optimizer&#xFF1A; &#x4F18;&#x5316;&#x5668;&#xFF0C;&#x4F7F;&#x7528;&#x54EA;&#x79CD;&#x4F18;&#x5316;&#x7B56;&#x7565;&#x6765;&#x964D;&#x4F4E;&#x635F;&#x5931;&#x3002;</li>
</ul>
<!-- -->
<h4 id>&#x521B;&#x5EFA;&#x53D8;&#x91CF;</h4>
<pre><code class="language-python">def new_weights(shape):  
    return tf.Variable(tf.truncated_normal(shape, stddev=0.05))    # &#x521D;&#x59CB;&#x5316;&#x4E3A;&#x968F;&#x673A;&#x503C;

def new_biases(length):
    return tf.Variable(tf.constant(0.05, shape=[length]))          # &#x521D;&#x59CB;&#x5316;&#x4E3A;&#x5E38;&#x6570;
</code></pre>
<p>&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x4E2D;&#x540C;&#x6837;&#x6709;&#x4E24;&#x7C7B;&#x53D8;&#x91CF;&#xFF0C;&#x6743;&#x91CD;&#x548C;&#x504F;&#x7F6E;&#x9879;&#x3002;&#x6CE8;&#x610F;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x521D;&#x59CB;&#x5316;&#x53EA;&#x6709;&#x5728;&#x8FD0;&#x884C;&#x8BA1;&#x7B97;&#x56FE;&#x65F6;&#x624D;&#x4F1A;&#x6267;&#x884C;&#x3002;</p>
<h4 id>&#x521B;&#x5EFA;&#x5377;&#x79EF;&#x5C42;</h4>
<p>&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x5377;&#x79EF;&#x5C42;&#x3002;&#x8F93;&#x5165;&#x4E3A; 4 &#x7EF4;&#x7684; tensor&#xFF0C;&#x7EF4;&#x5EA6;&#x5982;&#x4E0B;&#xFF1A;</p>
<ol>
<li>&#x56FE;&#x50CF;&#x6570;&#x91CF;</li>
<li>&#x56FE;&#x50CF;&#x9AD8;&#x5EA6;</li>
<li>&#x56FE;&#x50CF;&#x5BBD;&#x5EA6;</li>
<li>&#x901A;&#x9053;&#x6570;</li>
</ol>
<!-- -->
<p>&#x8F93;&#x51FA;&#x540C;&#x6837;&#x662F;&#x4E00;&#x4E2A; 4 &#x7EF4;&#x7684; tensor&#xFF0C;&#x7EF4;&#x5EA6;&#x5982;&#x4E0B;&#xFF1A;</p>
<ol>
<li>&#x56FE;&#x50CF;&#x6570;&#x91CF;&#xFF0C;&#x4E0E;&#x8F93;&#x5165;&#x76F8;&#x540C;</li>
<li>&#x56FE;&#x50CF;&#x9AD8;&#x5EA6;&#xFF0C;&#x5982;&#x679C;&#x4F7F;&#x7528; 2x2 pooling&#xFF0C;&#x9AD8;&#x5BBD;&#x90FD;&#x9664;&#x4EE5; 2</li>
<li>&#x56FE;&#x50CF;&#x5BBD;&#x5EA6;&#xFF0C;&#x540C;&#x4E0A;</li>
<li>&#x7531;&#x5377;&#x79EF;&#x5C42;&#x751F;&#x6210;&#x7684;&#x901A;&#x9053;&#x6570;</li>
</ol>
<!-- -->
<pre><code class="language-python">def new_conv_layer(input,              # &#x524D;&#x4E00;&#x5C42;.
                  num_input_channels, # &#x524D;&#x4E00;&#x5C42;&#x901A;&#x9053;&#x6570;
                  filter_size,        # &#x5377;&#x79EF;&#x6838;&#x5C3A;&#x5BF8;
                  num_filters,        # &#x5377;&#x79EF;&#x6838;&#x6570;&#x76EE;
                  use_pooling=True):  # &#x4F7F;&#x7528; 2x2 max-pooling.

    # &#x5377;&#x79EF;&#x6838;&#x6743;&#x91CD;&#x7684;&#x5F62;&#x72B6;&#xFF0C;&#x7531;TensorFlow API&#x51B3;&#x5B9A;
    shape = [filter_size, filter_size, num_input_channels, num_filters]

    # &#x6839;&#x636E;&#x8DDF;&#x5B9A;&#x5F62;&#x72B6;&#x521B;&#x5EFA;&#x6743;&#x91CD;
    weights = new_weights(shape=shape)

    # &#x521B;&#x5EFA;&#x65B0;&#x7684;&#x504F;&#x7F6E;&#xFF0C;&#x6BCF;&#x4E2A;&#x5377;&#x79EF;&#x6838;&#x4E00;&#x4E2A;&#x504F;&#x7F6E;
    biases = new_biases(length=num_filters)

    # &#x521B;&#x5EFA;&#x5377;&#x79EF;&#x5C42;&#x3002;&#x6CE8;&#x610F;stride&#x5168;&#x8BBE;&#x7F6E;&#x4E3A;1&#x3002;
    # &#x7B2C;1&#x4E2A;&#x548C;&#x7B2C;4&#x4E2A;&#x5FC5;&#x987B;&#x662F;1&#xFF0C;&#x56E0;&#x4E3A;&#x7B2C;1&#x4E2A;&#x662F;&#x56FE;&#x50CF;&#x7684;&#x6570;&#x76EE;&#xFF0C;&#x7B2C;4&#x4E2A;&#x662F;&#x56FE;&#x50CF;&#x7684;&#x901A;&#x9053;&#x3002;
    # &#x7B2C;2&#x548C;&#x7B2C;3&#x6307;&#x5B9A;&#x548C;&#x5DE6;&#x53F3;&#x3001;&#x4E0A;&#x4E0B;&#x7684;&#x6B65;&#x957F;&#x3002;
    # padding&#x8BBE;&#x7F6E;&#x4E3A;&apos;SAME&apos; &#x610F;&#x5473;&#x7740;&#x7ED9;&#x56FE;&#x50CF;&#x8865;&#x96F6;&#xFF0C;&#x4EE5;&#x4FDD;&#x8BC1;&#x524D;&#x540E;&#x50CF;&#x7D20;&#x76F8;&#x540C;&#x3002;
    layer = tf.nn.conv2d(input=input,
                        filter=weights,
                        strides=[1, 1, 1, 1],
                        padding=&apos;SAME&apos;)

    # &#x7ED9;&#x5377;&#x79EF;&#x5C42;&#x7684;&#x8F93;&#x51FA;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x504F;&#x7F6E;&#xFF0C;&#x6BCF;&#x4E2A;&#x5377;&#x79EF;&#x901A;&#x9053;&#x4E00;&#x4E2A;&#x504F;&#x7F6E;&#x503C;
    layer += biases

    # &#x662F;&#x5426;&#x4F7F;&#x7528;pooling
    if use_pooling:
        # &#x8FD9;&#x662F; 2x2 max-pooling, &#x8868;&#x660E;&#x4F7F;&#x7528; 2x2 &#x7684;&#x7A97;&#x53E3;&#xFF0C;&#x9009;&#x62E9;&#x6BCF;&#x4E00;&#x7A97;&#x53E3;&#x7684;&#x6700;&#x5927;&#x503C;&#x4F5C;&#x4E3A;&#x8BE5;&#x7A97;&#x53E3;&#x7684;&#x50CF;&#x7D20;&#xFF0C;
        # &#x7136;&#x540E;&#x79FB;&#x52A8;2&#x683C;&#x5230;&#x4E0B;&#x4E00;&#x7A97;&#x53E3;&#x3002;
        layer = tf.nn.max_pool(value=layer,
                              ksize=[1, 2, 2, 1],
                              strides=[1, 2, 2, 1],
                              padding=&apos;SAME&apos;)

    # Rectified Linear Unit (ReLU).
    # &#x5BF9;&#x6BCF;&#x4E2A;&#x8F93;&#x5165;&#x50CF;&#x7D20;x&#xFF0C;&#x8BA1;&#x7B97; max(x, 0)&#xFF0C;&#x628A;&#x8D1F;&#x6570;&#x7684;&#x50CF;&#x7D20;&#x503C;&#x53D8;&#x4E3A;0.
    # &#x8FD9;&#x4E00;&#x6B65;&#x4E3A;&#x539F;&#x8F93;&#x51FA;&#x6DFB;&#x52A0;&#x4E86;&#x4E00;&#x5B9A;&#x7684;&#x975E;&#x7EBF;&#x6027;&#x7279;&#x6027;&#xFF0C;&#x5141;&#x8BB8;&#x6211;&#x4EEC;&#x5B66;&#x4E60;&#x66F4;&#x52A0;&#x590D;&#x6742;&#x7684;&#x51FD;&#x6570;&#x3002;
    layer = tf.nn.relu(layer)

    # &#x6CE8;&#x610F; relu &#x901A;&#x5E38;&#x5728;pooling&#x524D;&#x6267;&#x884C;&#xFF0C;&#x4F46;&#x662F;&#x7531;&#x4E8E; relu(max_pool(x)) == max_pool(relu(x))&#xFF0C;
    # &#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5148;max_pooling&#x518D;relu&#x7701;&#x53BB;75%&#x7684;&#x8BA1;&#x7B97;&#x3002;

    # &#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x5C42;&#x548C;&#x6743;&#x91CD;&#xFF0C;&#x7ED3;&#x679C;&#x5C42;&#x7528;&#x4E8E;&#x4E0B;&#x4E00;&#x5C42;&#x8F93;&#x5165;&#xFF0C;&#x6743;&#x91CD;&#x7528;&#x4E8E;&#x663E;&#x5F0F;&#x8F93;&#x51FA;
    return layer, weights
</code></pre>
<h4 id>&#x5C55;&#x5E73;&#x64CD;&#x4F5C;</h4>
<p>&#x4E00;&#x4E2A;&#x5377;&#x79EF;&#x5C42;&#x7684;&#x8F93;&#x51FA;&#x4E3A; 4 &#x7EF4;&#x5EA6;&#x7684; tensor&#x3002;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5728;&#x5377;&#x79EF;&#x5C42;&#x540E;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x5168;&#x8FDE;&#x63A5;&#x5C42;&#xFF0C;&#x9996;&#x5148;&#x5F97;&#x5C06; 4 &#x4E3A;&#x7684; tensor &#x5C55;&#x5E73;&#x4E3A; 2 &#x7EF4;&#x7684; tensor&#xFF0C;&#x8FD9;&#x6837;&#x624D;&#x80FD;&#x76F4;&#x63A5;&#x8F93;&#x5165;&#x5230;&#x5168;&#x8FDE;&#x63A5;&#x5C42;&#x3002;</p>
<pre><code class="language-python">def flatten_layer(layer):
    # &#x83B7;&#x53D6;&#x8F93;&#x5165;&#x5C42;&#x7684;&#x5F62;&#x72B6;&#xFF0C;
    # layer_shape == [num_images, img_height, img_width, num_channels]
    layer_shape = layer.get_shape()

    # &#x7279;&#x5F81;&#x6570;&#x91CF;: img_height * img_width * num_channels
    # &#x53EF;&#x4EE5;&#x4F7F;&#x7528;TensorFlow&#x5185;&#x5EFA;&#x64CD;&#x4F5C;&#x8BA1;&#x7B97;.
    num_features = layer_shape[1:4].num_elements()

    # &#x5C06;&#x5F62;&#x72B6;&#x91CD;&#x5851;&#x4E3A; [num_images, num_features].
    # &#x6CE8;&#x610F;&#x53EA;&#x8BBE;&#x5B9A;&#x4E86;&#x7B2C;&#x4E8C;&#x4E2A;&#x7EF4;&#x5EA6;&#x7684;&#x5C3A;&#x5BF8;&#x4E3A;num_filters&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x7EF4;&#x5EA6;&#x4E3A;-1&#xFF0C;&#x4FDD;&#x8BC1;&#x7B2C;&#x4E00;&#x4E2A;&#x7EF4;&#x5EA6;num_images&#x4E0D;&#x53D8;
    # &#x5C55;&#x5E73;&#x540E;&#x7684;&#x5C42;&#x7684;&#x5F62;&#x72B6;&#x4E3A;:
    # [num_images, img_height * img_width * num_channels]
    layer_flat = tf.reshape(layer, [-1, num_features])

    return layer_flat, num_features
</code></pre>
<h4 id>&#x521B;&#x5EFA;&#x5168;&#x8FDE;&#x63A5;&#x5C42;</h4>
<pre><code class="language-python">def new_fc_layer(input,          # &#x524D;&#x4E00;&#x5C42;.
                num_inputs,    # &#x524D;&#x4E00;&#x5C42;&#x8F93;&#x5165;&#x7EF4;&#x5EA6;
                num_outputs,    # &#x8F93;&#x51FA;&#x7EF4;&#x5EA6;
                use_relu=True): # &#x662F;&#x5426;&#x4F7F;&#x7528;RELU

    # &#x65B0;&#x7684;&#x6743;&#x91CD;&#x548C;&#x504F;&#x7F6E;&#xFF0C;&#x4E0E;&#x7B2C;&#x4E00;&#x7AE0;&#x4E00;&#x6837;.
    weights = new_weights(shape=[num_inputs, num_outputs])
    biases = new_biases(length=num_outputs)

    # &#x8BA1;&#x7B97; y = wx + b&#xFF0C;&#x540C;&#x7B2C;&#x4E00;&#x7AE0;
    layer = tf.matmul(input, weights) + biases

    # &#x662F;&#x5426;&#x4F7F;&#x7528;RELU
    if use_relu:
        layer = tf.nn.relu(layer)

    return layer
</code></pre>
<h4 id="placeholder">Placeholder &#x5360;&#x4F4D;&#x7B26;</h4>
<p>&#x5360;&#x4F4D;&#x7B26;&#x4E3A;&#x8F93;&#x5165;&#x4E0E;&#x8F93;&#x51FA;&#x5360;&#x636E;&#x4F4D;&#x7F6E;&#xFF0C;&#x8FD9;&#x4E9B;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x4E00;&#x822C;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x8F6E;&#x6B21;&#x90FD;&#x4F1A;&#x6709;&#x6240;&#x53D8;&#x5316;&#x3002;&#x7531;&#x4E8E; TensorFlow &#x5148;&#x6784;&#x56FE;&#x518D;&#x8BA1;&#x7B97;&#xFF0C;&#x6240;&#x4EE5;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x5360;&#x4F4D;&#x7B26;&#x4E3A;&#x8F93;&#x5165;&#x548C;&#x8F93;&#x51FA;&#x9884;&#x7559;&#x4F4D;&#x7F6E;&#x3002;</p>
<pre><code class="language-python">x = tf.placeholder(tf.float32, shape=[None, img_size_flat], name=&apos;x&apos;)          # &#x539F;&#x59CB;&#x8F93;&#x5165;
x_image = tf.reshape(x, [-1, img_size, img_size, num_channels])                # &#x8F6C;&#x6362;&#x4E3A;2&#x7EF4;&#x56FE;&#x50CF;
y_true = tf.placeholder(tf.float32, shape=[None, num_classes], name=&apos;y_true&apos;)  # &#x539F;&#x59CB;&#x8F93;&#x51FA;
y_true_cls = tf.argmax(y_true, axis=1)                  # &#x8F6C;&#x6362;&#x4E3A;&#x771F;&#x5B9E;&#x7C7B;&#x522B;&#xFF0C;&#x4E0E;&#x4E4B;&#x524D;&#x7684;&#x4F7F;&#x7528;placeholder&#x4E0D;&#x540C;
</code></pre>
<h4 id="1">&#x5377;&#x79EF;&#x5C42; 1</h4>
<pre><code class="language-python">layer_conv1, weights_conv1 = \\
    new_conv_layer(input=x_image,                    # &#x8F93;&#x5165;&#x56FE;&#x50CF;
                  num_input_channels=num_channels,  # &#x8F93;&#x5165;&#x901A;&#x9053;&#x6570;
                  filter_size=filter_size1,          # &#x5377;&#x79EF;&#x6838;&#x5C3A;&#x5BF8;
                  num_filters=num_filters1,          # &#x5377;&#x79EF;&#x6838;&#x6570;&#x76EE;
                  use_pooling=True)
print(layer_conv1)
</code></pre>
<pre><code class="language-python">Tensor(&quot;Relu:0&quot;, shape=(?, 14, 14, 16), dtype=float32)
</code></pre>
<p>&#x8F93;&#x5165;&#x4E3A; <code>(?, 28, 28, 1)</code> &#x7684;&#x56FE;&#x50CF;&#xFF0C;&#x5176;&#x4E2D; <code>?</code> &#x4E3A;&#x56FE;&#x50CF;&#x6570;&#x91CF;&#x3002;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x5377;&#x79EF;&#x5C42;&#x7684;&#x8F93;&#x5165;&#x4E3A; <code>(?, 14, 14, 16)</code> &#x7684; tensor&#xFF0C;&#x5373; 14x14 &#x50CF;&#x7D20;&#x7684; 16 &#x9053;&#x56FE;&#x50CF;&#x3002;</p>
<h4 id="2">&#x5377;&#x79EF;&#x5C42; 2</h4>
<pre><code class="language-python">layer_conv2, weights_conv2 = \\
    new_conv_layer(input=layer_conv1,
                   num_input_channels=num_filters1,
                   filter_size=filter_size2,
                   num_filters=num_filters2,
                   use_pooling=True)
print(layer_conv2)
</code></pre>
<pre><code class="language-python">Tensor(&quot;Relu_1:0&quot;, shape=(?, 7, 7, 36), dtype=float32)
</code></pre>
<p>&#x89E3;&#x91CA;&#x540C;&#x4E0A;&#xFF0C;&#x8F93;&#x5165;&#x4E3A;&#x4E0A;&#x4E00;&#x5C42;&#x7684;&#x8F93;&#x51FA;&#x3002;</p>
<h4 id>&#x5C55;&#x5E73;&#x5C42;</h4>
<p>&#x5C55;&#x5E73;&#x5C42;&#x5C06;&#x7B2C;&#x4E8C;&#x4E2A;&#x5377;&#x79EF;&#x5C42;&#x5C55;&#x5E73;&#x4E3A;&#x4E8C;&#x7EF4; tensor&#x3002;</p>
<pre><code class="language-python">layer_flat, num_features = flatten_layer(layer_conv2)
print(layer_flat)
</code></pre>
<pre><code class="language-python">Tensor(&quot;Reshape_1:0&quot;, shape=(?, 1764), dtype=float32)
</code></pre>
<p>&#x8F93;&#x51FA;&#x4E3A; <code>(?, 1764)</code> &#x7684; tensor&#x3002;</p>
<h4 id="1">&#x5168;&#x8FDE;&#x63A5;&#x5C42; 1</h4>
<pre><code class="language-python">layer_fc1 = new_fc_layer(input=layer_flat,   # &#x5C55;&#x5E73;&#x5C42;&#x8F93;&#x51FA;
                         num_inputs=num_features,   # &#x8F93;&#x5165;&#x7279;&#x5F81;&#x7EF4;&#x5EA6;
                         num_outputs=fc_size,       # &#x8F93;&#x51FA;&#x7279;&#x5F81;&#x7EF4;&#x5EA6;
                         use_relu=True)
print(layer_fc1)
</code></pre>
<pre><code class="language-python">Tensor(&quot;Relu_2:0&quot;, shape=(?, 128), dtype=float32)
</code></pre>
<p>&#x8F93;&#x51FA;&#x4E3A; <code>(?, 128)</code> &#x7684; 2 &#x7EF4; tensor&#x3002;</p>
<h4 id="2">&#x5168;&#x8FDE;&#x63A5;&#x5C42; 2</h4>
<pre><code class="language-python">layer_fc2 = new_fc_layer(input=layer_fc1,           # &#x4E0A;&#x4E00;&#x5168;&#x8FDE;&#x63A5;&#x5C42;
                         num_inputs=fc_size,        # &#x8F93;&#x5165;&#x7279;&#x5F81;&#x7EF4;&#x5EA6;
                         num_outputs=num_classes,   # &#x8F93;&#x51FA;&#x7C7B;&#x522B;&#x6570;
                         use_relu=False)
print(layer_fc2)
</code></pre>
<pre><code class="language-python">Tensor(&quot;add_3:0&quot;, shape=(?, 10), dtype=float32)
</code></pre>
<p>&#x8F93;&#x51FA;&#x4E3A; <code>(?, 10)</code> &#x7684;&#x4E8C;&#x7EF4; tensor&#xFF0C;&#x610F;&#x5728;&#x5224;&#x5B9A;&#x8F93;&#x5165;&#x56FE;&#x50CF;&#x5C5E;&#x4E8E;&#x54EA;&#x4E00;&#x7C7B;, &#x6CE8;&#x610F;&#x8BE5;&#x5C42;&#x672A;&#x4F7F;&#x7528; relu&#xFF0C;&#x56E0;&#x4E3A;&#x5C06;&#x8981;&#x8F93;&#x5165;&#x5230;&#x540E;&#x7EED;&#x7684; softmax &#x4E2D;&#x3002;</p>
<h4 id>&#x9884;&#x6D4B;&#x7C7B;&#x522B;</h4>
<p>&#x7B2C;&#x4E8C;&#x4E2A;&#x5168;&#x8FDE;&#x63A5;&#x5C42;&#x4F30;&#x8BA1;&#x8F93;&#x5165;&#x7684;&#x56FE;&#x50CF;&#x5C5E;&#x4E8E;&#x67D0;&#x4E00;&#x7C7B;&#x522B;&#x7684;&#x7A0B;&#x5EA6;&#xFF0C;&#x8FD9;&#x4E2A;&#x4F30;&#x8BA1;&#x6709;&#x4E9B;&#x7C97;&#x7CD9;&#xFF0C;&#x9700;&#x8981;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A; softmax &#x5C42;&#x5F52;&#x4E00;&#x5316;&#x4E3A;&#x6982;&#x7387;&#x8868;&#x793A;&#x3002;</p>
<pre><code class="language-python">y_pred = tf.nn.softmax(layer_fc2)              # softmax&#x5F52;&#x4E00;&#x5316;
y_pred_cls = tf.argmax(y_pred, axis=1)         # &#x771F;&#x5B9E;&#x7C7B;&#x522B;
</code></pre>
<h4 id>&#x4EE3;&#x4EF7;&#x51FD;&#x6570;</h4>
<p>&#x8FD9;&#x4E00;&#x90E8;&#x5206;&#x4E0E;&#x4E0A;&#x4E00;&#x7AE0;&#x7684;&#x7C7B;&#x4F3C;&#x3002;</p>
<pre><code class="language-python">cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=layer_fc2,
                                                        labels=y_true)
cost = tf.reduce_mean(cross_entropy)
</code></pre>
<h4 id>&#x4F18;&#x5316;&#x65B9;&#x6CD5;</h4>
<p>&#x8FD9;&#x4E00;&#x90E8;&#x5206;&#x4E0E;&#x4E0A;&#x4E00;&#x7AE0;&#x7C7B;&#x4F3C;&#xFF0C;&#x4F46;&#x662F;&#x4F18;&#x5316;&#x5668;&#x4F7F;&#x7528;&#x6539;&#x8FDB;&#x7248;&#x7684;&#x68AF;&#x5EA6;&#x4E0B;&#x964D;&#xFF0C;Adam&#x3002;</p>
<pre><code class="language-python">optimizer = tf.train.AdamOptimizer(learning_rate=1e-4).minimize(cost)
</code></pre>
<h4 id>&#x6027;&#x80FD;&#x5EA6;&#x91CF;</h4>
<p>&#x540C;&#x4E0A;&#x4E00;&#x7AE0;</p>
<pre><code class="language-python">correct_prediction = tf.equal(y_pred_cls, y_true_cls)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
</code></pre>
<h3 id="tensorflow">&#x8FD0;&#x884C; TensorFlow &#x8BA1;&#x7B97;&#x56FE;</h3>
<h4 id="session">&#x521B;&#x5EFA; Session &#x4EE5;&#x53CA;&#x53D8;&#x91CF;&#x521D;&#x59CB;&#x5316;</h4>
<p>TensorFlow &#x8BA1;&#x7B97;&#x56FE;&#x8FD0;&#x884C;&#x5728;&#x4E00;&#x4E2A; session &#x4E2D;&#xFF0C;&#x8BA1;&#x7B97;&#x4E4B;&#x524D;&#x9700;&#x8981;&#x5148;&#x521B;&#x5EFA;&#x8FD9;&#x4E2A; session&#xFF0C;&#x5E76;&#x521D;&#x59CB;&#x5316;&#x5176;&#x4E2D;&#x7684;&#x4E00;&#x4E9B;&#x53D8;&#x91CF;&#xFF08;w &#x548C; b&#xFF09;&#xFF0C;TensorFlow &#x4F7F;&#x7528; <code>session.run()</code> &#x6765;&#x8FD0;&#x884C;&#x8BA1;&#x7B97;&#x56FE;&#x3002;</p>
<pre><code class="language-python">session = tf.Session()   # &#x521B;&#x5EFA;session
session.run(tf.global_variables_initializer())   # &#x53D8;&#x91CF;&#x521D;&#x59CB;&#x5316;
</code></pre>
<h4 id>&#x6267;&#x884C;&#x4F18;&#x5316;&#x7684;&#x5E2E;&#x52A9;&#x51FD;&#x6570;</h4>
<p>&#x540C;&#x7B2C;&#x4E00;&#x7AE0;&#xFF0C;&#x6DFB;&#x52A0;&#x4E86;&#x90E8;&#x5206;&#x72B6;&#x6001;&#x8F93;&#x51FA;&#x7684;&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code class="language-python">train_batch_size = 64

# &#x8BA1;&#x7B97;&#x76EE;&#x524D;&#x6267;&#x884C;&#x7684;&#x603B;&#x8FED;&#x4EE3;&#x6B21;&#x6570;
total_iterations = 0

def optimize(num_iterations):
    # &#x4FDD;&#x8BC1;&#x66F4;&#x65B0;&#x5168;&#x5C40;&#x53D8;&#x91CF;.
    global total_iterations

    # &#x7528;&#x6765;&#x8F93;&#x51FA;&#x7528;&#x65F6;.
    start_time = time.time()

    for i in range(total_iterations, total_iterations + num_iterations):
        # &#x83B7;&#x53D6;&#x4E00;&#x6279;&#x6570;&#x636E;&#xFF0C;&#x653E;&#x5165;dict&#xFF0C;&#x540C;&#x7B2C;&#x4E00;&#x7AE0;
        x_batch, y_true_batch = data.train.next_batch(train_batch_size)
        feed_dict_train = {x: x_batch,
                          y_true: y_true_batch}
        # &#x8FD0;&#x884C;&#x4F18;&#x5316;&#x5668;
        session.run(optimizer, feed_dict=feed_dict_train)

        # &#x6BCF;100&#x8F6E;&#x8FED;&#x4EE3;&#x8F93;&#x51FA;&#x72B6;&#x6001;
        if i % 100 == 0:
            # &#x8BA1;&#x7B97;&#x8BAD;&#x7EC3;&#x96C6;&#x51C6;&#x786E;&#x7387;.
            acc = session.run(accuracy, feed_dict=feed_dict_train)
            msg = &quot;&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;: {0:&gt;6}, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: {1:&gt;6.1%}&quot;
            print(msg.format(i + 1, acc))

    total_iterations += num_iterations

    end_time = time.time()
    time_dif = end_time - start_time

    # &#x8F93;&#x51FA;&#x7528;&#x65F6;.
    print(&quot;&#x7528;&#x65F6;: &quot; + str(timedelta(seconds=int(round(time_dif)))))
</code></pre>
<h4 id>&#x8F93;&#x51FA;&#x90E8;&#x5206;&#x9519;&#x8BEF;&#x6837;&#x4F8B;&#x548C;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;</h4>
<p>&#x4E0E;&#x4E0A;&#x4E00;&#x7AE0;&#x7C7B;&#x4F3C;&#x3002;</p>
<pre><code class="language-python">def plot_example_errors(cls_pred, correct):
    # &#x8BA1;&#x7B97;&#x9519;&#x8BEF;&#x60C5;&#x51B5;
    incorrect = (correct == False)
    images = data.test.images[incorrect]
    cls_pred = cls_pred[incorrect]
    cls_true = data.test.cls[incorrect]

    # &#x968F;&#x673A;&#x6311;&#x9009;9&#x4E2A;
    indices = np.arange(len(images))
    np.random.shuffle(indices)
    indices = indices[:9]

    plot_images(images[indices], cls_true[indices], cls_pred[indices])

def plot_confusion_matrix(cls_pred):
    cls_true = data.test.cls  # &#x771F;&#x5B9E;&#x7C7B;&#x522B;  

    # &#x4F7F;&#x7528;scikit-learn&#x7684;confusion_matrix&#x6765;&#x8BA1;&#x7B97;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;
    cm = confusion_matrix(y_true=cls_true, y_pred=cls_pred)

    # &#x6253;&#x5370;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;
    print(cm)

    # &#x5C06;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#x8F93;&#x51FA;&#x4E3A;&#x56FE;&#x50CF;
    plt.imshow(cm, interpolation=&apos;nearest&apos;, cmap=plt.cm.Blues)

    # &#x8C03;&#x6574;&#x56FE;&#x50CF;
    plt.tight_layout()
    plt.colorbar()
    tick_marks = np.arange(num_classes)
    plt.xticks(tick_marks, range(num_classes))
    plt.yticks(tick_marks, range(num_classes))
    plt.xlabel(&apos;Predicted&apos;)
    plt.ylabel(&apos;True&apos;)
    plt.show()
</code></pre>
<h4 id>&#x663E;&#x793A;&#x6027;&#x80FD;&#x7684;&#x5E2E;&#x52A9;&#x51FD;&#x6570;</h4>
<p>&#x7528;&#x6765;&#x8F93;&#x51FA;&#x6D4B;&#x8BD5;&#x51C6;&#x786E;&#x7387;&#x7684;&#x7684;&#x51FD;&#x6570;&#x3002;&#x8BA1;&#x7B97;&#x6240;&#x6709;&#x56FE;&#x50CF;&#x7684;&#x5206;&#x7C7B;&#x9700;&#x8981;&#x4E00;&#x5B9A;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x5728;&#x4E0A;&#x9762;&#x5B9A;&#x4E49;&#x7684;&#x4E00;&#x4E9B;&#x51FD;&#x6570;&#x4E2D;&#x91CD;&#x7528;&#x4E86;&#x5206;&#x7C7B;&#x7ED3;&#x679C;&#x3002;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x4F1A;&#x5360;&#x636E;&#x5927;&#x91CF;&#x7684;&#x5185;&#x5B58;&#xFF0C;&#x6240;&#x4EE5;&#x5C06;&#x6D4B;&#x8BD5;&#x96C6;&#x5206;&#x6210;&#x4E86;&#x591A;&#x4E2A;&#x5C0F;&#x7684;&#x6279;&#x6B21;&#x3002;&#x5982;&#x679C;&#x4F60;&#x7684;&#x673A;&#x5668;&#x5185;&#x5B58;&#x592A;&#x5C0F;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x51CF;&#x5C0F; batch_size&#x3002;</p>
<pre><code class="language-python"># &#x5C06;&#x6D4B;&#x8BD5;&#x96C6;&#x5206;&#x6210;&#x66F4;&#x5C0F;&#x7684;&#x6279;&#x6B21;
test_batch_size = 256

def print_test_accuracy(show_example_errors=False,
                        show_confusion_matrix=False):
    # &#x6D4B;&#x8BD5;&#x96C6;&#x56FE;&#x50CF;&#x6570;&#x91CF;.
    num_test = len(data.test.images)

    # &#x4E3A;&#x9884;&#x6D4B;&#x7ED3;&#x679C;&#x7533;&#x8BF7;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;.
    cls_pred = np.zeros(shape=num_test, dtype=np.int)

    # &#x6570;&#x636E;&#x96C6;&#x7684;&#x8D77;&#x59CB;id&#x4E3A;0
    i = 0
    while i &lt; num_test:
        # j&#x4E3A;&#x4E0B;&#x4E00;&#x6279;&#x6B21;&#x7684;&#x622A;&#x6B62;id
        j = min(i + test_batch_size, num_test)

        # &#x83B7;&#x53D6;i&#xFF0C;j&#x4E4B;&#x95F4;&#x7684;&#x56FE;&#x50CF;
        images = data.test.images[i:j, :]

        # &#x83B7;&#x53D6;&#x76F8;&#x5E94;&#x6807;&#x7B7E;.
        labels = data.test.labels[i:j, :]

        # &#x521B;&#x5EFA;feed_dict
        feed_dict = {x: images,
                    y_true: labels}

        # &#x8BA1;&#x7B97;&#x9884;&#x6D4B;&#x7ED3;&#x679C;
        cls_pred[i:j] = session.run(y_pred_cls, feed_dict=feed_dict)

        # &#x8BBE;&#x5B9A;&#x4E3A;&#x4E0B;&#x4E00;&#x6279;&#x6B21;&#x8D77;&#x59CB;&#x503C;.
        i = j

    cls_true = data.test.cls
    # &#x6B63;&#x786E;&#x7684;&#x5206;&#x7C7B;
    correct = (cls_true == cls_pred)
    # &#x6B63;&#x786E;&#x5206;&#x7C7B;&#x7684;&#x6570;&#x91CF;
    correct_sum = correct.sum()
    # &#x5206;&#x7C7B;&#x51C6;&#x786E;&#x7387;
    acc = float(correct_sum) / num_test

    # &#x6253;&#x5370;&#x51C6;&#x786E;&#x7387;.
    msg = &quot;&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: {0:.1%} ({1} / {2})&quot;
    print(msg.format(acc, correct_sum, num_test))

    # &#x6253;&#x5370;&#x90E8;&#x5206;&#x9519;&#x8BEF;&#x6837;&#x4F8B;.
    if show_example_errors:
        print(&quot;Example errors:&quot;)
        plot_example_errors(cls_pred=cls_pred, correct=correct)

    # &#x6253;&#x5370;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;.
    if show_confusion_matrix:
        print(&quot;Confusion Matrix:&quot;)
        plot_confusion_matrix(cls_pred=cls_pred)
</code></pre>
<h4 id>&#x4F18;&#x5316;&#x524D;&#x7684;&#x6027;&#x80FD;&#x6D4B;&#x8BD5;</h4>
<pre><code class="language-python">print_test_accuracy()
</code></pre>
<pre><code class="language-python">&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 4.2% (424 / 10000)
</code></pre>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x6D4B;&#x8BD5;&#x7684;&#x51C6;&#x786E;&#x7387;&#x6781;&#x4F4E;&#xFF0C;&#x4F46;&#x662F;&#x51FD;&#x6570;&#x7684;&#x529F;&#x80FD;&#x6B63;&#x5E38;&#x3002;</p>
<h4 id>&#x6267;&#x884C;&#x4E00;&#x8F6E;&#x4F18;&#x5316;&#x540E;&#x7684;&#x6027;&#x80FD;</h4>
<pre><code class="language-python">optimize(num_iterations=1)
print_test_accuracy()
</code></pre>
<pre><code class="language-python">&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:      1, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:   3.1%
&#x7528;&#x65F6;: 0:00:00
&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 5.3% (534 / 10000)
</code></pre>
<p>&#x4E00;&#x8F6E;&#x8FED;&#x4EE3;&#x540E;&#xFF0C;&#x6027;&#x80FD;&#x7A0D;&#x6709;&#x63D0;&#x5347;&#x3002;</p>
<h4 id="100">100 &#x8F6E;&#x4F18;&#x5316;&#x540E;&#x7684;&#x6027;&#x80FD;</h4>
<pre><code class="language-python">optimize(num_iterations=99)
print_test_accuracy()
</code></pre>
<pre><code class="language-python">&#x7528;&#x65F6;: 0:00:08
&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 70.8% (7077 / 10000)
</code></pre>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x6267;&#x884C; 100 &#x8F6E;&#x8FED;&#x4EE3;&#x540E;&#xFF0C;&#x6027;&#x80FD;&#x5B58;&#x5728;&#x5927;&#x5E45;&#x5EA6;&#x63D0;&#x5347;&#x3002;</p>
<h4 id="1000">1000 &#x8F6E;&#x4F18;&#x5316;&#x540E;&#x6027;&#x80FD;</h4>
<pre><code class="language-python">optimize(num_iterations=900)
print_test_accuracy(show_example_errors=True)
</code></pre>
<pre><code class="language-python">&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  70.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  87.5%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  84.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  84.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  90.6%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  89.1%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:    901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x7528;&#x65F6;: 0:01:12
&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 93.5% (9351 / 10000)
Example errors:
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-4.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x6D4B;&#x8BD5;&#x96C6;&#x7684;&#x51C6;&#x786E;&#x7387;&#x4E3A; 93.5%&#xFF0C;&#x5DF2;&#x7ECF;&#x6BD4;&#x7B2C;&#x4E00;&#x7AE0;&#x7684; 91.9% &#x8981;&#x9AD8;&#x3002;&#x8F93;&#x51FA;&#x7684;&#x90E8;&#x5206;&#x9519;&#x8BEF;&#x6837;&#x4F8B;&#x663E;&#x793A;&#xFF0C;&#x90E8;&#x5206;&#x5F62;&#x72B6;&#x76F8;&#x4F3C;&#x7684;&#x6570;&#x5B57;&#x4ECD;&#x7136;&#x96BE;&#x4EE5;&#x533A;&#x5206;&#x3002;</p>
<h4 id="10000">10000 &#x8F6E;&#x6B21;&#x4F18;&#x5316;&#x540E;&#x7684;&#x6027;&#x80FD;</h4>
<pre><code class="language-python">optimize(num_iterations=9000)
print_test_accuracy(show_example_errors=True,
                    show_confusion_matrix=True)
</code></pre>
<pre><code class="language-python">&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  92.2%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  92.2%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  92.2%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   1901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   2901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  90.6%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   3901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   4901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  93.8%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  92.2%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   5901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   6901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   7901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  95.3%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   8901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  96.9%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9001, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9101, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9201, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9301, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9401, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9501, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9601, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9701, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9801, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;:  98.4%
&#x8FED;&#x4EE3;&#x8F6E;&#x6B21;:   9901, &#x8BAD;&#x7EC3;&#x51C6;&#x786E;&#x7387;: 100.0%
&#x7528;&#x65F6;: 0:12:42
&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 98.7% (9873 / 10000)
Example errors:
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-5.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<pre><code class="language-python">Confusion Matrix:
[[ 974    0    1    0    0    1    1    1    2    0]
 [   0 1130    1    0    0    1    0    2    1    0]
 [   4    1 1020    0    1    0    0    3    3    0]
 [   1    0    1 1000    0    3    0    2    3    0]
 [   0    0    2    0  968    0    1    2    2    7]
 [   2    0    0    6    0  878    2    2    1    1]
 [   5    2    0    0    2    2  945    0    2    0]
 [   1    0    7    2    0    0    0 1016    1    1]
 [   5    0    2    1    0    2    0    2  959    3]
 [   2    5    1    3    4    4    0    5    2  983]]
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-6.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x7ECF;&#x8FC7; 10000 &#x8F6E;&#x8FED;&#x4EE3;&#x540E;&#xFF0C;&#x6D4B;&#x8BD5;&#x96C6;&#x7684;&#x51C6;&#x786E;&#x7387;&#x8FBE;&#x5230;&#x4E86; 98.7% &#x7684;&#x51C6;&#x786E;&#x7387;&#x3002;&#x5728;&#x5206;&#x9519;&#x7684;&#x6837;&#x672C;&#x4E2D;&#xFF0C;&#x90E8;&#x5206;&#x7528;&#x8089;&#x773C;&#x4E5F;&#x96BE;&#x4EE5;&#x5206;&#x8FA8;&#x3002;&#x800C;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#x8868;&#x660E;&#x7EDD;&#x5927;&#x90E8;&#x5206;&#x7684;&#x6837;&#x672C;&#x90FD;&#x5206;&#x7C7B;&#x6B63;&#x786E;&#x3002;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x975E;&#x5E38;&#x597D;&#x7684;&#x6A21;&#x578B;&#x3002;</p>
<h3 id>&#x6743;&#x91CD;&#x548C;&#x5C42;&#x7684;&#x53EF;&#x89C6;&#x5316;</h3>
<p>&#x4E3A;&#x4E86;&#x66F4;&#x597D;&#x7684;&#x7406;&#x89E3;&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x4E3A;&#x4F55;&#x80FD;&#x8BC6;&#x522B;&#x624B;&#x5199;&#x4F53;&#x6570;&#x5B57;&#xFF0C;&#x6211;&#x6765;&#x6765;&#x53EF;&#x89C6;&#x5316;&#x90E8;&#x5206;&#x6743;&#x91CD;&#x548C;&#x5C42;&#x8F93;&#x51FA;&#x3002;</p>
<h4 id>&#x5377;&#x79EF;&#x6743;&#x91CD;&#x53EF;&#x89C6;&#x5316;</h4>
<pre><code class="language-python">def plot_conv_weights(weights, input_channel=0):
    # weights_conv1 or weights_conv2.

    # &#x8FD0;&#x884C;weights&#x4EE5;&#x83B7;&#x5F97;&#x6743;&#x91CD;
    w = session.run(weights)

    # &#x83B7;&#x53D6;&#x6743;&#x91CD;&#x6700;&#x5C0F;&#x503C;&#x6700;&#x5927;&#x503C;&#xFF0C;&#x8FD9;&#x5C06;&#x7528;&#x6237;&#x7EA0;&#x6B63;&#x6574;&#x4E2A;&#x56FE;&#x50CF;&#x7684;&#x989C;&#x8272;&#x5BC6;&#x96C6;&#x5EA6;&#xFF0C;&#x6765;&#x8FDB;&#x884C;&#x5BF9;&#x6BD4;
    w_min = np.min(w)
    w_max = np.max(w)

    # &#x5377;&#x79EF;&#x6838;&#x6811;&#x6728;
    num_filters = w.shape[3]

    # &#x9700;&#x8981;&#x8F93;&#x51FA;&#x7684;&#x5377;&#x79EF;&#x6838;
    num_grids = math.ceil(math.sqrt(num_filters))

    fig, axes = plt.subplots(num_grids, num_grids)
    for i, ax in enumerate(axes.flat):
        # &#x53EA;&#x8F93;&#x51FA;&#x6709;&#x7528;&#x7684;&#x5B50;&#x56FE;.
        if i&lt;num_filters:
            # &#x83B7;&#x5F97;&#x7B2C;i&#x4E2A;&#x5377;&#x79EF;&#x6838;&#x5728;&#x7279;&#x5B9A;&#x8F93;&#x5165;&#x901A;&#x9053;&#x4E0A;&#x7684;&#x6743;&#x91CD;
            img = w[:, :, input_channel, i]

            ax.imshow(img, vmin=w_min, vmax=w_max,
                      interpolation=&apos;nearest&apos;, cmap=&apos;seismic&apos;)

        # &#x79FB;&#x9664;&#x5750;&#x6807;.
        ax.set_xticks([])
        ax.set_yticks([])
    plt.show()
</code></pre>
<h4 id>&#x5377;&#x79EF;&#x5C42;&#x8F93;&#x51FA;&#x53EF;&#x89C6;&#x5316;</h4>
<pre><code class="language-python">def plot_conv_layer(layer, image):
    # layer_conv1 or layer_conv2.

    # feed_dict&#x53EA;&#x9700;&#x8981;x&#xFF0C;&#x6807;&#x7B7E;&#x4FE1;&#x606F;&#x5728;&#x6B64;&#x4E0D;&#x9700;&#x8981;.
    feed_dict = {x: [image]}

    # &#x83B7;&#x53D6;&#x8BE5;&#x5C42;&#x7684;&#x8F93;&#x51FA;&#x7ED3;&#x679C;
    values = session.run(layer, feed_dict=feed_dict)

    # &#x5377;&#x79EF;&#x6838;&#x6811;&#x6728;
    num_filters = values.shape[3]

    # &#x6BCF;&#x884C;&#x9700;&#x8981;&#x8F93;&#x51FA;&#x7684;&#x5377;&#x79EF;&#x6838;&#x7F51;&#x683C;&#x6570;
    num_grids = math.ceil(math.sqrt(num_filters))

    fig, axes = plt.subplots(num_grids, num_grids)
    for i, ax in enumerate(axes.flat):
        # &#x53EA;&#x8F93;&#x51FA;&#x6709;&#x7528;&#x7684;&#x5B50;&#x56FE;.
        if i&lt;num_filters:
            # &#x83B7;&#x53D6;&#x7B2C;i&#x4E2A;&#x5377;&#x79EF;&#x6838;&#x7684;&#x8F93;&#x51FA;
            img = values[0, :, :, i]

            ax.imshow(img, interpolation=&apos;nearest&apos;, cmap=&apos;binary&apos;)

        # &#x79FB;&#x9664;&#x5750;&#x6807;.
        ax.set_xticks([])
        ax.set_yticks([])
    plt.show()
</code></pre>
<h4 id>&#x6253;&#x5370;&#x8F93;&#x5165;&#x56FE;&#x50CF;</h4>
<pre><code class="language-python">def plot_image(image):
    plt.imshow(image.reshape(img_shape),
              interpolation=&apos;nearest&apos;,
              cmap=&apos;binary&apos;)

    plt.show()
</code></pre>
<p>&#x6253;&#x5370;&#x7B2C;&#x4E00;&#x7AE0;&#x56FE;&#x50CF;&#xFF1A;</p>
<pre><code class="language-python">image1 = data.test.images[0]
plot_image(image1)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-7.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x6253;&#x5370;&#x53E6;&#x4E00;&#x5F20;&#x56FE;&#x50CF;:</p>
<pre><code class="language-python">image2 = data.test.images[13]
plot_image(image2)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-8.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<h4 id="1">&#x5377;&#x79EF;&#x5C42; 1</h4>
<pre><code class="language-python">plot_conv_weights(weights=weights_conv1)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-9.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F; 16 &#x4E2A;&#x5377;&#x79EF;&#x6838;&#x5728;&#x7B2C;&#x4E00;&#x4E2A;&#x901A;&#x9053;&#x7684;&#x6743;&#x91CD;&#x60C5;&#x51B5;&#x3002;&#x5176;&#x4E2D;&#x7EA2;&#x8272;&#x4E3A;&#x6B63;&#x7684;&#x6743;&#x91CD;&#xFF0C;&#x84DD;&#x8272;&#x4E3A;&#x8D1F;&#x7684;&#x6743;&#x91CD;&#x3002;&#x5728;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x5F88;&#x96BE;&#x5224;&#x522B;&#x8FD9;&#x4E9B;&#x6743;&#x91CD;&#x662F;&#x5982;&#x4F55;&#x8D77;&#x4F5C;&#x7528;&#x7684;&#x3002;</p>
<p>&#x5C06; image1 &#x5582;&#x5165;&#x5377;&#x79EF;&#x5C42; 1&#xFF0C;&#x5F97;&#x5230;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x5377;&#x79EF;&#x540E;&#x5F97;&#x5230;&#x7684;&#x56FE;&#x50CF;&#xFF0C;&#x8FD9;&#x4E9B;&#x56FE;&#x50CF;&#x7684;&#x68F1;&#x89D2;&#x66F4;&#x52A0;&#x5206;&#x660E;&#xFF0C;&#x800C;&#x4E14;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x8FB9;&#x7684;&#x7A81;&#x51FA;&#x60C5;&#x51B5;&#x4E5F;&#x4E0D;&#x540C;&#xFF1A;</p>
<pre><code class="language-python">plot_conv_layer(layer=layer_conv1, image=image1)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-10.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x5C06; image2 &#x5582;&#x5165;&#x5377;&#x79EF;&#x5C42; 1&#xFF0C;&#x5F97;&#x5230;&#x5982;&#x4E0B;&#x56FE;&#x50CF;&#xFF0C;&#x5728;&#x4E0D;&#x540C;&#x90E8;&#x4F4D;&#x7684;&#x7A81;&#x51FA;&#x60C5;&#x51B5;&#x4E0D;&#x540C;&#xFF1A;</p>
<pre><code class="language-python">plot_conv_layer(layer=layer_conv1, image=image2)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-11.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<h4 id="2">&#x5377;&#x79EF;&#x5C42; 2</h4>
<p>&#x73B0;&#x5728;&#x8F93;&#x51FA;&#x7B2C;&#x4E8C;&#x4E2A;&#x5377;&#x79EF;&#x5C42;&#x7684;&#x6743;&#x91CD;&#x3002;</p>
<p>&#x7531;&#x4E8E;&#x5377;&#x79EF;&#x5C42; 1 &#x6709; 16 &#x4E2A;&#x8F93;&#x51FA;&#x901A;&#x9053;&#xFF0C;&#x8FD9;&#x610F;&#x5473;&#x7740;&#x5377;&#x79EF;&#x5C42; 2 &#x6709; 16 &#x4E2A;&#x8F93;&#x5165;&#x901A;&#x9053;&#xFF0C;&#x6BCF;&#x4E2A;&#x901A;&#x9053;&#x7684;&#x8F93;&#x5165;&#x53C8;&#x5BF9;&#x5E94; 36 &#x4E2A;&#x8F93;&#x51FA;&#x901A;&#x9053;&#xFF0C;&#x56E0;&#x6B64;&#x603B;&#x5171;&#x6709; 16x36 &#x4E2A;&#x901A;&#x9053;&#x7684;&#x5377;&#x79EF;&#x6838;&#x3002;&#x6211;&#x4EEC;&#x5148;&#x8F93;&#x51FA;&#x7B2C;&#x4E00;&#x4E2A;&#x901A;&#x9053;&#x7684;&#x5377;&#x79EF;&#x6838;&#x3002;</p>
<pre><code class="language-python">plot_conv_weights(weights=weights_conv2, input_channel=0)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-12.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x8FD9;&#x4E9B;&#x6743;&#x91CD;&#x76F8;&#x5BF9;&#x4E0E;&#x5377;&#x79EF;&#x5C42;1&#x7684;&#x6743;&#x91CD;&#x66F4;&#x52A0;&#x62BD;&#x8C61;&#xFF0C;&#x65E0;&#x6CD5;&#x7528;&#x8BED;&#x8A00;&#x6765;&#x89E3;&#x91CA;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x8F93;&#x51FA;&#x7B2C;&#x4E8C;&#x4E2A;&#x901A;&#x9053;&#x7684;&#x5377;&#x79EF;&#x6838;&#x3002;</p>
<pre><code class="language-python">plot_conv_weights(weights=weights_conv2, input_channel=1)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-13.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x53EF;&#x4EE5;&#x8BF4;&#x660E;&#xFF0C;&#x4E0D;&#x540C;&#x8F93;&#x5165;&#x901A;&#x9053;&#x5BF9;&#x5E94;&#x7684;&#x5377;&#x79EF;&#x6838;&#x662F;&#x4E0D;&#x540C;&#x7684;&#x3002;&#x5C06;image1&#x5728;&#x5377;&#x79EF;&#x5C42;1&#x7684;&#x8F93;&#x51FA;&#x518D;&#x6B21;&#x8F93;&#x5165;&#x5377;&#x79EF;&#x5C42;2&#xFF0C;&#x5F97;&#x5230;&#x5982;&#x4E0B;&#x8F93;&#x51FA;&#xFF1A;</p>
<pre><code class="language-python">plot_conv_layer(layer=layer_conv1, image=image2)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-14.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>image2&#x7684;&#x8F93;&#x51FA;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-python">plot_conv_layer(layer=layer_conv1, image=image2)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-2-15.png" class="kg-image" alt="TensorFlow (2) - &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x6240;&#x8F93;&#x51FA;&#x7684;&#x56FE;&#x50CF;&#x8FBE;&#x5230;&#x4E86;&#x4E00;&#x4E2A;&#x66F4;&#x9AD8;&#x7684;&#x5C42;&#x6B21;&#xFF0C;&#x5377;&#x79EF;&#x6838;&#x8BD5;&#x56FE;&#x63D0;&#x53D6;&#x4E00;&#x4E9B;&#x8FB9;&#x7F18;&#x5316;&#x7684;&#x7279;&#x5F81;&#xFF0C;&#x8FD9;&#x4E9B;&#x7279;&#x5F81;&#x5BF9;&#x4E8E;&#x540C;&#x7C7B;&#x56FE;&#x50CF;&#x7684;&#x53D8;&#x5316;&#x5E76;&#x4E0D;&#x654F;&#x611F;&#x3002;</p>
<p>&#x5728;&#x8FD0;&#x884C;&#x5B8C;&#x6574;&#x4E2A;&#x8BA1;&#x7B97;&#x56FE;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x5C06;&#x5B83;&#x5173;&#x95ED;&#xFF0C;&#x5426;&#x5219;&#x5C06;&#x4E00;&#x76F4;&#x5360;&#x7528;&#x8D44;&#x6E90;:</p>
<pre><code class="language-python">session.close()
</code></pre>
<!--kg-card-end: markdown-->
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[TensorFlow (1) - 线性模型]]></title><description><![CDATA[本章主要通过线性模型介绍TensorFlow的一些基本使用流程。]]></description><link>https://gaussic.com/tensorflow-linear-model/</link><guid isPermaLink="false">626173b75d2e434866501f89</guid><category><![CDATA[TensorFlow]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Fri, 11 Aug 2017 06:42:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/ferris-wheel-4775031_1280.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/ferris-wheel-4775031_1280.jpg" alt="TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;"><p>&#x8FD9;&#x662F;&#x51E0;&#x7BC7;&#x4E0E;&#x539F;&#x4F5C;&#x4E0D;&#x5B8C;&#x5168;&#x76F8;&#x540C;&#x7684;&#x6559;&#x7A0B;&#x3002;</p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x8BF4;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/tensorflow-linear-model/">TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;</a></p>
<p>&#x539F;&#x4F5C;&#x8005;&#xFF1A;<a href="http://www.hvass-labs.org/">Magnus Erik Hvass Pedersen</a> / <a href="https://github.com/Hvass-Labs/TensorFlow-Tutorials">GitHub</a> / <a href="https://www.youtube.com/playlist?list=PL9Hr9sNUjfsmEu1ZniY0XpHSzl5uihcXZ">Videos on YouTube</a></p>
<h3 id>&#x9700;&#x8981;&#x5BFC;&#x5165;&#x7684;&#x5305;</h3>
<pre><code class="language-python">import tensorflow as tf          # TensorFlow
import matplotlib.pyplot as plt  # matplotlib&#x7ED8;&#x56FE;
import numpy as np               # Numpy
from sklearn.metrics import confusion_matrix    # &#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#xFF0C;&#x5206;&#x6790;&#x6A21;&#x578B;&#x8BEF;&#x5DEE;

# notebook&#x4F7F;&#x7528;
%matplotlib inline
</code></pre>
<h3 id>&#x8F7D;&#x5165;&#x6570;&#x636E;</h3>
<p>TensorFlow &#x5728;&#x6837;&#x4F8B;&#x6559;&#x7A0B;&#x4E2D;&#x5DF2;&#x7ECF;&#x505A;&#x4E86;&#x4E0B;&#x8F7D;&#x5E76;&#x5BFC;&#x5165; MNIST &#x6570;&#x5B57;&#x624B;&#x5199;&#x4F53;&#x8BC6;&#x522B;&#x6570;&#x636E;&#x96C6;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x3002;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x4F1A;&#x5C06; MNIST &#x6570;&#x636E;&#x96C6;&#x4E0B;&#x8F7D;&#x5230; <code>data/MNIST</code> &#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x5C06;&#x6807;&#x7B7E;&#x4FDD;&#x5B58;&#x4E3A; <code>one-hot</code> &#x7F16;&#x7801;&#x3002;</p>
<pre><code class="language-python">from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(&apos;data/MNIST&apos;, one_hot=True)
</code></pre>
<p>MNIST &#x6570;&#x636E;&#x96C6;&#x603B;&#x5171;&#x6709; 70000 &#x5F20;&#x624B;&#x5199;&#x6570;&#x5B57;&#x56FE;&#x7247;&#xFF0C;&#x6570;&#x636E;&#x96C6;&#x88AB;&#x5206;&#x4E3A;&#x8BAD;&#x7EC3;&#x96C6;&#x3001;&#x6D4B;&#x8BD5;&#x96C6;&#x548C;&#x9A8C;&#x8BC1;&#x96C6;&#x4E09;&#x90E8;&#x5206;&#x3002;</p>
<pre><code class="language-python">print(&quot;&#x6570;&#x636E;&#x96C6;&#x5927;&#x5C0F;&#xFF1A;&quot;)
print(&apos;- &#x8BAD;&#x7EC3;&#x96C6;&#xFF1A;{}&apos;.format(len(data.train.labels)))
print(&apos;- &#x6D4B;&#x8BD5;&#x96C6;&#xFF1A;{}&apos;.format(len(data.test.labels)))
print(&apos;- &#x9A8C;&#x8BC1;&#x96C6;&#xFF1A;{}&apos;.format(len(data.validation.labels)))
</code></pre>
<pre><code class="language-python">&#x6570;&#x636E;&#x96C6;&#x5927;&#x5C0F;&#xFF1A;
- &#x8BAD;&#x7EC3;&#x96C6;&#xFF1A;55000
- &#x6D4B;&#x8BD5;&#x96C6;&#xFF1A;10000
- &#x9A8C;&#x8BC1;&#x96C6;&#xFF1A;5000
</code></pre>
<h4 id="onehot">One-hot &#x7F16;&#x7801;</h4>
<p>&#x6BCF;&#x4E00;&#x5F20;&#x56FE;&#x7684;&#x6807;&#x7B7E;&#x4F7F;&#x7528;&#x4E86; <code>one-hot</code> &#x7F16;&#x7801;&#x4FDD;&#x5B58;&#x5728; numpy &#x77E9;&#x9635;&#x4E2D;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x539F;&#x672C;&#x7684;&#x7C7B;&#x522B;&#xFF0C;&#x8FD9;&#x662F;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x5904;&#x7406;&#x3002;</p>
<pre><code class="language-python">print(data.test.labels[:5])
</code></pre>
<pre><code class="language-python">[[ 0.  0.  0.  0.  0.  0.  0.  1.  0.  0.]
 [ 0.  0.  1.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  1.  0.  0.  0.  0.  0.]]
</code></pre>
<p>&#x5728; <code>one-hot</code> &#x7F16;&#x7801;&#x4E2D;&#xFF0C;&#x53EA;&#x6709;&#x5BF9;&#x5E94;&#x7C7B;&#x522B;&#x7684;&#x90A3;&#x4E2A;&#x4F4D;&#x7F6E;&#x4E3A; 1&#xFF0C;&#x5176;&#x4F59;&#x90FD;&#x4E3A; 0&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x5C06;&#x5176;&#x8F6C;&#x6362;&#x4E3A;&#x771F;&#x5B9E;&#x7C7B;&#x522B;&#xFF1A;</p>
<pre><code class="language-python">data.test.cls = np.argmax(data.test.labels, axis=1)
print(data.test.cls[:5])
</code></pre>
<pre><code class="language-python">[7 2 1 0 4]
</code></pre>
<h4 id>&#x6570;&#x636E;&#x7EF4;&#x5EA6;</h4>
<p>&#x5728; MNIST &#x6570;&#x636E;&#x96C6;&#x4E2D;&#xFF0C;&#x539F;&#x59CB;&#x7684; 28*28 &#x50CF;&#x7D20;&#x7684;&#x9ED1;&#x767D;&#x56FE;&#x7247;&#x88AB;&#x5C55;&#x5E73;&#x4E3A; 784 &#x7EF4;&#x7684;&#x5411;&#x91CF;&#x3002;</p>
<pre><code class="language-python">print(&quot;&#x6837;&#x672C;&#x7EF4;&#x5EA6;&#xFF1A;&quot;, data.train.images.shape)
print(&quot;&#x6807;&#x7B7E;&#x7EF4;&#x5EA6;&#xFF1A;&quot;, data.train.labels.shape)
</code></pre>
<pre><code class="language-python">&#x6837;&#x672C;&#x7EF4;&#x5EA6;&#xFF1A; (55000, 784)
&#x6807;&#x7B7E;&#x7EF4;&#x5EA6;&#xFF1A; (55000, 10)
</code></pre>
<p>&#x4E3A;&#x4F7F;&#x5F97;&#x7F51;&#x7EDC;&#x7ED3;&#x6784;&#x66F4;&#x52A0;&#x6E05;&#x6670;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x5BF9;&#x8FD9;&#x4E9B;&#x56FA;&#x5B9A;&#x7EF4;&#x5EA6;&#x505A;&#x5982;&#x4E0B;&#x5B9A;&#x4E49;&#xFF1A;</p>
<pre><code class="language-python">img_size = 28                        # &#x56FE;&#x7247;&#x7684;&#x9AD8;&#x5EA6;&#x548C;&#x5BBD;&#x5EA6;
img_size_flat = img_size * img_size  # &#x5C55;&#x5E73;&#x4E3A;&#x5411;&#x91CF;&#x7684;&#x5C3A;&#x5BF8;
img_shape = (img_size, img_size)     # &#x56FE;&#x7247;&#x7684;&#x4E8C;&#x7EF4;&#x5C3A;&#x5BF8;

num_classes = 10                     # &#x7C7B;&#x522B;&#x6570;&#x76EE;
</code></pre>
<h4 id>&#x6253;&#x5370;&#x90E8;&#x5206;&#x6837;&#x4F8B;&#x56FE;&#x7247;</h4>
<pre><code class="language-python">def plot_images(images, cls_true, cls_pred=None):
    &quot;&quot;&quot;
    &#x7ED8;&#x5236;&#x56FE;&#x50CF;&#xFF0C;&#x8F93;&#x51FA;&#x771F;&#x5B9E;&#x6807;&#x7B7E;&#x4E0E;&#x9884;&#x6D4B;&#x6807;&#x7B7E;
    images:   &#x56FE;&#x50CF;&#xFF08;9&#x5F20;&#xFF09;
    cls_true: &#x771F;&#x5B9E;&#x7C7B;&#x522B;
    cls_pred: &#x9884;&#x6D4B;&#x7C7B;&#x522B;
    &quot;&quot;&quot;
    assert len(images) == len(cls_true) == 9   # &#x4FDD;&#x8BC1;&#x5B58;&#x5728;9&#x5F20;&#x56FE;&#x7247;

    fig, axes = plt.subplots(3, 3)   # &#x521B;&#x5EFA;3x3&#x4E2A;&#x5B50;&#x56FE;&#x7684;&#x753B;&#x5E03;
    fig.subplots_adjust(hspace=0.3, wspace=0.3)  # &#x8C03;&#x6574;&#x6BCF;&#x5F20;&#x56FE;&#x4E4B;&#x95F4;&#x7684;&#x95F4;&#x9694;

    for i, ax in enumerate(axes.flat):
        # &#x7ED8;&#x56FE;&#xFF0C;&#x5C06;&#x4E00;&#x7EF4;&#x5411;&#x91CF;&#x53D8;&#x4E3A;&#x4E8C;&#x7EF4;&#x77E9;&#x9635;&#xFF0C;&#x9ED1;&#x767D;&#x4E8C;&#x503C;&#x56FE;&#x50CF;&#x4F7F;&#x7528; binary
        ax.imshow(images[i].reshape(img_shape), cmap=&apos;binary&apos;)

        if cls_pred is None:  # &#x5982;&#x679C;&#x672A;&#x4F20;&#x5165;&#x9884;&#x6D4B;&#x7C7B;&#x522B;
            xlabel = &quot;True: {0}&quot;.format(cls_true[i])
        else:
            xlabel = &quot;True: {0}, Pred: {1}&quot;.format(cls_true[i], cls_pred[i])
        ax.set_xlabel(xlabel)

        # &#x5220;&#x9664;&#x5750;&#x6807;&#x4FE1;&#x606F;
        ax.set_xticks([])
        ax.set_yticks([])            

# &#x968F;&#x673A;&#x53D6;9&#x5F20;&#x56FE;&#x7247;
indices = np.arange(len(data.test.cls))
np.random.shuffle(indices)
indices = indices[:9]    

images = data.test.images[indices]
cls_true = data.test.cls[indices]

plot_images(images, cls_true)
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-1-1.png" class="kg-image" alt="TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;"></figure>
<!--kg-card-begin: markdown-->
<h3 id="tensorflow">TensorFlow&#x8BA1;&#x7B97;&#x56FE;</h3>
<p>TensorFlow &#x4F7F;&#x7528;&#x8BA1;&#x7B97;&#x56FE;&#x6A21;&#x578B;&#x6765;&#x6784;&#x5EFA;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x3002;&#x5176;&#x4E3B;&#x8981;&#x6D41;&#x7A0B;&#x662F;&#x5148;&#x5EFA;&#x7ACB;&#x597D;&#x6574;&#x4E2A;&#x7F51;&#x7EDC;&#x7684;&#x8BA1;&#x7B97;&#x56FE;&#x6A21;&#x578B;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x5BFC;&#x5165;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x8BA1;&#x7B97;&#x3002;</p>
<p>&#x4E00;&#x4E2A; TensorFlow &#x8BA1;&#x7B97;&#x56FE;&#x5305;&#x542B;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x90E8;&#x5206;&#xFF1A;</p>
<ul>
<li>Placeholder: &#x5360;&#x4F4D;&#x7B26;&#xFF0C;&#x7528;&#x6765;&#x8BFB;&#x53D6;&#x7528;&#x6237;&#x8F93;&#x5165;&#x4E0E;&#x8F93;&#x51FA;&#xFF1B;</li>
<li>Variable: &#x6A21;&#x578B;&#x7684;&#x53D8;&#x91CF;&#xFF0C;&#x4E5F;&#x79F0;&#x4E3A;&#x53C2;&#x6570;&#xFF0C;&#x5728;&#x8BA1;&#x7B97;&#x8FC7;&#x7A0B;&#x4E2D;&#x9010;&#x6B65;&#x4F18;&#x5316;&#xFF1B;</li>
<li>Model: &#x4F7F;&#x7528;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x6A21;&#x578B;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4E00;&#x4E9B;&#x7B80;&#x5355;&#x7684;&#x8BA1;&#x7B97;&#xFF1B;</li>
<li>Cost Function&#xFF1A; &#x4EE3;&#x4EF7;&#x51FD;&#x6570;&#xFF0C;&#x4E5F;&#x79F0;&#x635F;&#x5931;&#x51FD;&#x6570;&#xFF0C;&#x5982;&#x4F55;&#x8BA1;&#x7B97;&#x6A21;&#x578B;&#x7684;&#x8BEF;&#x5DEE;&#xFF1B;</li>
<li>Optimizer&#xFF1A; &#x4F18;&#x5316;&#x5668;&#xFF0C;&#x4F7F;&#x7528;&#x54EA;&#x79CD;&#x4F18;&#x5316;&#x7B56;&#x7565;&#x6765;&#x964D;&#x4F4E;&#x635F;&#x5931;&#x3002;</li>
</ul>
<!-- -->
<h4 id="placeholder">Placeholder &#x5360;&#x4F4D;&#x7B26;</h4>
<p>&#x5360;&#x4F4D;&#x7B26;&#x4E3A;&#x8F93;&#x5165;&#x4E0E;&#x8F93;&#x51FA;&#x5360;&#x636E;&#x4F4D;&#x7F6E;&#xFF0C;&#x8FD9;&#x5199;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x4E00;&#x822C;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x8F6E;&#x6B21;&#x90FD;&#x4F1A;&#x6709;&#x6240;&#x53D8;&#x5316;&#x3002;&#x7531;&#x4E8E; TensorFlow &#x5148;&#x6784;&#x56FE;&#x518D;&#x8BA1;&#x7B97;&#xFF0C;&#x6240;&#x4EE5;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x5360;&#x4F4D;&#x7B26;&#x4E3A;&#x8F93;&#x5165;&#x548C;&#x8F93;&#x51FA;&#x9884;&#x7559;&#x4F4D;&#x7F6E;&#x3002;</p>
<pre><code class="language-python">x = tf.placeholder(tf.float32, shape=[None, img_size_flat])
y_true = tf.placeholder(tf.float32, shape=[None, num_classes])
y_true_cls = tf.placeholder(tf.int64, shape=[None])
</code></pre>
<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;<code>None</code> &#x8868;&#x793A;&#x4E00;&#x6B21;&#x8F93;&#x5165;&#x591A;&#x5C11;&#x6570;&#x636E;&#xFF0C;&#x8FD9;&#x4E00;&#x822C;&#x8DDF;&#x6837;&#x672C;&#x7684;&#x6570;&#x91CF;&#x548C;&#x6BCF;&#x4E2A;&#x6279;&#x6B21;&#x7684;&#x6570;&#x636E;&#x91CF; <code>batch_size</code> &#x6709;&#x5173;&#x3002;</p>
<h4 id="variable">Variable &#x53D8;&#x91CF;</h4>
<p>&#x53D8;&#x91CF;&#x662F;&#x6A21;&#x578B;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x8FD9;&#x4E9B;&#x53C2;&#x6570;&#x5728;&#x6A21;&#x578B;&#x7684;&#x8BA1;&#x7B97;&#x8FC7;&#x7A0B;&#x4E2D;&#x4F1A;&#x88AB;&#x9010;&#x6B65;&#x7684;&#x4F18;&#x5316;&#xFF0C;&#x4EE5;&#x4F7F;&#x5F97;&#x6A21;&#x578B;&#x5728;&#x8BAD;&#x7EC3;&#x96C6;&#x4E0A;&#x6709;&#x66F4;&#x597D;&#x7684;&#x8868;&#x73B0;&#x3002;&#x4F8B;&#x5982;&#x5728;&#x672C;&#x6587;&#x7684;&#x7EBF;&#x6027;&#x6A21;&#x578B;&#x4E2D;&#xFF0C;&#x53C2;&#x6570;&#x6709;&#x4E24;&#x4E2A;&#xFF1A;</p>
<p>$$<br></p>
<p>y = Wx+b<br></p>
<p>$$</p>
<p>&#x5176;&#x4E2D;&#x7684; $W$ &#x5C31;&#x662F;&#x6A21;&#x578B;&#x7684;&#x6743;&#x91CD;&#xFF0C;$b$ &#x5C31;&#x662F;&#x6A21;&#x578B;&#x7684;&#x504F;&#x79FB;&#x91CF;&#xFF0C;&#x8FD9;&#x4E24;&#x4E2A;&#x53D8;&#x91CF;&#x4F1A;&#x5728;&#x8BA1;&#x7B97;&#x8FC7;&#x7A0B;&#x4E2D;&#x88AB;&#x4F18;&#x5316;&#x3002;</p>
<pre><code class="language-python">weights = tf.Variable(tf.zeros([img_size_flat, num_classes]))
biases = tf.Variable(tf.zeros([num_classes]))
</code></pre>
<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x8F93;&#x5165;&#x7684;&#x662F; 784 &#x7EF4;&#x7684;&#x5411;&#x91CF;&#xFF0C;&#x8F93;&#x51FA;&#x7684;&#x6807;&#x7B7E;&#x662F; 10 &#x7EF4;&#x7684;&#x5411;&#x91CF;&#xFF0C;$W$ &#x662F;&#x8F93;&#x5165;&#x5230;&#x8F93;&#x51FA;&#x7684;&#x6620;&#x5C04;&#xFF0C;&#x56E0;&#x6B64;&#x5B83;&#x7684;&#x7EF4;&#x5EA6;&#x4E3A; <code>[784, 10]</code>&#xFF0C;&#x800C; $b$ &#x662F;&#x504F;&#x79FB;&#x91CF;&#xFF0C;&#x56E0;&#x6B64;&#x7EF4;&#x5EA6;&#x4E3A; <code>[10]</code>&#x3002;&#x6211;&#x4EEC;&#x9996;&#x5148;&#x5C06;&#x5B83;&#x4EEC;&#x521D;&#x59CB;&#x5316;&#x4E3A; 0&#xFF0C;TensorFlow &#x4F1A;&#x81EA;&#x52A8;&#x8FDB;&#x884C;&#x8C03;&#x6574;&#x3002;</p>
<h4 id="model">Model &#x6A21;&#x578B;</h4>
<p>&#x4E0A;&#x9762;&#x7ED9;&#x51FA;&#x4E86;&#x6574;&#x4E2A;&#x6A21;&#x578B;&#x7684;&#x516C;&#x5F0F;&#xFF0C;&#x56E0;&#x6B64;&#x5B9E;&#x73B0;&#x8D77;&#x6765;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF1A;</p>
<pre><code class="language-python">logits = tf.matmul(x, weights) + biases
</code></pre>
<p><code>tf.matmul</code> &#x8868;&#x793A;&#x77E9;&#x9635;&#x4E58;&#x6CD5;&#x3002;&#x4E0A;&#x5F0F;&#x8FD4;&#x56DE;&#x7684;&#x7ED3;&#x679C;&#x662F;&#x4E00;&#x4E2A; <code>[None, num_classes]</code> &#x7684;&#x77E9;&#x9635;&#x3002; <code>logits</code> &#x662F; TensorFlow &#x5E38;&#x7528;&#x672F;&#x8BED;&#xFF0C;&#x8FD9;&#x91CC;&#x4E0D;&#x53BB;&#x8003;&#x8651;&#x3002;&#x8FD9;&#x4E2A;&#x7ED3;&#x679C;&#x79BB;&#x771F;&#x5B9E;&#x7684;&#x5206;&#x7C7B;&#x8FD8;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x8DDD;&#x79BB;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x4E00;&#x4E2A; softmax &#x6765;&#x5BF9;&#x5176;&#x5F52;&#x4E00;&#x5316;&#xFF0C;&#x4EE5;&#x4F7F;&#x5F97;&#x5B83;&#x7684;&#x548C;&#x4E3A; 1&#x3002;Softmax &#x51FD;&#x6570;&#x7C7B;&#x4F3C;&#x4E8E;&#x8BA1;&#x7B97;&#x4E86;&#x6BCF;&#x4E00;&#x4E2A;&#x7EF4;&#x5EA6;&#x7684;&#x6982;&#x7387;&#xFF0C;&#x5176;&#x4E2D;&#x6700;&#x5927;&#x7684;&#x90A3;&#x4E2A;&#x6982;&#x7387;&#x5373;&#x5BF9;&#x5E94;&#x5B83;&#x7684;&#x7C7B;&#x522B;&#x3002;</p>
<pre><code class="language-python">y_pred = tf.nn.softmax(logits)
y_pred_cls = tf.argmax(y_pred, axis=1)
</code></pre>
<p>y_pred_cls &#x7684;&#x8BA1;&#x7B97;&#x4E0E;&#x4E4B;&#x524D;&#x4F7F;&#x7528; Numpy &#x8BA1;&#x7B97;&#x7C7B;&#x522B;&#x7684;&#x65B9;&#x5F0F;&#x76F8;&#x4F3C;&#xFF0C;&#x8BF4;&#x660E; TensorFlow &#x7684;&#x8BB8;&#x591A;&#x64CD;&#x4F5C;&#x90FD;&#x548C; Numpy &#x662F;&#x76F8;&#x901A;&#x7684;&#x3002;&#x4E0D;&#x540C;&#x7684;&#x662F; Numpy &#x7684;&#x8BA1;&#x7B97;&#x662F;&#x5B9E;&#x65F6;&#x7684;&#xFF0C;&#x800C; TensorFlow &#x53EA;&#x6709;&#x5728;&#x8FD0;&#x884C;&#x8BA1;&#x7B97;&#x56FE;&#x65F6;&#x624D;&#x4F1A;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x3002;</p>
<h4 id="costfunction">Cost Function &#x4EE3;&#x4EF7;&#x51FD;&#x6570;</h4>
<p>&#x4EE3;&#x4EF7;&#x51FD;&#x6570;&#x7528;&#x6765;&#x8BC4;&#x4F30;&#x6A21;&#x578B;&#x7684;&#x9519;&#x8BEF;&#x7387;&#x3002;&#x6A21;&#x578B;&#x7684;&#x635F;&#x5931;&#x8D8A;&#x9AD8;&#xFF0C;&#x8BF4;&#x660E;&#x79BB;&#x771F;&#x5B9E;&#x7ED3;&#x679C;&#x7684;&#x504F;&#x5DEE;&#x8D8A;&#x5927;&#xFF0C;&#x9700;&#x8981;&#x5C3D;&#x53EF;&#x80FD;&#x7684;&#x51CF;&#x5C0F;&#x8FD9;&#x4E2A;&#x635F;&#x5931;&#xFF0C;&#x4EE5;&#x4F7F;&#x5F97;&#x6A21;&#x578B;&#x5C3D;&#x53EF;&#x80FD;&#x7684;&#x51C6;&#x786E;&#x3002;</p>
<p>&#x4EE3;&#x4EF7;&#x51FD;&#x6570;&#x5B58;&#x5728;&#x591A;&#x79CD;&#x7684;&#x5F62;&#x5F0F;&#xFF0C;&#x6BD4;&#x8F83;&#x5E38;&#x7528;&#x7684;&#x662F;&#x5E73;&#x65B9;&#x8BEF;&#x5DEE;&#x548C;&#x4EA4;&#x53C9;&#x71B5;&#x3002;&#x5728;&#x8FD9;&#x91CC;&#x4F7F;&#x7528;&#x66F4;&#x5E38;&#x7528;&#x7684;&#x4EA4;&#x53C9;&#x71B5;&#xFF0C;&#x6709;&#x5173;&#x4EA4;&#x53C9;&#x71B5;&#x7684;&#x7EC6;&#x8282;&#x8BF7;&#x53E6;&#x5916;&#x67E5;&#x9605;&#x8D44;&#x6599;&#x3002;</p>
<pre><code class="language-python">cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_true)
cost = tf.reduce_mean(cross_entropy)    # &#x4EA4;&#x53C9;&#x71B5;&#x5E73;&#x5747;&#x503C;&#x5373;&#x4EE3;&#x4EF7;
</code></pre>
<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x4F20;&#x5165;&#x7684;&#x662F;&#x8BA1;&#x7B97; softmx &#x4E4B;&#x524D;&#x7684; <code>logits</code>&#xFF0C;&#x800C;&#x975E; <code>y_pred</code>&#xFF0C;&#x8FD9;&#x5176;&#x4E2D;&#x7684;&#x539F;&#x56E0;&#x662F; softmax &#x7684;&#x8BA1;&#x7B97;&#x5341;&#x5206;&#x8017;&#x65F6;&#xFF0C;&#x5904;&#x4E8E;&#x901F;&#x5EA6;&#x7684;&#x8003;&#x8651;&#xFF0C;TensorFlow &#x5728;&#x5B9E;&#x73B0;&#x4E2D;&#x76F4;&#x63A5;&#x4F7F;&#x7528; logits&#xFF0C;&#x7136;&#x540E;&#x5728; <code>tf.nn.softmax_cross_entropy_with_logits</code> &#x5185;&#x90E8;&#x4F7F;&#x7528;&#x66F4;&#x9AD8;&#x6548;&#x7684;&#x65B9;&#x6CD5;&#x8BA1;&#x7B97;&#x4EA4;&#x53C9;&#x71B5;&#xFF0C;&#x5177;&#x4F53;&#x7684;&#x539F;&#x7406;&#x4ECD;&#x7136;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;</p>
<p>&#x5728;&#x8BA1;&#x7B97;&#x5B8C;&#x603B;&#x7684;&#x4EA4;&#x53C9;&#x71B5;&#x662F;&#xFF0C;&#x5176;&#x5747;&#x503C;&#x5373;&#x4E3A;&#x4EE3;&#x4EF7;&#x3002;</p>
<h4 id="optimization">Optimization &#x4F18;&#x5316;</h4>
<p>&#x73B0;&#x5728;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x6709;&#x4E86;&#x4EE3;&#x4EF7;&#x51FD;&#x6570;&#x7684;&#x5EA6;&#x91CF;&#x65B9;&#x6CD5;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x5C31;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x4F18;&#x5316;&#x5668;&#x6765;&#x4F18;&#x5316;&#x8FD9;&#x4E2A;&#x4EE3;&#x4EF7;&#x51FD;&#x6570;&#x3002;&#x5E38;&#x7528;&#x7684;&#x505A;&#x6CD5;&#x662F;&#x4F7F;&#x7528;&#x63D0;&#x7763;&#x4E0B;&#x964D;&#x5C06;&#x6765;&#x4F20;&#x64AD;&#x8BEF;&#x5DEE;&#xFF0C;&#x7136;&#x540E;&#x5728;&#x66F4;&#x65B0;&#x6743;&#x91CD;&#x3002;TensorFlow &#x63D0;&#x4F9B;&#x4E86;&#x591A;&#x79CD;&#x8BA1;&#x7B97;&#x68AF;&#x5EA6;&#x7684; <a href="https://www.tensorflow.org/api_guides/python/train#Optimizers">&#x4F18;&#x5316;&#x5668;</a>&#xFF0C;&#x5982;&#x679C;&#x5728;&#x4E00;&#x4E2A;&#x4F18;&#x5316;&#x5668;&#x7684;&#x6548;&#x679C;&#x4E0D;&#x660E;&#x663E;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x4F7F;&#x7528;&#x53E6;&#x4E00;&#x4E2A;&#x4F18;&#x5316;&#x5668;&#x3002;&#x8FD9;&#x91CC;&#x4F7F;&#x7528;&#x57FA;&#x672C;&#x7684; <code>GradientDescentOptimizer</code>&#xFF0C;&#x5B66;&#x4E60;&#x7387;&#x4E3A; 0.5&#xFF0C;&#x5B66;&#x4E60;&#x7387;&#x8D8A;&#x4F4E;&#x6536;&#x655B;&#x8D8A;&#x5FEB;&#xFF0C;&#x5B66;&#x4E60;&#x7387;&#x8FC7;&#x9AD8;&#x53EF;&#x80FD;&#x4F1A;&#x5BFC;&#x81F4;&#x4E0D;&#x6536;&#x655B;&#x3002;</p>
<pre><code class="language-python">optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.5).minimize(cost)
</code></pre>
<h4 id>&#x6027;&#x80FD;&#x5EA6;&#x91CF;</h4>
<p>&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;&#x4EE5;&#x4E0A;&#x7684;&#x4EE3;&#x7801;&#x5C31;&#x5DF2;&#x7ECF;&#x5B8C;&#x6210;&#x4E86;&#x6A21;&#x578B;&#x7684;&#x6784;&#x5EFA;&#x3002;&#x4F46;&#x662F;&#x4E3A;&#x4E86;&#x8BC4;&#x4F30;&#x6A21;&#x578B;&#x7684;&#x6027;&#x80FD;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x4E00;&#x4E9B;&#x5176;&#x4ED6;&#x7684;&#x4EE3;&#x7801;&#x3002;&#x6700;&#x76F4;&#x89C2;&#x7684;&#x662F;&#x6A21;&#x578B;&#x7684;&#x51C6;&#x786E;&#x7387;&#x3002;</p>
<pre><code class="language-python">correct_prediction = tf.equal(y_pred_cls, y_true_cls)  # &#x5224;&#x65AD;&#x76F8;&#x7B49;&#x7684;&#x5143;&#x7D20;
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  # &#x8BA1;&#x7B97;&#x51C6;&#x786E;&#x7387;
</code></pre>
<h3 id="tensorflow">&#x8FD0;&#x884C;TensorFlow&#x8BA1;&#x7B97;&#x56FE;</h3>
<h4 id="session">&#x521B;&#x5EFA;Session&#x4EE5;&#x53CA;&#x53D8;&#x91CF;&#x521D;&#x59CB;&#x5316;</h4>
<p>TensorFlow &#x8BA1;&#x7B97;&#x56FE;&#x8FD0;&#x884C;&#x5728;&#x4E00;&#x4E2A; session &#x4E2D;&#xFF0C;&#x8BA1;&#x7B97;&#x4E4B;&#x524D;&#x9700;&#x8981;&#x5148;&#x521B;&#x5EFA;&#x8FD9;&#x4E2A; session&#xFF0C;&#x5E76;&#x521D;&#x59CB;&#x5316;&#x5176;&#x4E2D;&#x7684;&#x4E00;&#x4E9B;&#x53D8;&#x91CF;&#xFF08;w &#x548C; b&#xFF09;&#xFF0C;TensorFlow &#x4F7F;&#x7528; <code>session.run()</code> &#x6765;&#x8FD0;&#x884C;&#x8BA1;&#x7B97;&#x56FE;&#x3002;</p>
<pre><code class="language-python">session = tf.Session()   # &#x521B;&#x5EFA;session
session.run(tf.global_variables_initializer())   # &#x53D8;&#x91CF;&#x521D;&#x59CB;&#x5316;
</code></pre>
<h4 id>&#x6267;&#x884C;&#x4F18;&#x5316;&#x7684;&#x5E2E;&#x52A9;&#x51FD;&#x6570;</h4>
<p>&#x5728;&#x8BAD;&#x7EC3;&#x96C6;&#x4E2D;&#x6709; 55000 &#x5F20;&#x56FE;&#x7247;&#xFF0C;&#x5982;&#x679C;&#x5728;&#x6BCF;&#x4E00;&#x8F6E;&#x8FED;&#x4EE3;&#x8FC7;&#x7A0B;&#x4E2D;&#x90FD;&#x4F7F;&#x7528;&#x5168;&#x90E8;&#x7684;&#x56FE;&#x50CF;&#x4F5C;&#x4E3A;&#x8F93;&#x5165;&#x7684;&#x8BDD;&#xFF0C;&#x8BA1;&#x7B97;&#x65F6;&#x95F4;&#x592A;&#x957F;&#x3002;&#x56E0;&#x6B64;&#x4F7F;&#x7528;&#x5C0F;&#x6279;&#x91CF;&#x7684;&#x968F;&#x5373;&#x68AF;&#x5EA6;&#x4E0B;&#x964D;&#x65B9;&#x6CD5;&#x6765;&#x6267;&#x884C;&#x6BCF;&#x4E00;&#x6B21;&#x4F18;&#x5316;&#x3002;&#x68AF;&#x5EA6;&#x4E0B;&#x964D;&#x8FC7;&#x7A0B;&#x4F1A;&#x81EA;&#x52A8;&#x7684;&#x4F18;&#x5316;&#x6743;&#x91CD; $W$ &#x548C;&#x504F;&#x7F6E; $b$&#x3002;</p>
<pre><code class="language-python">batch_size = 100   # &#x6BCF;&#x4E00;&#x8F6E;&#x7684;&#x6570;&#x636E;&#x91CF;
def optimize(num_iterations):   
    for i in range(num_iterations):   # &#x8FED;&#x4EE3;&#x8F6E;&#x6570;
        # TensorFlow&#x81EA;&#x5DF1;&#x5B9E;&#x73B0;&#x4E86;&#x53D6;MNIST&#x4E0B;&#x4E00;&#x4E2A;&#x6279;&#x6B21;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x8FD9;&#x91CC;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#xFF0C;&#x4E0D;&#x5FC5;&#x6DF1;&#x7A76;
        x_batch, y_true_batch = data.train.next_batch(batch_size)

        # &#x628A;&#x8FD9;&#x6279;&#x6570;&#x636E;&#x653E;&#x5728;&#x8981;&#x5582;&#x5165;&#x6A21;&#x578B;&#x7684;dict&#x91CC;&#x9762;
        feed_dict_train = {x: x_batch, y_true: y_true_batch}

        # &#x8FD0;&#x884C;&#x4F18;&#x5316;&#x5668;&#xFF0C;&#x5582;&#x5165;&#x6570;&#x636E;
        session.run(optimizer, feed_dict=feed_dict_train)
</code></pre>
<h4 id>&#x8BC4;&#x4F30;&#x6027;&#x80FD;&#x7684;&#x5E2E;&#x52A9;&#x51FD;&#x6570;</h4>
<p>&#x73B0;&#x5728;&#x9700;&#x8981;&#x8BC4;&#x4F30;&#x6A21;&#x578B;&#x5728;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#x4E0A;&#x7684;&#x6027;&#x80FD;&#xFF0C;&#x9700;&#x8981;&#x5C06;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#x6574;&#x4E2A;&#x5582;&#x5165;&#x6A21;&#x578B;&#x4E2D;&#xFF1A;</p>
<pre><code class="language-python">feed_dict_test = {x: data.test.images,
                  y_true: data.test.labels,
                  y_true_cls: data.test.cls}
</code></pre>
<p>&#x8F93;&#x51FA;&#x51C6;&#x786E;&#x7387;&#xFF1A;</p>
<pre><code class="language-python">def print_accuracy():
    # &#x8FD0;&#x884C;accuracy&#x6765;&#x8BA1;&#x7B97;acc
    acc = session.run(accuracy, feed_dict=feed_dict_test)
    print(&quot;&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: {0:.1%}&quot;.format(acc))   # &#x4FDD;&#x7559;1&#x4F4D;&#x5C0F;&#x6570;
</code></pre>
<p>&#x8F93;&#x51FA;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#xFF1A;</p>
<pre><code class="language-python">def print_confusion_matrix():
    cls_true = data.test.cls   # &#x771F;&#x5B9E;&#x7C7B;&#x522B;
    # &#x8FD0;&#x884C;y_pred_cls&#x8BA1;&#x7B97;&#x51FA;&#x7684;&#x771F;&#x5B9E;&#x7C7B;&#x522B;
    cls_pred = session.run(y_pred_cls, feed_dict=feed_dict_test)

    # &#x4F7F;&#x7528;scikit-learn&#x7684;confusion_matrix&#x6765;&#x8BA1;&#x7B97;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;
    cm = confusion_matrix(y_true=cls_true, y_pred=cls_pred)

    # &#x6253;&#x5370;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;
    print(cm)

    # &#x5C06;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#x8F93;&#x51FA;&#x4E3A;&#x56FE;&#x50CF;
    plt.imshow(cm, interpolation=&apos;nearest&apos;, cmap=plt.cm.Blues)

    # &#x8C03;&#x6574;&#x56FE;&#x50CF;
    plt.tight_layout()
    plt.colorbar()
    tick_marks = np.arange(num_classes)
    plt.xticks(tick_marks, range(num_classes))
    plt.yticks(tick_marks, range(num_classes))
    plt.xlabel(&apos;Predicted&apos;)
    plt.ylabel(&apos;True&apos;)
</code></pre>
<p>&#x8F93;&#x51FA;&#x90E8;&#x5206;&#x9519;&#x8BEF;&#x6837;&#x4F8B;</p>
<pre><code class="language-python">def plot_example_errors():
    # &#x8FD0;&#x884C;&#x8BA1;&#x7B97;&#x56FE;&#xFF0C;&#x5F97;&#x5230;&#x4E89;&#x53D6;&#x60C5;&#x51B5;&#x548C;&#x9884;&#x6D4B;&#x7ED3;&#x679C;
    correct, cls_pred = session.run([correct_prediction, y_pred_cls],
                                    feed_dict=feed_dict_test)
    # &#x8BA1;&#x7B97;&#x9519;&#x8BEF;&#x60C5;&#x51B5;
    incorrect = (correct == False)
    images = data.test.images[incorrect]
    cls_pred = cls_pred[incorrect]
    cls_true = data.test.cls[incorrect]

    # &#x968F;&#x673A;&#x6311;&#x9009;9&#x4E2A;
    indices = np.arange(len(images))
    np.random.shuffle(indices)
    indices = indices[:9]

    plot_images(images[indices], cls_true[indices], cls_pred[indices])
</code></pre>
<h4 id>&#x4F18;&#x5316;&#x524D;&#x7684;&#x6027;&#x80FD;</h4>
<p>&#x51C6;&#x786E;&#x7387;&#xFF1A;</p>
<pre><code class="language-python">print_accuracy()
</code></pre>
<p>&#x8F93;&#x51FA;&#xFF1A;</p>
<pre><code>&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 9.8%
</code></pre>
<p>&#x5728;&#x672A;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#x662F;&#xFF0C;&#x6D4B;&#x8BD5;&#x96C6;&#x7684;&#x51C6;&#x786E;&#x7387;&#x4E3A; 9.8%&#xFF0C;&#x56E0;&#x4E3A; $W$ &#x548C; $b$ &#x5168;&#x90FD;&#x88AB;&#x521D;&#x59CB;&#x5316;&#x4E3A; 0&#xFF0C;&#x56E0;&#x6B64;&#x6240;&#x6709;&#x7684;&#x9884;&#x6D4B;&#x7ED3;&#x679C;&#x5747;&#x4E3A; 0&#x3002;</p>
<p>&#x90E8;&#x5206;&#x9519;&#x8BEF;&#x6837;&#x4F8B;&#xFF1A;</p>
<pre><code class="language-python">plot_example_errors()
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-1-2.png" class="kg-image" alt="TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x8FD9;&#x4E5F;&#x8BC1;&#x660E;&#x4E86;&#x4E0A;&#x9762;&#x7684;&#x8BF4;&#x6CD5;&#x3002;</p>
<h4 id>&#x4E00;&#x8F6E;&#x8FED;&#x4EE3;&#x540E;&#x7684;&#x6027;&#x80FD;</h4>
<pre><code class="language-python">optimize(num_iterations=1)
print_accuracy()
</code></pre>
<pre><code>&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 26.7%
</code></pre>
<p>&#x5C1D;&#x8BD5;&#x4E00;&#x8F6E;&#x8FED;&#x4EE3;&#x540E;&#xFF0C;&#x51C6;&#x786E;&#x7387;&#x63D0;&#x5347;&#x5230;&#x4E86; 26.7%&#x3002;</p>
<pre><code class="language-python">plot_example_errors()
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-1-3.png" class="kg-image" alt="TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x9884;&#x6D4B;&#x7ED3;&#x679C;&#x4E5F;&#x6709;&#x4E86;&#x4E00;&#x5B9A;&#x7684;&#x53D8;&#x5316;&#x3002;</p>
<p>&#x6700;&#x91CD;&#x8981;&#x7684;&#x662F;&#x5404;&#x4E2A;&#x7C7B;&#x522B;&#x7684;&#x6743;&#x91CD;&#x60C5;&#x51B5;&#xFF1A;</p>
<pre><code class="language-python">plot_weights()
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-1-4.png" class="kg-image" alt="TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x5728;&#x4E0A;&#x56FE;&#x4E2D;&#xFF0C;&#x84DD;&#x8272;&#x90E8;&#x5206;&#x7684;&#x6743;&#x91CD;&#x4E3A;&#x8D1F;&#x6570;&#xFF0C;&#x7EA2;&#x8272;&#x90E8;&#x5206;&#x7684;&#x6743;&#x91CD;&#x4E3A;&#x6B63;&#x6570;&#xFF0C;&#x8FD9;&#x4E9B;&#x6743;&#x91CD;&#x53EF;&#x4EE5;&#x770B;&#x4F5C;&#x56FE;&#x7247;&#x7684;&#x8FC7;&#x6EE4;&#x5668;&#x3002;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x6A21;&#x578B;&#x7684;&#x6743;&#x91CD;&#x504F;&#x5411;&#x4E8E;&#x6570;&#x5B57;&#x6240;&#x5728;&#x7684;&#x4F4D;&#x7F6E;&#x3002;&#x5BF9;&#x4E8E; 0 &#x548C; 1&#xFF0C;&#x7531;&#x4E8E;&#x6570;&#x5B57;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#xFF0C;&#x6A21;&#x578B;&#x53EF;&#x4EE5;&#x5F88;&#x597D;&#x7684;&#x8BC6;&#x522B;&#xFF0C;&#x800C;&#x5BF9;&#x4E8E;&#x5176;&#x4ED6;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x6A21;&#x578B;&#x5728;&#x8BC6;&#x522B;&#x4E0A;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x96BE;&#x5EA6;&#xFF0C;&#x9700;&#x8981;&#x66F4;&#x591A;&#x6B21;&#x7684;&#x4F18;&#x5316;&#x3002;</p>
<h4 id="10">10&#x8F6E;&#x8FED;&#x4EE3;&#x540E;&#x7684;&#x6027;&#x80FD;</h4>
<pre><code class="language-python">optimize(num_iterations=9)   # &#x4E4B;&#x524D;&#x5DF2;&#x7ECF;&#x505A;&#x8FC7;&#x4E00;&#x8F6E;
print_accuracy()
</code></pre>
<pre><code class="language-python">&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 81.0%
</code></pre>
<p>&#x6D4B;&#x8BD5;&#x96C6;&#x7684;&#x51C6;&#x786E;&#x7387;&#x8FBE;&#x5230;&#x4E86; 81.0%&#xFF0C;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x975E;&#x5E38;&#x5927;&#x7684;&#x8FDB;&#x6B65;&#x3002;&#x518D;&#x770B;&#x770B;&#x90E8;&#x5206;&#x7684;&#x9519;&#x8BEF;&#x6837;&#x4F8B;&#xFF1A;</p>
<pre><code class="language-python">plot_example_errors()
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-1-5.png" class="kg-image" alt="TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x56FE;&#x7247;&#x7684;&#x9884;&#x6D4B;&#x7ED3;&#x679C;&#x548C;&#x771F;&#x5B9E;&#x7C7B;&#x522B;&#x5B58;&#x5728;&#x4E00;&#x5B9A;&#x7684;&#x76F8;&#x4F3C;&#x4E4B;&#x5904;&#x3002;&#x4F8B;&#x5982; 4 &#x548C; 9&#xFF0C;5 &#x548C; 3&#xFF0C;&#x6A21;&#x578B;&#x6682;&#x65F6;&#x8FD8;&#x65E0;&#x6CD5;&#x4F5C;&#x51FA;&#x51C6;&#x786E;&#x7684;&#x5224;&#x65AD;&#x3002;</p>
<p>&#x63A5;&#x4E0B;&#x6765;&#x518D;&#x770B;&#x770B;&#x6743;&#x91CD;&#x7684;&#x60C5;&#x51B5;&#xFF1A;</p>
<pre><code class="language-python">plot_weights()
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-1-6.png" class="kg-image" alt="TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x6211;&#x4EEC;&#x53D1;&#x73B0;&#xFF0C;&#x56FE;&#x50CF;&#x7684;&#x7EA2;&#x8272;&#x533A;&#x57DF;&#x53D8;&#x5F97;&#x66F4;&#x52A0;&#x660E;&#x663E;&#xFF0C;&#x5B83;&#x4EEC;&#x662F;&#x7C7B;&#x522B;&#x4E2D;&#x6240;&#x6709;&#x56FE;&#x50CF;&#x7684;&#x5171;&#x6709;&#x5C5E;&#x6027;&#x3002;&#x5BF9;&#x4E8E;&#x90E8;&#x5206;&#x7C7B;&#x522B;&#xFF08;&#x5982; 4&#xFF0C;5&#xFF0C;9&#xFF09;&#x8FD8;&#x5B58;&#x5728;&#x4E00;&#x5B9A;&#x7684;&#x63D0;&#x5347;&#x7A7A;&#x95F4;&#x3002;</p>
<h4 id="100">100 &#x8F6E;&#x8FED;&#x4EE3;&#x540E;&#x7684;&#x6027;&#x80FD;</h4>
<pre><code class="language-python">optimize(num_iterations=990)   # &#x4E4B;&#x524D;&#x5DF2;&#x7ECF;&#x505A;&#x8FC7;10&#x8F6E;
print_accuracy()
</code></pre>
<pre><code class="language-python">&#x6D4B;&#x8BD5;&#x96C6;&#x51C6;&#x786E;&#x7387;: 91.9%
</code></pre>
<p>&#x8FD9;&#x4E2A;&#x7ED3;&#x679C;&#x5DF2;&#x7ECF;&#x975E;&#x5E38;&#x597D;&#x4E86;&#x3002;&#x518D;&#x6765;&#x770B;&#x770B;&#x4E00;&#x4E9B;&#x5206;&#x9519;&#x7684;&#x6837;&#x672C;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-1-7.png" class="kg-image" alt="TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x591A;&#x5C1D;&#x8BD5;&#x51E0;&#x6B21;&#x5C31;&#x4F1A;&#x53D1;&#x73B0;&#xFF0C;&#x90E8;&#x5206;&#x7684;&#x6837;&#x672C;&#x662F;&#x5728;&#x592A;&#x8FC7;&#x62BD;&#x8C61;&#xFF0C;4 &#x548C; 6 &#x6709;&#x65F6;&#x5019;&#x751A;&#x81F3;&#x8FDE;&#x4EBA;&#x90FD;&#x5F88;&#x96BE;&#x5206;&#x6E05;&#x3002;&#x56E0;&#x800C;&#x8FD9;&#x6837;&#x7684;&#x4E00;&#x4E2A;&#x7ED3;&#x679C;&#x5E94;&#x8BE5;&#x5408;&#x60C5;&#x5408;&#x7406;&#x3002;</p>
<p>&#x518D;&#x6765;&#x770B;&#x4E00;&#x4E0B;&#x6743;&#x91CD;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-1-8.png" class="kg-image" alt="TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x7531;&#x4E8E;&#x8BAD;&#x7EC3;&#x96C6;&#x7684;&#x53D8;&#x5316;&#x591A;&#x7AEF;&#xFF0C;&#x4E3A;&#x4E86;&#x8986;&#x76D6;&#x591A;&#x79CD;&#x53D8;&#x5316;&#xFF0C;&#x5404;&#x7C7B;&#x7684;&#x6743;&#x91CD;&#x53D8;&#x5F97;&#x6709;&#x4E9B;&#x5BBD;&#x6CDB;&#xFF0C;&#x4F46;&#x662F;&#x7126;&#x70B9;&#x4ECD;&#x7136;&#x5728;&#x7C7B;&#x522B;&#x4E2D;&#x56FE;&#x50CF;&#x7684;&#x5171;&#x540C;&#x4E4B;&#x5904;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x518D;&#x6765;&#x770B;&#x770B;&#x6DF7;&#x6DC6;&#x77E9;&#x9635;&#x7684;&#x60C5;&#x51B5;&#xFF1A;</p>
<pre><code class="language-python">print_confusion_matrix()
</code></pre>
<pre><code class="language-python">[[ 957    0    1    2    0    4   12    2    2    0]
 [   0 1108    2    2    0    3    4    1   15    0]
 [   6    7  922   20    5    3   19   11   32    7]
 [   3    0   16  938    0   21    4    9   13    6]
 [   2    1    6    3  897    1   22    2   10   38]
 [   9    3    6   50    7  762   19    5   24    7]
 [   9    3    3    2    6   12  921    1    1    0]
 [   2   12   24   10    6    2    0  933    2   37]
 [   7    6    7   38    9   32   16    8  844    7]
 [  10    6    1   13   34    8    1   14    9  913]]
</code></pre>
<p>&#x5BF9;&#x89D2;&#x7EBF;&#x4E0A;&#x4E3A;&#x5206;&#x7C7B;&#x6B63;&#x786E;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x5176;&#x4ED6;&#x4E3A;&#x4E00;&#x4E2A;&#x7C7B;&#x5206;&#x6210;&#x5176;&#x4ED6;&#x7C7B;&#x7684;&#x60C5;&#x51B5;&#x3002;&#x5C06;&#x8FD9;&#x4E2A;&#x77E9;&#x9635;&#x56FE;&#x50CF;&#x5316;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/tf-1-9.png" class="kg-image" alt="TensorFlow (1) - &#x7EBF;&#x6027;&#x6A21;&#x578B;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x5927;&#x90E8;&#x5206;&#x7684;&#x5206;&#x7C7B;&#x5747;&#x6B63;&#x786E;&#xFF0C;&#x5C11;&#x90E8;&#x5206;&#x7684;&#x6DE1;&#x84DD;&#x8272;&#x533A;&#x57DF;&#x8BF4;&#x660E;&#x5B58;&#x5728;&#x4E00;&#x5B9A;&#x7684;&#x8BEF;&#x5206;&#x7C7B;&#x60C5;&#x51B5;&#x3002;</p>
<p>&#x5728;&#x8FD0;&#x884C;&#x5B8C;&#x6574;&#x4E2A;&#x8BA1;&#x7B97;&#x56FE;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x5C06;&#x5B83;&#x5173;&#x95ED;&#xFF0C;&#x5426;&#x5219;&#x5C06;&#x4E00;&#x76F4;&#x5360;&#x7528;&#x8D44;&#x6E90;:</p>
<pre><code class="language-python">session.close()
</code></pre>
<!--kg-card-end: markdown-->
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[基于特定语料库的 TF-IDF 关键词提取实现]]></title><description><![CDATA[本文旨在对特定的语料库生成各词的逆文档频率。然后根据TF-IDF算法进行关键词提取。]]></description><link>https://gaussic.com/tf-idf-keyword/</link><guid isPermaLink="false">626173b75d2e434866501f88</guid><category><![CDATA[Python]]></category><category><![CDATA[TF-IDF]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Tue, 08 Aug 2017 09:30:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/business-2042283_1280-1.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/business-2042283_1280-1.jpg" alt="&#x57FA;&#x4E8E;&#x7279;&#x5B9A;&#x8BED;&#x6599;&#x5E93;&#x7684; TF-IDF &#x5173;&#x952E;&#x8BCD;&#x63D0;&#x53D6;&#x5B9E;&#x73B0;"><p>&#x8F6C;&#x8F7D;&#x8BF7;&#x6CE8;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/tf-idf-keyword/">&#x57FA;&#x4E8E;&#x7279;&#x5B9A;&#x8BED;&#x6599;&#x5E93;&#x7684; TF-IDF &#x5173;&#x952E;&#x8BCD;&#x63D0;&#x53D6;&#x5B9E;&#x73B0;</a>&#x3002;</p>
<p>GitHub&#x4EE3;&#x7801;&#xFF1A;<a href="https://github.com/gaussic/tf-idf-keyword">GitHub - gaussic/tf-idf-keyword</a></p>
<h3 id>&#x5206;&#x8BCD;</h3>
<p>&#x5BF9;&#x4E8E;&#x4E2D;&#x6587;&#x6587;&#x672C;&#x7684;&#x5173;&#x952E;&#x8BCD;&#x63D0;&#x53D6;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x8FDB;&#x884C;&#x5206;&#x8BCD;&#x64CD;&#x4F5C;&#x3002;</p>
<p>&#x53BB;&#x9664;&#x5176;&#x4E2D;&#x7684;&#x4E00;&#x4E9B;&#x82F1;&#x6587;&#x548C;&#x6570;&#x5B57;&#xFF0C;&#x53EA;&#x4FDD;&#x7559;&#x4E2D;&#x6587;&#xFF1A;</p>
<pre><code class="language-python">import jieba
import re

def segment(sentence, cut_all=False):
    sentence = sentence.replace(&apos;\n&apos;, &apos;&apos;).replace(&apos;\u3000&apos;, &apos;&apos;).replace(&apos;\u00A0&apos;, &apos;&apos;)
    sentence = &apos; &apos;.join(jieba.cut(sentence, cut_all=cut_all))
    return re.sub(&apos;[a-zA-Z0-9.&#x3002;:&#xFF1A;,&#xFF0C;)&#xFF09;(&#xFF08;&#xFF01;!??&#x201D;&#x201C;\&quot;]&apos;, &apos;&apos;, sentence).split()
</code></pre>
<h3 id>&#x8BED;&#x6599;&#x5E93;&#x9006;&#x6587;&#x6863;&#x9891;&#x7387;&#x7EDF;&#x8BA1;</h3>
<h4 id>&#x9AD8;&#x6548;&#x6587;&#x4EF6;&#x8BFB;&#x53D6;</h4>
<p>&#x8BFB;&#x53D6;&#x6307;&#x5B9A;&#x76EE;&#x5F55;&#x4E0B;&#x7684;&#x6240;&#x6709;&#x6587;&#x672C;&#x6587;&#x4EF6;&#xFF0C;&#x4F7F;&#x7528;&#x7ED3;&#x5DF4;&#x5206;&#x8BCD;&#x5668;&#x8FDB;&#x884C;&#x5206;&#x8BCD;&#x3002;&#x672C;&#x6587;&#x7684; IDF &#x63D0;&#x53D6;&#x57FA;&#x4E8E; THUCNews &#x6E05;&#x534E;&#x65B0;&#x95FB;&#x8BED;&#x6599;&#x5E93;&#x7684;&#x5927;&#x7EA6; 80 &#x4E07;&#x7BC7;&#x6587;&#x672C;&#x3002;<br></p>
<p>&#x57FA;&#x4E8E; python &#x751F;&#x6210;&#x5668;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x9AD8;&#x6548;&#x5730;&#x8BFB;&#x53D6;&#x6587;&#x672C;&#x5E76;&#x5206;&#x8BCD;&#xFF1A;</p>
<pre><code class="language-python">class MyDocuments(object):    # memory efficient data streaming
    def __init__(self, dirname):
        self.dirname = dirname
        if not os.path.isdir(dirname):
            print(dirname, &apos;- not a directory!&apos;)
            sys.exit()

    def __iter__(self):
        for dirfile in os.walk(self.dirname):
            for fname in dirfile[2]:
                text = open(os.path.join(dirfile[0], fname),
                            &apos;r&apos;, encoding=&apos;utf-8&apos;, errors=&apos;ignore&apos;).read()
                yield segment(text)   # time consuming
</code></pre>
<h4 id>&#x8BCD;&#x7684;&#x9006;&#x6587;&#x6863;&#x9891;&#x6570;&#x7EDF;&#x8BA1;</h4>
<p>&#x7EDF;&#x8BA1;&#x6BCF;&#x4E00;&#x4E2A;&#x8BCD;&#x51FA;&#x73B0;&#x5728;&#x591A;&#x5C11;&#x7BC7;&#x6587;&#x6863;&#x4E2D;&#xFF1A;</p>
<pre><code class="language-python">documents = MyDocuments(inputdir)

ignored = {&apos;&apos;, &apos; &apos;, &apos;&apos;, &apos;&#x3002;&apos;, &apos;&#xFF1A;&apos;, &apos;&#xFF0C;&apos;, &apos;&#xFF09;&apos;, &apos;&#xFF08;&apos;, &apos;&#xFF01;&apos;, &apos;?&apos;, &apos;&#x201D;&apos;, &apos;&#x201C;&apos;}
id_freq = {}
i = 0
for doc in documents:
    doc = set(x for x in doc if x not in ignored)
    for x in doc:
        id_freq[x] = id_freq.get(x, 0) + 1
    if i % 1000 == 0:
        print(&apos;Documents processed: &apos;, i, &apos;, time: &apos;,
            datetime.datetime.now())
    i += 1
</code></pre>
<p>&#x8BA1;&#x7B97;&#x9006;&#x6587;&#x6863;&#x9891;&#x7387;&#x5E76;&#x5B58;&#x50A8;</p>
<pre><code class="language-python">with open(outputfile, &apos;w&apos;, encoding=&apos;utf-8&apos;) as f:
    for key, value in id_freq.items():
        f.write(key + &apos; &apos; + str(math.log(i / value, 2)) + &apos;\n&apos;)
</code></pre>
<p>&#x9006;&#x6587;&#x6863;&#x9891;&#x7387; (IDF) &#x8BA1;&#x7B97;&#x516C;&#x5F0F;</p>
<p>$$<br></p>
<p>IDF(w) = log_2(\frac{D}{D_w})<br></p>
<p>$$</p>
<p>&#x5176;&#x4E2D;&#xFF0C;$D$ &#x8868;&#x793A;&#x603B;&#x6587;&#x6863;&#x6570;&#xFF0C;$D_w$ &#x8868;&#x793A;&#x8BCD; w &#x51FA;&#x73B0;&#x5728;&#x591A;&#x5C11;&#x7BC7;&#x6587;&#x6863;&#x4E2D;&#x3002;</p>
<h4 id>&#x8FD0;&#x884C;&#x793A;&#x4F8B;&#xFF1A;</h4>
<pre><code class="language-python">Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/65/1sj9q72d15gg80vt9c70v9d80000gn/T/jieba.cache
Loading model cost 0.943 seconds.
Prefix dict has been built succesfully.
Documents processed:  0 , time:  2017-08-08 17:11:15.906739
Documents processed:  1000 , time:  2017-08-08 17:11:18.857246
Documents processed:  2000 , time:  2017-08-08 17:11:21.762615
Documents processed:  3000 , time:  2017-08-08 17:11:24.534753
Documents processed:  4000 , time:  2017-08-08 17:11:27.235600
Documents processed:  5000 , time:  2017-08-08 17:11:29.974688
Documents processed:  6000 , time:  2017-08-08 17:11:32.818768
Documents processed:  7000 , time:  2017-08-08 17:11:35.797916
Documents processed:  8000 , time:  2017-08-08 17:11:39.232018
</code></pre>
<p>&#x53EF;&#x89C1;&#xFF0C;&#x5904;&#x7406; 1000 &#x7BC7;&#x6587;&#x6863;&#x7528;&#x65F6;&#x5927;&#x7EA6; 3 &#x79D2;&#xFF0C;80 &#x4E07;&#x7BC7;&#x5927;&#x7EA6;&#x7528;&#x65F6; 40 &#x5206;&#x949F;&#x3002;</p>
<h3 id="tfidf">TF-IDF &#x5173;&#x952E;&#x8BCD;&#x63D0;&#x53D6;</h3>
<p>&#x501F;&#x9274;&#x4E86;&#x7ED3;&#x5DF4;&#x5206;&#x8BCD;&#x7684;&#x5904;&#x7406;&#x601D;&#x8DEF;&#xFF0C;&#x4F7F;&#x7528; IDFLoader &#x8F7D;&#x5165; IDF &#x6587;&#x4EF6;&#xFF1A;</p>
<pre><code class="language-python">class IDFLoader(object):
    def __init__(self, idf_path):
        self.idf_path = idf_path
        self.idf_freq = {}     # idf
        self.mean_idf = 0.0    # &#x5747;&#x503C;
        self.load_idf()

    def load_idf(self):       # &#x4ECE;&#x6587;&#x4EF6;&#x4E2D;&#x8F7D;&#x5165;idf
        cnt = 0
        with open(self.idf_path, &apos;r&apos;, encoding=&apos;utf-8&apos;) as f:
            for line in f:
                try:
                    word, freq = line.strip().split(&apos; &apos;)
                    cnt += 1
                except Exception as e:
                    pass
                self.idf_freq[word] = float(freq)

        print(&apos;Vocabularies loaded: %d&apos; % cnt)
        self.mean_idf = sum(self.idf_freq.values()) / cnt
</code></pre>
<p>&#x4F7F;&#x7528; TF-IDF &#x62BD;&#x53D6;&#x5173;&#x952E;&#x8BCD;&#x3002;TF-IDF &#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#xFF1A;</p>
<p>$$<br></p>
<p>TFIDF(w) = TF(w) * IDF(w)<br></p>
<p>$$</p>
<pre><code class="language-python">class TFIDF(object):
    def __init__(self, idf_path):
        self.idf_loader = IDFLoader(idf_path)
        self.idf_freq = self.idf_loader.idf_freq
        self.mean_idf = self.idf_loader.mean_idf

    def extract_keywords(self, sentence, topK=20):    # &#x63D0;&#x53D6;&#x5173;&#x952E;&#x8BCD;
        # &#x8FC7;&#x6EE4;
        seg_list = segment(sentence)

        freq = {}
        for w in seg_list:
            freq[w] = freq.get(w, 0.0) + 1.0
        total = sum(freq.values())

        for k in freq:   # &#x8BA1;&#x7B97; TF-IDF
            freq[k] *= self.idf_freq.get(k, self.mean_idf) / total

        tags = sorted(freq, key=freq.__getitem__, reverse=True)  # &#x6392;&#x5E8F;

        if topK:
            return tags[:topK]
        else:
            return tags
</code></pre>
<p>&#x4F7F;&#x7528;&#xFF1A;</p>
<pre><code class="language-python"># idffile&#x4E3A;idf&#x6587;&#x4EF6;&#x8DEF;&#x5F84;, document&#x4E3A;&#x5F85;&#x5904;&#x7406;&#x6587;&#x672C;&#x8DEF;&#x5F84;
tdidf = TFIDF(idffile)
sentence = open(document, &apos;r&apos;, encoding=&apos;utf-8&apos;, errors=&apos;ignore&apos;).read()
tags = tdidf.extract_keywords(sentence, topK)
</code></pre>
<p>&#x539F;&#x6587;&#x6863;&#xFF1A;</p>
<pre><code>AMD&#x529B;&#x63A8;812&#x6838;&#x670D;&#x52A1;&#x5668;&#x5904;&#x7406;&#x5668;&#x53CD;&#x653B;&#x82F1;&#x7279;&#x5C14;
&#x3000;&#x3000;AMD&#x4ECA;&#x65E5;&#x6B63;&#x5F0F;&#x63A8;&#x51FA;&#x6700;&#x65B0;&#x7684;8&#x6838;&#x5FC3;&#x53CA;12&#x6838;&#x5FC3;&#x7CFB;&#x5217;&#x5904;&#x7406;&#x5668;&#x4EA7;&#x54C1;&#xFF0C;&#x4ECE;&#x800C;&#x6B63;&#x5F0F;&#x5728;&#x670D;&#x52A1;&#x5668;&#x9886;&#x57DF;&#x5411;&#x82F1;&#x7279;&#x5C14;&#x5439;&#x8D77;&#x4E86;&#x8FDB;&#x653B;&#x7684;&#x53F7;&#x89D2;&#x3002;
&#x3000;&#x3000;AMD&#x7684;8&#x6838;&#x548C;12&#x6838;&#x670D;&#x52A1;&#x5668;&#x5904;&#x7406;&#x5668;&#x90FD;&#x91C7;&#x7528;&#x4E86;&#x65B0;&#x7684;45&#x7EB3;&#x7C73;&#x8BBE;&#x8BA1;&#xFF0C;&#x800C;&#x4E14;&#x4E5F;&#x90FD;&#x662F;&#x7531;&#x4E24;&#x5757;&#x5904;&#x7406;&#x5668;die&#x5C01;&#x88C5;&#x5728;&#x4E00;&#x8D77;&#x6784;&#x5EFA;&#xFF0C;&#x5176;&#x4E2D;12&#x6838;&#x5FC3;&#x5904;&#x7406;&#x5668;&#x6B63;&#x662F;&#x57FA;&#x4E8E;&#x6B64;&#x524D;&#x66DD;&#x5149;&#x7684;Magny-Cours&#x6838;&#x5FC3;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x4E24;&#x4E2A;6&#x6838;&#x4F0A;&#x65AF;&#x5766;&#x5E03;&#x5C14;&#x6838;&#x5FC3;&#x5C01;&#x88C5;&#x5728;&#x4E00;&#x8D77;&#xFF0C;&#x800C;8&#x6838;&#x5904;&#x7406;&#x5668;&#x5219;&#x662F;&#x7531;&#x4E24;&#x9897;4&#x6838;&#x5904;&#x7406;&#x5668;die&#x5C01;&#x88C5;&#x5728;&#x4E00;&#x8D77;&#x6784;&#x5EFA;&#x3002;
&#x3000;&#x3000;&#x65B0;&#x63A8;&#x51FA;&#x7684;8&#x6838;&#x548C;12&#x6838;&#x5904;&#x7406;&#x5668;&#x5C06;&#x652F;&#x6301;&#x5168;&#x65B0;&#x7684;G34&#x63D2;&#x69FD;&#xFF0C;&#x53EF;&#x63D0;&#x4F9B;&#x66F4;&#x65B0;&#x7684;I/O&#x6280;&#x672F;&#xFF0C;&#x53E6;&#x5916;&#x7531;&#x4E8E;&#x53EF;&#x4EE5;&#x652F;&#x6301;&#x56DB;&#x6761;DDR3&#x5185;&#x5B58;&#x901A;&#x9053;&#x56E0;&#x6B64;&#x6BCF;&#x9897;&#x5904;&#x7406;&#x5668;&#x53EF;&#x4EE5;&#x652F;&#x6301;&#x591A;&#x8FBE;12&#x6761;&#x5185;&#x5B58;&#x63D2;&#x69FD;&#x3002;
&#x3000;&#x3000;&#x6B64;&#x6B21;&#x65B0;&#x63A8;&#x7684;8&#x6838;&#x548C;12&#x6838;&#x5904;&#x7406;&#x5668;&#x4EA7;&#x54C1;&#x5C06;&#x4F1A;&#x96B6;&#x5C5E;&#x4E8E;Opteron 6100&#x7CFB;&#x5217;&#xFF0C;&#x6700;&#x4F4E;&#x8D77;&#x59CB;&#x4E3B;&#x9891;&#x4E3A;1.8GHz&#xFF0C;&#x5176;&#x4E2D;8&#x6838;&#x6700;&#x4F4E;&#x7248;&#x672C;&#x578B;&#x53F7;&#x4E3A;Opteron 6124 HE&#xFF0C;&#x800C;&#x8BE5;&#x7CFB;&#x5217;&#x6700;&#x9AD8;&#x7248;&#x672C;&#x5219;&#x4E3A;&#x4E3B;&#x9891;2.3GHz&#x7684;12&#x6838;Opteron 6176 SE&#x3002;&#x5728;Opteron 6100&#x7CFB;&#x5217;&#x91CC;&#xFF0C;1.8GHz&#x7684;8&#x6838;Opteron 6124 HE&#x529F;&#x8017;&#x8F83;&#x4F4E;&#x4EC5;&#x4E3A;65W&#xFF0C;&#x5177;&#x4F53;&#x7684;&#x552E;&#x4EF7;&#x5219;&#x4E3A;455&#x7F8E;&#x5143;&#xFF0C;&#x6298;&#x5408;&#x4EBA;&#x6C11;&#x5E01;3100&#x5143;&#x51FA;&#x5934;&#x3002;&#x4E3B;&#x9891;2.3GHz&#x7684;12&#x6838;Opteron 6176 SE&#x529F;&#x8017;&#x4E3A;105W&#xFF0C;&#x552E;&#x4EF7;&#x4E3A;1386&#x7F8E;&#x5143;&#xFF0C;&#x6298;&#x5408;&#x4EBA;&#x6C11;&#x5E01;&#x7EA6;&#x4E3A;9466&#x5143;&#x3002;&#x5176;&#x4ED6;&#x4EA7;&#x54C1;&#x7684;&#x89C4;&#x683C;&#x548C;&#x4EF7;&#x683C;&#x591A;&#x4ECB;&#x4E8E;&#x8FD9;&#x4E24;&#x6B3E;&#x4EA7;&#x54C1;&#x4E4B;&#x95F4;&#x3002;
&#x3000;&#x3000;&#x6027;&#x80FD;&#x65B9;&#x9762;&#xFF0C;AMD Opteron 6100&#x7CFB;&#x5217;&#x6BD4;&#x6B64;&#x524D;&#x7684;6&#x6838;&#x4F0A;&#x65AF;&#x5766;&#x5E03;&#x5C14;&#x5904;&#x7406;&#x5668;&#x8981;&#x5F3A;&#x608D;&#x5F88;&#x591A;&#xFF0C;&#x6309;&#x7167;AMD&#x65B9;&#x9762;&#x7684;&#x8BF4;&#x6CD5;&#x6574;&#x6570;&#x8FD0;&#x7B97;&#x6027;&#x80FD;&#x63D0;&#x5347;&#x8FBE;88%&#xFF0C;&#x540C;&#x65F6;&#x6D6E;&#x70B9;&#x8FD0;&#x7B97;&#x6027;&#x80FD;&#x66F4;&#x662F;&#x63D0;&#x5347;&#x4E86;119%&#x4E4B;&#x591A;&#x3002;Opteron 6000&#x7CFB;&#x5217;&#x670D;&#x52A1;&#x5668;&#x5E73;&#x53F0;&#x4E3B;&#x8981;&#x5C06;&#x914D;&#x5907;&#x56DB;&#x4E2A;&#x6216;&#x8005;&#x4E24;&#x4E2A;&#x63D2;&#x69FD;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x5165;&#x95E8;&#x7EA7;&#x7CFB;&#x7EDF;&#x6838;&#x5FC3;&#x6570;&#x91CF;&#x4E3A;16&#x4E2A;&#xFF0C;&#x800C;&#x9AD8;&#x9636;&#x7248;&#x7CFB;&#x7EDF;&#x6838;&#x5FC3;&#x6570;&#x91CF;&#x53EF;&#x8FBE;48&#x4E2A;&#x3002;
&#x3000;&#x3000;&#x4E0E;AMD&#x76F8;&#x5BF9;&#x7684;&#x662F;&#x82F1;&#x7279;&#x5C14;&#x4E5F;&#x6B63;&#x8BA1;&#x5212;&#x9488;&#x5BF9;&#x591A;&#x5904;&#x7406;&#x5668;&#x670D;&#x52A1;&#x5668;&#x5E02;&#x573A;&#x63A8;&#x51FA;&#x4E00;&#x6B3E;8&#x6838;&#x5FC3;&#x7684;&#x82AF;&#x7247;&#x4EA7;&#x54C1;&#xFF0C;&#x8FD9;&#x6B3E;&#x4EA7;&#x54C1;&#x4E5F;&#x88AB;&#x79F0;&#x4E3A;&#x201C;Nehalem-EX&#x201D;&#xFF0C;&#x8FD9;&#x6B3E;&#x4EA7;&#x54C1;&#x5E94;&#x8BE5;&#x4E5F;&#x5DF2;&#x7ECF;&#x79BB;&#x6B63;&#x5F0F;&#x4E0A;&#x5E02;&#x4E0D;&#x8FDC;&#x3002;
</code></pre>
<p>&#x793A;&#x4F8B;&#x8F93;&#x51FA;&#xFF1A;</p>
<pre><code>&#x6838;
&#x5904;&#x7406;&#x5668;
&#x670D;&#x52A1;&#x5668;
&#x7CFB;&#x7EDF;&#x6838;&#x5FC3;
&#x5C01;&#x88C5;
&#x7CFB;&#x5217;
&#x63D2;&#x69FD;
&#x6838;&#x5FC3;
&#x4E3B;&#x9891;
&#x4EA7;&#x54C1;
&#x4F0A;&#x65AF;&#x5766;&#x5E03;&#x5C14;
&#x82F1;&#x7279;&#x5C14;
&#x529F;&#x8017;
&#x591A;&#x5904;&#x7406;&#x5668;
&#x4F4E;&#x4EC5;
&#x6298;&#x5408;
&#x6D6E;&#x70B9;&#x8FD0;&#x7B97;
&#x6027;&#x80FD;
&#x6784;&#x5EFA;
&#x5439;&#x8D77;
</code></pre>
<!--kg-card-end: markdown-->
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Pytorch整理：60分钟入门]]></title><description><![CDATA[由于种种原因，近段时间开始尝试使用PyTorch。照着官方给的教程慢慢搞，稍微有一点点理解。在这里做一点小小的记录和翻译工作。]]></description><link>https://gaussic.com/pytorch-60-minutes/</link><guid isPermaLink="false">626173b75d2e434866501f87</guid><category><![CDATA[Deep Learning]]></category><category><![CDATA[PyTorch]]></category><dc:creator><![CDATA[Gaussic DZK]]></dc:creator><pubDate>Fri, 05 May 2017 09:58:00 GMT</pubDate><media:content url="https://gaussic.com/content/images/2020/01/sailboat-4777340_1280.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown-->
<img src="https://gaussic.com/content/images/2020/01/sailboat-4777340_1280.jpg" alt="Pytorch&#x6574;&#x7406;&#xFF1A;60&#x5206;&#x949F;&#x5165;&#x95E8;"><p>&#x5B98;&#x65B9;&#x5730;&#x5740;&#xFF1A;<a href="http://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html">Deep Learning with PyTorch: A 60 Minute Blitz</a></p>
<p>&#x611F;&#x8C22;&#x4F5C;&#x8005;&#xFF1A;<a href="http://soumith.ch/">Soumith Chintala</a></p>
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x8BF4;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/pytorch-60-minutes/">PyTorch &#x6574;&#x7406;&#xFF1A;60 &#x5206;&#x949F;&#x5165;&#x95E8;</a></p>
<p>&#x8FD9;&#x4E2A;&#x6559;&#x7A0B;&#x7684;&#x76EE;&#x6807;&#xFF1A;</p>
<ul>
<li>&#x66F4;&#x9AD8;&#x5C42;&#x6B21;&#x5730;&#x7406;&#x89E3; PyTorch &#x7684; Tensor &#x5E93;&#x4EE5;&#x53CA;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x3002;</li>
<li>&#x8BAD;&#x7EC3;&#x4E00;&#x4E2A;&#x5C0F;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x6A21;&#x578B;&#x7528;&#x4E8E;&#x5206;&#x7C7B;&#x56FE;&#x50CF;&#x3002;</li>
</ul>
<!-- -->
<h3 id="pytorch">&#x4EC0;&#x4E48;&#x662F; PyTorch</h3>
<p>&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x57FA;&#x4E8E; Python &#x7684;&#x79D1;&#x5B66;&#x8BA1;&#x7B97;&#x5305;&#xFF0C;&#x4E3B;&#x8981;&#x9488;&#x5BF9;&#x4E24;&#x7C7B;&#x4EBA;&#x7FA4;&#xFF1A;</p>
<ul>
<li>&#x66FF;&#x4EE3; Numpy &#x4EE5;&#x53D1;&#x6325; GPU &#x7684;&#x5F3A;&#x5927;&#x80FD;&#x529B;</li>
<li>&#x4E00;&#x4E2A;&#x63D0;&#x4F9B;&#x6700;&#x5927;&#x7075;&#x6D3B;&#x6027;&#x548C;&#x901F;&#x5EA6;&#x7684;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7814;&#x7A76;&#x5E73;&#x53F0;</li>
</ul>
<!-- -->
<h3 id>&#x5F00;&#x59CB;</h3>
<h4 id="tensors">Tensors</h4>
<p>Tensors &#x7C7B;&#x4F3C;&#x4E8E; numpy &#x7684; ndarray&#xFF0C;&#x4F46;&#x662F;&#x5E26;&#x4E86;&#x4E00;&#x4E9B;&#x9644;&#x52A0;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x4F8B;&#x5982;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; GPU &#x52A0;&#x901F;&#x8BA1;&#x7B97;&#x7B49;&#x7B49;&#x3002;</p>
<p>&#x6784;&#x5EFA;&#x4E00;&#x4E2A;&#x672A;&#x521D;&#x59CB;&#x5316;&#x7684; 5x3 &#x77E9;&#x9635;&#xFF1A;</p>
<pre><code class="language-python">import torch
x = torch.Tensor(5, 3)
print(x)
</code></pre>
<pre><code class="language-python">1.00000e-28 *
  0.0000  0.2524  0.0000
  0.2524  2.8715  0.0000
  2.9158  0.0000  2.9157
  0.0000  2.9158  0.0000
  0.0003  0.0000  0.0000
[torch.FloatTensor of size 5x3]
</code></pre>
<p>&#x6784;&#x5EFA;&#x4E00;&#x4E2A;&#x968F;&#x673A;&#x521D;&#x59CB;&#x5316;&#x7684;&#x77E9;&#x9635;&#xFF1A;</p>
<pre><code class="language-python">x = torch.rand(5, 3)
print(x)
</code></pre>
<pre><code class="language-python">0.5453  0.4855  0.7236
 0.3199  0.4525  0.4917
 0.6965  0.8742  0.9948
 0.9029  0.1873  0.0018
 0.3080  0.2953  0.4313
[torch.FloatTensor of size 5x3]
</code></pre>
<p>&#x83B7;&#x53D6;&#x77E9;&#x9635;&#x7EF4;&#x5EA6;&#x5927;&#x5C0F;&#xFF1A;</p>
<pre><code class="language-python">print(x.size())
</code></pre>
<pre><code class="language-python">torch.Size([5, 3])
</code></pre>
<blockquote>
<p>&#x6CE8;&#x610F;&#xFF1A;<code>torch.Size</code> &#x5B9E;&#x9645;&#x4E0A;&#x662F;&#x4E00;&#x4E2A;&#x5143;&#x7EC4;&#xFF0C;&#x56E0;&#x6B64;&#x5B83;&#x652F;&#x6301;&#x76F8;&#x540C;&#x7684;&#x64CD;&#x4F5C;&#x3002;</p>
</blockquote>
<h4 id>&#x8FD0;&#x7B97;&#x64CD;&#x4F5C;</h4>
<p>&#x8FD0;&#x7B97;&#x64CD;&#x4F5C;&#x6709;&#x591A;&#x79CD;&#x8BED;&#x6CD5;&#xFF0C;&#x8BA9;&#x6211;&#x4EEC;&#x770B;&#x770B;&#x52A0;&#x6CD5;&#x7684;&#x4F8B;&#x5B50;&#x3002;</p>
<p>&#x52A0;&#x6CD5;&#xFF1A;&#x8BED;&#x6CD5; 1</p>
<pre><code class="language-python">y = torch.rand(5, 3)
print(x + y)
</code></pre>
<pre><code class="language-python">1.1177  0.8514  1.1459
 1.1878  0.9249  0.5759
 1.3508  1.4628  1.2833
 1.8678  0.8499  0.2941
 0.9718  1.0785  0.6914
[torch.FloatTensor of size 5x3]
</code></pre>
<p>&#x52A0;&#x6CD5;&#xFF1A;&#x8BED;&#x6CD5; 2</p>
<pre><code class="language-python">print(torch.add(x, y))
</code></pre>
<pre><code class="language-python">1.1177  0.8514  1.1459
 1.1878  0.9249  0.5759
 1.3508  1.4628  1.2833
 1.8678  0.8499  0.2941
 0.9718  1.0785  0.6914
[torch.FloatTensor of size 5x3]
</code></pre>
<p>&#x52A0;&#x6CD5;&#xFF1A;&#x7ED9;&#x5B9A;&#x4E00;&#x4E2A;&#x8F93;&#x51FA; tensor</p>
<pre><code class="language-python">result = torch.Tensor(5, 3)
torch.add(x, y, out=result)
print(result)
</code></pre>
<pre><code class="language-python">1.1177  0.8514  1.1459
 1.1878  0.9249  0.5759
 1.3508  1.4628  1.2833
 1.8678  0.8499  0.2941
 0.9718  1.0785  0.6914
[torch.FloatTensor of size 5x3]
</code></pre>
<p>&#x52A0;&#x6CD5;&#xFF1A;&#x5C31;&#x5730; (in-place)</p>
<pre><code class="language-python"># adds x to y
y.add_(x)
print(y)
</code></pre>
<pre><code class="language-python">1.1177  0.8514  1.1459
 1.1878  0.9249  0.5759
 1.3508  1.4628  1.2833
 1.8678  0.8499  0.2941
 0.9718  1.0785  0.6914
[torch.FloatTensor of size 5x3]
</code></pre>
<blockquote>
<p>&#x6CE8;&#x610F;&#xFF1A;&#x4EFB;&#x4F55;&#x5C31;&#x5730;&#x6539;&#x53D8;&#x4E00;&#x4E2A; tensor &#x7684;&#x64CD;&#x4F5C;&#x90FD;&#x4EE5; <code>_</code> &#x4E3A;&#x540E;&#x7F00;&#x3002;&#x4F8B;&#x5982;&#xFF1A;<code>x.copy_(y)</code>, <code>x.t_()</code>&#xFF0C;&#x90FD;&#x4F1A;&#x6539;&#x53D8; <code>x</code>&#x3002;</p>
</blockquote>
<p>&#x4F60;&#x53EF;&#x4EE5;&#x50CF; numpy &#x4E00;&#x6837;&#x4F7F;&#x7528;&#x7D22;&#x5F15;!</p>
<pre><code class="language-python">print(x[:, 1])
</code></pre>
<pre><code class="language-python">0.4855
 0.4525
 0.8742
 0.1873
 0.2953
[torch.FloatTensor of size 5]
</code></pre>
<p><strong>&#x5EF6;&#x4F38;&#x9605;&#x8BFB;</strong>&#xFF1A;</p>
<p>100 + Tensor &#x8FD0;&#x7B97;&#xFF0C;&#x5305;&#x62EC;&#x8F6C;&#x7F6E;&#x3001;&#x7D22;&#x5F15;&#x3001;&#x5207;&#x5206;&#x3001;&#x6570;&#x5B66;&#x8FD0;&#x7B97;&#x3001;&#x7EBF;&#x6027;&#x4EE3;&#x6570;&#x968F;&#x673A;&#x6570;&#x7B49;&#x7B49;&#xFF0C;&#x94FE;&#x63A5;&#xFF1A;<a href="http://pytorch.org/docs/torch">&#x6233;&#x8FD9;</a></p>
<h3 id="numpy">Numpy &#x7684;&#x6865;&#x6881;</h3>
<p>Torch &#x7684; Tensor &#x548C; Numpy &#x7684;&#x6570;&#x7EC4;&#x4E4B;&#x95F4;&#x7684;&#x4E92;&#x8F6C;&#x7B80;&#x76F4;&#x50CF;&#x4E00;&#x9635;&#x6E05;&#x98CE;&#x4E00;&#x6837;&#x3002;</p>
<p>Torc h&#x7684; Tensor &#x548C; Numpy &#x7684;&#x6570;&#x7EC4;&#x4F1A;&#x5171;&#x4EAB;&#x5B83;&#x4EEC;&#x7684;&#x5E95;&#x5C42;&#x5B58;&#x50A8;&#x4F4D;&#x7F6E;&#xFF0C;&#x8BE5;&#x53D8;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#xFF0C;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x4E5F;&#x4F1A;&#x6539;&#x53D8;&#x3002;</p>
<h4 id="torchtensornumpy">&#x5C06; Torch Tensor &#x8F6C;&#x6362;&#x4E3A; Numpy &#x6570;&#x7EC4;</h4>
<pre><code class="language-python">a = torch.ones(5)
print(a)
</code></pre>
<pre><code class="language-python">1
 1
 1
 1
 1
[torch.FloatTensor of size 5]
</code></pre>
<pre><code class="language-python">b = a.numpy()
print(b)
</code></pre>
<pre><code class="language-python">[ 1.  1.  1.  1.  1.]
</code></pre>
<p>&#x770B;&#x770B;&#x5F53;&#x6539;&#x53D8; numpy &#x6570;&#x7EC4;&#x7684;&#x503C;&#x65F6;&#x53D1;&#x751F;&#x4E86;&#x4EC0;&#x4E48;&#x3002;</p>
<pre><code class="language-python">a.add_(1)
print(a)
print(b)
</code></pre>
<pre><code class="language-python">2
 2
 2
 2
 2
[torch.FloatTensor of size 5]

[ 2.  2.  2.  2.  2.]
</code></pre>
<h4 id="numpytorchtensor">&#x5C06; Numpy &#x6570;&#x7EC4;&#x8F6C;&#x6362;&#x4E3A; Torch Tensor</h4>
<p>&#x770B;&#x770B;&#x66F4;&#x6539; Numpy &#x6570;&#x7EC4;&#x7684;&#x540C;&#x65F6;&#x81EA;&#x52A8;&#x5730;&#x66F4;&#x6539;&#x4E86; Torch Tensor</p>
<pre><code class="language-python">import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)
</code></pre>
<pre><code class="language-python">[ 2.  2.  2.  2.  2.]

 2
 2
 2
 2
 2
[torch.DoubleTensor of size 5]
</code></pre>
<p>&#x9664;&#x4E86; CharTensor &#x4E4B;&#x5916;&#xFF0C;CPU &#x4E0A;&#x7684;&#x6240;&#x6709; Tensor &#x90FD;&#x652F;&#x6301;&#x4E0E; Numpy &#x6570;&#x7EC4;&#x7684;&#x6765;&#x56DE;&#x8F6C;&#x6362;&#x3002;</p>
<h4 id="cudatensors">CUDA Tensors</h4>
<p>&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>.cuda</code> &#x51FD;&#x6570;&#x5C06; Tensor &#x8F6C;&#x79FB;&#x5230; GPU &#x4E0A;&#x3002;</p>
<pre><code class="language-python"># let us run this cell only if CUDA is available
if torch.cuda.is_available():
    x = x.cuda()
    y = y.cuda()
    x + y
</code></pre>
<h3 id="autograd">Autograd: &#x81EA;&#x52A8;&#x6C42;&#x5BFC;</h3>
<p>PyTorch &#x4E2D;&#x6240;&#x6709;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x4E2D;&#x5FC3;&#x90E8;&#x5206;&#x662F; <code>autograd</code> &#x5305;&#x3002;&#x6211;&#x4EEC;&#x9996;&#x5148;&#x6D4F;&#x89C8;&#x4E00;&#x4E0B;&#x5B83;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x6784;&#x5EFA;&#x6211;&#x4EEC;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x3002;</p>
<p><code>autograd</code> &#x5305;&#x4E3A; Tensor &#x4E0A;&#x7684;&#x6240;&#x6709;&#x8FD0;&#x7B97;&#x63D0;&#x4F9B;&#x4E86;&#x81EA;&#x52A8;&#x6C42;&#x5BFC;&#x529F;&#x80FD;&#x3002;&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x7531;&#x8FD0;&#x884C;&#x5B9A;&#x4E49;&#x7684;&#x6846;&#x67B6;&#xFF0C;&#x5373;&#x4F60;&#x7684;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#x662F;&#x7531;&#x4F60;&#x7684;&#x4EE3;&#x7801;&#x5982;&#x4F55;&#x8FD0;&#x884C;&#x6765;&#x51B3;&#x5B9A;&#x7684;&#xFF0C;&#x800C;&#x4E14;&#x6BCF;&#x4E00;&#x8F6E;&#x8FED;&#x4EE3;&#x90FD;&#x53EF;&#x80FD;&#x662F;&#x4E0D;&#x540C;&#x7684;&#x3002;</p>
<p>&#x8BA9;&#x6211;&#x4EEC;&#x7528;&#x51E0;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#x6765;&#x4E86;&#x89E3;&#x51E0;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x672F;&#x8BED;&#x3002;</p>
<h4 id="variable">Variable &#x53D8;&#x91CF;</h4>
<p><code>autograd.Variable</code> &#x662F;&#x8FD9;&#x4E2A;&#x5305;&#x7684;&#x4E2D;&#x5FC3;&#x7C7B;&#x3002;&#x5B83;&#x5305;&#x88C5;&#x4E00;&#x4E2A; Tensor&#xFF0C;&#x5E76;&#x4E14;&#x652F;&#x6301;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x5B9A;&#x4E49;&#x5728;&#x8FD9;&#x4E2A; Tensor &#x4E0A;&#x7684;&#x8FD0;&#x7B97;&#x3002;&#x4E00;&#x65E6;&#x4F60;&#x5B8C;&#x6210;&#x4E86;&#x4F60;&#x7684;&#x8BA1;&#x7B97;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x8C03;&#x7528; <code>.backward()</code> &#x6765;&#x81EA;&#x52A8;&#x5730;&#x8BA1;&#x7B97;&#x5168;&#x90E8;&#x7684;&#x68AF;&#x5EA6;&#x3002;</p>
<p>&#x4F60;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>.data</code> &#x5C5E;&#x6027;&#x6765;&#x8BBF;&#x95EE;&#x6700;&#x539F;&#x59CB;&#x7684; tensor&#xFF0C;&#x800C;&#x68AF;&#x5EA6;&#x5219;&#x76F8;&#x5E94;&#x5730;&#x88AB;&#x7D2F;&#x8BA1;&#x5230;&#x4E86; <code>.grad</code> &#x4E2D;&#x3002;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/pytorch-1-1.png" class="kg-image" alt="Pytorch&#x6574;&#x7406;&#xFF1A;60&#x5206;&#x949F;&#x5165;&#x95E8;"></figure>
<!--kg-card-begin: markdown-->
<p>autograd &#x7684;&#x5B9E;&#x73B0;&#x4E2D;&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x7C7B; - <code>Function</code>&#x3002;</p>
<p><code>Variable</code> &#x548C; <code>Function</code> &#x662F;&#x76F8;&#x4E92;&#x5173;&#x8054;&#x7684;&#x5E76;&#x4E14;&#x6784;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x975E;&#x5FAA;&#x73AF;&#x56FE;&#xFF0C;&#x5176;&#x4E2D;&#x7F16;&#x7801;&#x4E86;&#x6574;&#x4E2A;&#x7684;&#x8BA1;&#x7B97;&#x5386;&#x53F2;&#x3002;&#x6BCF;&#x4E00;&#x4E2A;&#x53D8;&#x91CF;&#x90FD;&#x6709;&#x4E00;&#x4E2A; <code>.creator</code> &#x5C5E;&#x6027;&#xFF0C;&#x5B83;&#x5F15;&#x7528;&#x4E00;&#x4E2A;&#x5E38;&#x89C1; <code>Variable</code> &#x7684; <code>Function</code>&#xFF08;&#x9664;&#x4E86;&#x7528;&#x6237;&#x521B;&#x5EFA;&#x7684; Variables - &#x5B83;&#x4EEC;&#x7684; <code>creator &#x662F; None</code> &#xFF09;&#x3002;</p>
<p>&#x5982;&#x679C;&#x4F60;&#x60F3;&#x8BA1;&#x7B97;&#x5BFC;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x5728; <code>Variable</code> &#x4E0A;&#x8C03;&#x7528; <code>.backward()</code>&#x3002;&#x5982;&#x679C; <code>Variable</code> &#x662F;&#x4E2A;&#x6807;&#x91CF;&#xFF08;&#x4E00;&#x4E2A;&#x5355;&#x5143;&#x7D20;&#x6570;&#x636E;&#xFF09;&#xFF0C;&#x90A3;&#x4E48;&#x4F60;&#x4E0D;&#x7528;&#x4E3A; <code>backward()</code> &#x6307;&#x5B9A;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#xFF0C;&#x7136;&#x800C;&#x5982;&#x679C;&#x5B83;&#x6709;&#x591A;&#x4E2A;&#x5143;&#x7D20;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x6307;&#x5B9A;&#x4E00;&#x4E2A; <code>grad_output</code> &#x53C2;&#x6570;&#xFF0C;&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x5339;&#x914D;&#x5C3A;&#x5BF8;&#x7684; tensor&#x3002;</p>
<pre><code class="language-python">import torch
from torch.autograd import Variable
</code></pre>
<p>&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x53D8;&#x91CF;&#xFF1A;</p>
<pre><code class="language-python">x = Variable(torch.ones(2, 2), requires_grad=True)
print(x)
</code></pre>
<pre><code class="language-python">Variable containing:
 1  1
 1  1
[torch.FloatTensor of size 2x2]
</code></pre>
<p>&#x5BF9;&#x53D8;&#x91CF;&#x8FDB;&#x884C;&#x8FD0;&#x7B97;&#xFF1A;</p>
<pre><code class="language-python">y = x + 2
print(y)
</code></pre>
<pre><code class="language-python">Variable containing:
 3  3
 3  3
[torch.FloatTensor of size 2x2]
</code></pre>
<p><code>y</code> &#x662F;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x8FD0;&#x7B97;&#x64CD;&#x4F5C;&#x7684;&#x7ED3;&#x679C;&#x800C;&#x521B;&#x5EFA;&#x7684;&#xFF0C;&#x56E0;&#x800C;&#x5B83;&#x6709;&#x4E00;&#x4E2A; creator</p>
<pre><code class="language-python">print(y.creator)
</code></pre>
<pre><code class="language-python">&lt;torch.autograd._functions.basic_ops.AddConstant object at 0x108ada4a8&gt;
</code></pre>
<p>&#x5728; y &#x4E0A;&#x505A;&#x66F4;&#x591A;&#x7684;&#x8FD0;&#x7B97;&#xFF1A;</p>
<pre><code class="language-python">z = y * y * 3
out = z.mean()

print(z, out)
</code></pre>
<pre><code class="language-python">Variable containing:
 27  27
 27  27
[torch.FloatTensor of size 2x2]
 Variable containing:
 27
[torch.FloatTensor of size 1]
</code></pre>
<h4 id="gradients">Gradients &#x68AF;&#x5EA6;</h4>
<p>&#x8BA9;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x53CD;&#x5411;&#x4F20;&#x64AD; <code>out.backward()</code>&#xFF0C;&#x5B83;&#x7B49;&#x540C;&#x4E8E; <code>out.backward(torch.Tensor([1.0]))</code>&#x3002;</p>
<pre><code class="language-python">out.backward()
</code></pre>
<p>&#x6253;&#x5370;&#x68AF;&#x5EA6; d(out)/dx&#xFF1A;</p>
<pre><code class="language-python">print(x.grad)
</code></pre>
<pre><code class="language-python">Variable containing:
 4.5000  4.5000
 4.5000  4.5000
[torch.FloatTensor of size 2x2]
</code></pre>
<p>&#x4F60;&#x5E94;&#x8BE5;&#x4F1A;&#x5F97;&#x5230;&#x4E00;&#x4E2A; <code>4.5</code> &#x7684;&#x77E9;&#x9635;&#x3002;&#x8BA9;&#x6211;&#x4EEC;&#x79F0; <code>out</code> &#x53D8;&#x91CF;&#x4E3A; <em>o</em>&#x3002;&#x6211;&#x4EEC;&#x6709;</p>
<p>$$o = \frac{1}{4}\sum_i z_i$$</p>
<p>$$z_i = 3(x_i+2)^2$$</p>
<p>$$ z*i\bigr\rvert*{x_i=1} = 27 $$</p>
<p>&#x56E0;&#x6B64;&#xFF0C;</p>
<p>$$\frac{\partial o}{\partial x_i} = \frac{3}{2}(x_i+2)$$</p>
<p>$$\frac{\partial o}{\partial x*i}\bigr\rvert*{x_i=1} = \frac{9}{2} = 4.5$$</p>
<p>&#x4F60;&#x8FD8;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; autograd &#x505A;&#x4E00;&#x4E9B;&#x75AF;&#x72C2;&#x7684;&#x4E8B;&#x60C5;&#xFF01;</p>
<pre><code class="language-python">x = torch.randn(3)
x = Variable(x, requires_grad=True)

y = x * 2
while y.data.norm() &lt; 1000:
    y = y * 2

print(y)
</code></pre>
<pre><code class="language-python">Variable containing:
 596.2775
-807.4459
-550.6819
[torch.FloatTensor of size 3]
</code></pre>
<pre><code class="language-python">gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)

print(x.grad)
</code></pre>
<pre><code class="language-python">Variable containing:
  102.4000
 1024.0000
    0.1024
[torch.FloatTensor of size 3]
</code></pre>
<p>&#x5EF6;&#x4F38;&#x9605;&#x8BFB;&#xFF1A;</p>
<p><code>Variable</code> &#x548C; <code>Function</code> &#x7684;&#x6587;&#x6863;&#xFF1A;<a href="http://pytorch.org/docs/autograd">http://pytorch.org/docs/autograd</a></p>
<h3 id>&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</h3>
<p>&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>torch.nn</code> &#x5305;&#x6765;&#x6784;&#x5EFA;&#x3002;</p>
<p>&#x73B0;&#x5728;&#x4F60;&#x5927;&#x81F4;&#x4E86;&#x89E3;&#x4E86; <code>autograd</code>&#xFF0C;<code>nn</code> &#x4F9D;&#x8D56;&#x4E8E; <code>autograd</code> &#x6765;&#x5B9A;&#x4E49;&#x6A21;&#x578B;&#x5E76;&#x8FDB;&#x884C;&#x6C42;&#x5BFC;&#x3002;&#x4E00;&#x4E2A; <code>nn.Module</code> &#x5305;&#x542B;&#x591A;&#x4E2A;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x5C42;&#xFF0C;&#x4EE5;&#x53CA;&#x4E00;&#x4E2A; <code>forward(input)</code> &#x65B9;&#x6CD5;&#x6765;&#x8FD4;&#x56DE; <code>output</code>&#x3002;</p>
<p>&#x4F8B;&#x5982;&#xFF0C;&#x770B;&#x770B;&#x4EE5;&#x4E0B;&#x8FD9;&#x4E2A;&#x5206;&#x7C7B;&#x6570;&#x5B57;&#x56FE;&#x50CF;&#x7684;&#x7F51;&#x7EDC;&#xFF1A;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/pytorch-2.png" class="kg-image" alt="Pytorch&#x6574;&#x7406;&#xFF1A;60&#x5206;&#x949F;&#x5165;&#x95E8;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x524D;&#x9988;&#x7F51;&#x7EDC;&#x3002;&#x5B83;&#x5C06;&#x8F93;&#x5165;&#x9010;&#x6B65;&#x5730;&#x5582;&#x7ED9;&#x591A;&#x4E2A;&#x5C42;&#xFF0C;&#x7136;&#x540E;&#x7ED9;&#x51FA;&#x8F93;&#x51FA;&#x3002;</p>
<p>&#x4E00;&#x4E2A;&#x5178;&#x578B;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;&#x5982;&#x4E0B;&#xFF1A;</p>
<ul>
<li>&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x62E5;&#x6709;&#x53EF;&#x5B66;&#x4E60;&#x53C2;&#x6570;&#xFF08;&#x6216;&#x6743;&#x91CD;&#xFF09;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</li>
<li>&#x5728;&#x8F93;&#x5165;&#x6570;&#x636E;&#x4E0A;&#x8FDB;&#x884C;&#x8FED;&#x4EE3;</li>
<li>&#x5728;&#x7F51;&#x7EDC;&#x4E2D;&#x5904;&#x7406;&#x6570;&#x636E;</li>
<li>&#x8BA1;&#x7B97;&#x635F;&#x5931;&#xFF08;&#x8F93;&#x51FA;&#x79BB;&#x5206;&#x7C7B;&#x6B63;&#x786E;&#x6709;&#x591A;&#x8FDC;&#xFF09;</li>
<li>&#x68AF;&#x5EA6;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#x7ED9;&#x7F51;&#x7EDC;&#x7684;&#x53C2;&#x6570;</li>
<li>&#x66F4;&#x65B0;&#x7F51;&#x7EDC;&#x7684;&#x6743;&#x91CD;&#xFF0C;&#x901A;&#x5E38;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x66F4;&#x65B0;&#x89C4;&#x5219;&#xFF1A;<code>weight = weight + learning_rate * gradient</code></li>
</ul>
<!-- -->
<h4 id>&#x5B9A;&#x4E49;&#x7F51;&#x7EDC;</h4>
<pre><code class="language-python">import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        # 1 &#x56FE;&#x50CF;&#x8F93;&#x5165;&#x901A;&#x9053;, 6 &#x8F93;&#x51FA;&#x901A;&#x9053;, 5x5 &#x6B63;&#x65B9;&#x5F62;&#x5377;&#x79EF;&#x6838;
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        # an affine operation: y = Wx + b
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        # &#x4F7F;&#x7528; (2, 2) &#x7A97;&#x53E3;&#x6700;&#x5927;&#x6C60;&#x5316;
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        # If the size is a square you can only specify a single number
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:]   # &#x6240;&#x6709;&#x7EF4;&#x5EA6;&#xFF0C;&#x9664;&#x4E86;&#x6279;&#x5C3A;&#x5BF8;
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

net = Net()
print(net)
</code></pre>
<pre><code class="language-python">Net (
  (conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
  (fc1): Linear (400 -&gt; 120)
  (fc2): Linear (120 -&gt; 84)
  (fc3): Linear (84 -&gt; 10)
)
</code></pre>
<p>&#x4F60;&#x53EA;&#x9700;&#x8981;&#x5B9A;&#x4E49; <code>forward</code> &#x51FD;&#x6570;&#xFF0C;<code>backward</code> &#x51FD;&#x6570;&#xFF08;&#x7528;&#x6765;&#x8BA1;&#x7B97;&#x68AF;&#x5EA6;&#xFF09;&#x662F;&#x4F7F;&#x7528; <code>autograd</code> &#x81EA;&#x52A8;&#x4E3A;&#x4F60;&#x5B9A;&#x4E49;&#x7684;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x5728; <code>forward</code> &#x4E2D;&#x4F7F;&#x7528;&#x4EFB;&#x610F;&#x7684; Tensor &#x8FD0;&#x7B97;&#x64CD;&#x4F5C;&#x3002;</p>
<p>&#x6A21;&#x578B;&#x4E2D;&#x53EF;&#x5B66;&#x4E60;&#x7684;&#x53C2;&#x6570;&#x662F;&#x901A;&#x8FC7; <code>net.parameters()</code> &#x8FD4;&#x56DE;&#x7684;&#xFF1A;</p>
<pre><code class="language-python">params = list(net.parameters())
print(len(params))
print(params[0].size())  # conv1&apos;s .weight
</code></pre>
<pre><code class="language-python">10
torch.Size([6, 1, 5, 5])
</code></pre>
<p>forward &#x7684;&#x8F93;&#x5165;&#x662F;&#x4E00;&#x4E2A; <code>autograd.Variable</code>&#xFF0C;&#x8F93;&#x51FA;&#x4EA6;&#x7136;&#x3002;</p>
<pre><code class="language-python">input = Variable(torch.randn(1, 1, 32, 32))
out = net(input)
print(out)
</code></pre>
<pre><code class="language-python">Variable containing:
 0.0455 -0.0445  0.0064 -0.0310  0.0945 -0.0362 -0.1971  0.0555  0.0943  0.1016
[torch.FloatTensor of size 1x10]
</code></pre>
<p>&#x5C06;&#x68AF;&#x5EA6;&#x7F13;&#x51B2;&#x533A;&#x7F6E; 0&#xFF0C;&#x5E76;&#x4F7F;&#x7528;&#x968F;&#x673A;&#x7684;&#x68AF;&#x5EA6;&#x8FDB;&#x884C;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#xFF1A;</p>
<pre><code class="language-python">net.zero_grad()
out.backward(torch.randn(1, 10))
</code></pre>
<blockquote>
<p>&#x6CE8;&#x610F;&#xFF1A;</p>
<p><code>torch.nn</code> &#x4EC5;&#x652F;&#x6301; mini-batch&#x3002;&#x6574;&#x4E2A;&#x7684; <code>torch.nn</code> &#x5305;&#x4EC5;&#x652F;&#x6301;&#x5C0F;&#x6279;&#x91CF;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x5355;&#x72EC;&#x7684;&#x6837;&#x672C;&#x3002;</p>
<p>&#x4F8B;&#x5982;&#xFF0C;<code>nn.Conv2d</code> &#x5E94;&#x4F20;&#x5165;&#x4E00;&#x4E2A; 4D &#x7684; Tensor&#xFF0C;&#x7EF4;&#x5EA6;&#x4E3A; <code>nSamples x nChannels x Height x Width</code>&#x3002;</p>
<p>&#x5982;&#x679C;&#x4F60;&#x6709;&#x4E00;&#x4E2A;&#x5355;&#x72EC;&#x7684;&#x6837;&#x672C;&#xFF0C;&#x4F7F;&#x7528; <code>input.unsqueeze(0)</code> &#x6765;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x4F2A;&#x6279;&#x7EF4;&#x5EA6;&#x3002;</p>
</blockquote>
<p>&#x5728;&#x7EE7;&#x7EED;&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x5148;&#x56DE;&#x987E;&#x4E00;&#x4E0B;&#x8FC4;&#x4ECA;&#x4E3A;&#x6B62;&#x7684;&#x6240;&#x6709;&#x8BFE;&#x7A0B;&#x3002;</p>
<p>&#x56DE;&#x987E;&#xFF1A;</p>
<ul>
<li><code>torch.Tensor</code> &#x4E00;&#x4E2A;&#x591A;&#x7EF4;&#x6570;&#x7EC4;</li>
<li><code>autograd.Variable</code> &#x5305;&#x88C5;&#x4E00;&#x4E2A; Tensor &#x5E76;&#x4E14;&#x8BB0;&#x5F55;&#x5E94;&#x7528;&#x5728;&#x5176;&#x4E0A;&#x7684;&#x5386;&#x53F2;&#x8FD0;&#x7B97;&#x64CD;&#x4F5C;&#x3002;&#x62E5;&#x6709;&#x4E0E; <code>Tensor</code> &#x76F8;&#x540C;&#x7684; API&#xFF0C;&#x6DFB;&#x52A0;&#x4E86;&#x4E00;&#x4E9B;&#x50CF; <code>backward()</code> &#x7684;&#x64CD;&#x4F5C;&#x3002;&#x8FD8;&#x5305;&#x62EC;&#x76F8;&#x5173; tensor &#x7684;&#x68AF;&#x5EA6;&#x3002;</li>
<li><code>nn.Module</code> &#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x6A21;&#x5757;&#x3002;&#x5C01;&#x88C5;&#x53C2;&#x6570;&#x7684;&#x65B9;&#x4FBF;&#x65B9;&#x5F0F;&#xFF0C;&#x5E26;&#x6709;&#x5C06;&#x5B83;&#x4EEC;&#x8F6C;&#x79FB;&#x5230; GPU&#x3001;&#x5BFC;&#x51FA;&#x3001;&#x8F7D;&#x5165;&#x7B49;&#x7684;&#x5E2E;&#x52A9;&#x51FD;&#x6570;&#x3002;</li>
<li><code>nn.Parameter</code> &#x4E00;&#x79CD; Variable&#xFF0C;&#x5F53;&#x7ED9; <code>Module</code> &#x8D4B;&#x503C;&#x65F6;&#x81EA;&#x52A8;&#x6CE8;&#x518C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x3002;</li>
<li><code>autograd.Function</code> &#x5B9E;&#x73B0;&#x4E00;&#x4E2A; autograd &#x64CD;&#x4F5C;&#x7684; forward &#x548C; backward &#x5B9A;&#x4E49;&#x3002;&#x6BCF;&#x4E00;&#x4E2A; <code>Variable</code> &#x64CD;&#x4F5C;&#xFF0C;&#x521B;&#x5EFA;&#x81F3;&#x5C11;&#x4E00;&#x4E2A; <code>Function</code> &#x8282;&#x70B9;&#xFF0C;&#x6765;&#x8FDE;&#x63A5;&#x90A3;&#x4E9B;&#x521B;&#x5EFA; <code>Variable</code> &#x7684;&#x51FD;&#x6570;&#xFF0C;&#x5E76;&#x4E14;&#x8BB0;&#x5F55;&#x5176;&#x5386;&#x53F2;&#x3002;</li>
</ul>
<!-- -->
<p>&#x5728;&#x8FD9;&#x91CC;&#xFF0C;&#x6211;&#x4EEC;&#x6DB5;&#x76D6;&#x4E86;&#xFF1A;</p>
<ul>
<li>&#x5B9A;&#x4E49;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</li>
<li>&#x5904;&#x7406;&#x8F93;&#x5165;&#x5E76;&#x8C03;&#x7528; backward</li>
</ul>
<!-- -->
<p>&#x8FD8;&#x5269;&#x4E0B;&#xFF1A;</p>
<ul>
<li>&#x8BA1;&#x7B97;&#x635F;&#x5931;</li>
<li>&#x66F4;&#x65B0;&#x7F51;&#x7EDC;&#x6743;&#x91CD;</li>
</ul>
<!-- -->
<h4 id>&#x635F;&#x5931;&#x51FD;&#x6570;</h4>
<p>&#x4E00;&#x4E2A;&#x635F;&#x5931;&#x51FD;&#x6570;&#x4EE5;&#x4E00;&#x4E2A; (output, target) &#x5BF9;&#x4E3A;&#x8F93;&#x5165;&#xFF0C;&#x7136;&#x540E;&#x8BA1;&#x7B97;&#x4E00;&#x4E2A;&#x503C;&#x7528;&#x4EE5;&#x4F30;&#x8BA1;&#x8F93;&#x51FA;&#x7ED3;&#x679C;&#x79BB;&#x76EE;&#x6807;&#x7ED3;&#x679C;&#x591A;&#x8FDC;&#x3002;</p>
<p>&#x5B58;&#x5728;&#x591A;&#x79CD;&#x7684; <a href="http://pytorch.org/docs/nn.html#loss-functions">&#x635F;&#x5931;&#x51FD;&#x6570;</a>&#x3002;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x635F;&#x5931;&#x51FD;&#x6570;&#xFF1A;<code>nn.MSELoss</code>&#xFF0C;&#x5B83;&#x8BA1;&#x7B97;&#x8F93;&#x51FA;&#x4E0E;&#x76EE;&#x6807;&#x7684;&#x5747;&#x65B9;&#x8BEF;&#x5DEE;&#x3002;</p>
<p>&#x4F8B;&#x5982;&#xFF1A;</p>
<pre><code class="language-python">output = net(input)
target = Variable(torch.arange(1, 11))  # a dummy target, for example
criterion = nn.MSELoss()

loss = criterion(output, target)
print(loss)
</code></pre>
<pre><code class="language-python">Variable containing:
 38.3005
[torch.FloatTensor of size 1]
</code></pre>
<p>&#x73B0;&#x5728;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x5728;&#x53CD;&#x65B9;&#x5411;&#x8DDF;&#x968F; <code>loss</code>&#xFF0C;&#x4F7F;&#x7528;&#x5B83;&#x7684; <code>.creator</code> &#x5C5E;&#x6027;&#xFF0C;&#x4F60;&#x4F1A;&#x770B;&#x5230;&#x4E00;&#x4E2A;&#x5982;&#x4E0B;&#x6240;&#x793A;&#x7684;&#x8BA1;&#x7B97;&#x56FE;&#xFF1A;</p>
<pre><code>input -&gt; conv2d -&gt; relu -&gt; maxpool2d -&gt; conv2d -&gt; relu -&gt; maxpool2d
      -&gt; view -&gt; linear -&gt; relu -&gt; linear -&gt; relu -&gt; linear
      -&gt; MSELoss
      -&gt; loss
</code></pre>
<p>&#x56E0;&#x6B64;&#xFF0C;&#x5F53;&#x6211;&#x4EEC;&#x8C03;&#x7528; <code>loss.backward()</code> &#x65F6;&#xFF0C;&#x635F;&#x5931;&#x5BF9;&#x5E94;&#x7684;&#x6574;&#x4E2A;&#x56FE;&#x90FD;&#x88AB;&#x6C42;&#x5BFC;&#xFF0C;&#x5E76;&#x4E14;&#x56FE;&#x4E2D;&#x6240;&#x6709;&#x7684;&#x53D8;&#x91CF;&#x90FD;&#x4F1A;&#x5E26;&#x6709;&#x7D2F;&#x79EF;&#x4E86;&#x68AF;&#x5EA6;&#x7684; <code>.grad</code> &#x5C5E;&#x6027;&#x3002;</p>
<pre><code class="language-python">print(loss.creator)  # MSELoss
print(loss.creator.previous_functions[0][0])  # linear
print(loss.creator.previous_functions[0][0].previous_functions[0][0])  # ReLU
</code></pre>
<pre><code class="language-python">&lt;torch.nn._functions.thnn.auto.MSELoss object at 0x10e0bdd68&gt;
&lt;torch.nn._functions.linear.Linear object at 0x10e0bdba8&gt;
&lt;torch.nn._functions.thnn.auto.Threshold object at 0x10e0bdac8&gt;
</code></pre>
<h4 id>&#x53CD;&#x5411;&#x4F20;&#x64AD;</h4>
<p>&#x8981;&#x8FDB;&#x884C;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x8C03;&#x7528; <code>loss.backward()</code>&#x3002;&#x4F60;&#x9700;&#x8981;&#x6E05;&#x9664;&#x73B0;&#x6709;&#x7684;&#x68AF;&#x5EA6;&#xFF0C;&#x5426;&#x5219;&#x68AF;&#x5EA6;&#x5C06;&#x7D2F;&#x79EF;&#x5230;&#x73B0;&#x6709;&#x68AF;&#x5EA6;&#x3002;</p>
<p>&#x73B0;&#x5728;&#x6211;&#x4EEC;&#x5C06;&#x8C03;&#x7528; <code>loss.backward()</code>&#xFF0C;&#x5E76;&#x770B;&#x770B; conv1 &#x5728; backward &#x4E4B;&#x524D;&#x548C;&#x4E4B;&#x540E;&#x7684;&#x68AF;&#x5EA6;&#x53D8;&#x5316;&#x3002;</p>
<pre><code class="language-python">net.zero_grad()   # zeroes the gradient buffers of all parameters

print(&apos;conv1.bias.grad before backward&apos;)
print(net.conv1.bias.grad)

loss.backward()

print(&apos;conv1.bias.grad after backward&apos;)
print(net.conv1.bias.grad)
</code></pre>
<pre><code class="language-python">conv1.bias.grad before backward
Variable containing:
 0
 0
 0
 0
 0
 0
[torch.FloatTensor of size 6]

conv1.bias.grad after backward
Variable containing:
 0.1392
-0.1155
 0.0247
 0.1121
-0.0559
 0.0363
[torch.FloatTensor of size 6]
</code></pre>
<p>&#x73B0;&#x5728;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#x600E;&#x4E48;&#x4F7F;&#x7528;&#x635F;&#x5931;&#x51FD;&#x6570;&#x4E86;&#x3002;</p>
<p><em>&#x5EF6;&#x4F38;&#x9605;&#x8BFB;</em></p>
<p>&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x5305;&#x5305;&#x542B;&#x6784;&#x5EFA;&#x6DF1;&#x5EA6;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x591A;&#x4E2A;&#x6A21;&#x5757;&#x548C;&#x635F;&#x5931;&#x51FD;&#x6570;&#x3002;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x6587;&#x6863;&#x5217;&#x8868; <a href="http://pytorch.org/docs/nn">&#x5728;&#x8FD9;&#x91CC;</a></p>
<p>&#x4EC5;&#x5269;&#x7684;&#x4E00;&#x4E2A;&#x8981;&#x5B66;&#x4E60;&#x7684;&#x4E1C;&#x897F;&#xFF1A;</p>
<ul>
<li>&#x66F4;&#x65B0;&#x7F51;&#x7EDC;&#x6743;&#x91CD;</li>
</ul>
<!-- -->
<h4 id>&#x66F4;&#x65B0;&#x6743;&#x91CD;</h4>
<p>&#x5B9E;&#x8DF5;&#x4E2D;&#x6700;&#x7B80;&#x5355;&#x7684;&#x66F4;&#x65B0;&#x89C4;&#x5219;&#x662F;&#x968F;&#x673A;&#x68AF;&#x5EA6;&#x4E0B;&#x964D;&#xFF08;SGD&#xFF09;&#xFF1A;</p>
<pre><code class="language-python">weight = weight - learning_rate * gradient
</code></pre>
<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7B80;&#x5355;&#x7684; Python &#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#xFF1A;</p>
<pre><code class="language-python">learning_rate = 0.01
for f in net.parameters():
    f.data.sub_(f.grad.data * learning_rate)
</code></pre>
<p>&#x7136;&#x800C;&#xFF0C;&#x5F53;&#x60A8;&#x4F7F;&#x7528;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x65F6;&#xFF0C;&#x60A8;&#x5E0C;&#x671B;&#x4F7F;&#x7528;&#x5404;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x66F4;&#x65B0;&#x89C4;&#x5219;&#xFF0C;&#x4F8B;&#x5982; SGD&#xFF0C;Nesterov-SGD&#xFF0C;Adam&#xFF0C;RMSProp &#x7B49;&#x7B49;&#x3002;&#x4E3A;&#x4E86;&#x5B9E;&#x73B0;&#x8FD9;&#x4E00;&#x70B9;&#xFF0C;&#x6211;&#x4EEC;&#x6784;&#x5EFA;&#x4E00;&#x4E2A;&#x5C0F;&#x7684;&#x5305;&#xFF1A;<code>torch.optim</code>&#xFF0C;&#x6765;&#x5B9E;&#x73B0;&#x6240;&#x6709;&#x7684;&#x65B9;&#x6CD5;&#x3002;&#x4F7F;&#x7528;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF1A;</p>
<pre><code class="language-python">import torch.optim as optim

# create your optimizer
optimizer = optim.SGD(net.parameters(), lr=0.01)

# in your training loop:
optimizer.zero_grad()   # zero the gradient buffers
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()    # Does the update
</code></pre>
<h3 id>&#x8BAD;&#x7EC3;&#x4E00;&#x4E2A;&#x5206;&#x7C7B;&#x5668;</h3>
<p>&#x5728;&#x6B64;&#xFF0C;&#x4F60;&#x5DF2;&#x7ECF;&#x77E5;&#x9053;&#x5982;&#x4F55;&#x5B9A;&#x4E49;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#xFF0C;&#x8BA1;&#x7B97;&#x635F;&#x5931;&#x4EE5;&#x53CA;&#x66F4;&#x65B0;&#x7F51;&#x7EDC;&#x6743;&#x91CD;&#x3002;</p>
<p>&#x73B0;&#x5728;&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x60F3;&#xFF0C;</p>
<h4 id>&#x6570;&#x636E;&#x600E;&#x4E48;&#x529E;</h4>
<p>&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;&#x5F53;&#x4F60;&#x5904;&#x7406;&#x56FE;&#x50CF;&#x3001;&#x6587;&#x672C;&#x3001;&#x97F3;&#x9891;&#x6216;&#x89C6;&#x9891;&#x6570;&#x636E;&#x65F6;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x6807;&#x51C6;&#x7684; python &#x5305;&#x6765;&#x5C06;&#x6570;&#x636E;&#x8F7D;&#x5165;&#x5230; numpy &#x6570;&#x7EC4;&#x4E2D;&#x3002;&#x7136;&#x540E;&#x4F60;&#x53EF;&#x4EE5;&#x5C06;&#x8FD9;&#x4E2A;&#x6570;&#x7EC4;&#x8F6C;&#x5316;&#x4E3A; <code>torch.Tensor</code>&#x3002;</p>
<ul>
<li>&#x5BF9;&#x4E8E;&#x56FE;&#x50CF;&#xFF0C;&#x8BF8;&#x5982; Pillow, OpenCV &#x8FD9;&#x4E9B;&#x5305;&#x5F88;&#x597D;&#x7528;&#x3002;</li>
<li>&#x5BF9;&#x4E8E;&#x97F3;&#x9891;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; scipy &#x548C; librosa&#x3002;</li>
<li>&#x5BF9;&#x4E8E;&#x6587;&#x672C;&#xFF0C;&#x8981;&#x4E48;&#x4F7F;&#x7528;&#x539F;&#x59CB;&#x7684; Python &#x6216; Cython &#x8F7D;&#x5165;&#x65B9;&#x5F0F;&#xFF0C;&#x8981;&#x4E48;&#x4F7F;&#x7528; NLTK &#x548C; SpaCy&#x3002;</li>
</ul>
<!-- -->
<p>&#x7279;&#x522B;&#x7684;&#x5BF9;&#x4E8E; <code>vision</code>&#xFF0C;&#x6211;&#x4EEC;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x53EB;&#x505A; <code>torchvision</code> &#x7684;&#x5305;&#xFF0C;&#x5B83;&#x6709;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x6570;&#x636E;&#x96C6;&#xFF08;Imagenet, CIFAR10, MNIST &#x7B49;&#xFF09;&#x7684;&#x6570;&#x636E;&#x8F7D;&#x5165;&#x5668;&#xFF0C;&#x4EE5;&#x53CA;&#x56FE;&#x50CF;&#x7684;&#x6570;&#x636E;&#x8F6C;&#x6362;&#x5668;, <code>torchvision.datasets</code> &#x548C; <code>torch.utils.data.DataLoader</code>&#x3002;</p>
<p>&#x8FD9;&#x63D0;&#x4F9B;&#x4E86;&#x5DE8;&#x5927;&#x7684;&#x4FBF;&#x5229;&#xFF0C;&#x907F;&#x514D;&#x7F16;&#x5199;&#x6837;&#x677F;&#x4EE3;&#x7801;&#x3002;</p>
<p>&#x5728;&#x672C;&#x6559;&#x7A0B;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528; CIFAR10 &#x6570;&#x636E;&#x96C6;&#x3002;&#x5B83;&#x6709; 10 &#x4E2A;&#x7C7B;&#x522B;&#xFF1A;&#x2018;airplane&#x2019;, &#x2018;automobile&#x2019;, &#x2018;bird&#x2019;, &#x2018;cat&#x2019;, &#x2018;deer&#x2019;, &#x2018;dog&#x2019;, &#x2018;frog&#x2019;, &#x2018;horse&#x2019;, &#x2018;ship&#x2019;, &#x2018;truck&#x2019;&#x3002;CIFAR10 &#x4E2D;&#x7684;&#x56FE;&#x50CF;&#x5C3A;&#x5BF8;&#x5728; 3x32x32&#xFF0C;&#x5373; 3 &#x901A;&#x9053;&#x5F69;&#x8272;&#x56FE;&#x50CF;&#xFF0C;32x32 &#x50CF;&#x7D20;&#x5927;&#x5C0F;&#x3002;</p>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/pytorch-3.png" class="kg-image" alt="Pytorch&#x6574;&#x7406;&#xFF1A;60&#x5206;&#x949F;&#x5165;&#x95E8;"></figure>
<!--kg-card-begin: markdown-->
<h3 id>&#x8BAD;&#x7EC3;&#x4E00;&#x4E2A;&#x56FE;&#x50CF;&#x5206;&#x7C7B;&#x5668;</h3>
<p>&#x6211;&#x4EEC;&#x5C06;&#x6309;&#x987A;&#x5E8F;&#x5B8C;&#x6210;&#x4EE5;&#x4E0B;&#x6B65;&#x9AA4;&#xFF1A;</p>
<ol>
<li>&#x8F7D;&#x5165;&#x548C;&#x89C4;&#x8303;&#x5316; CIFAR10 &#x7684;&#x8BAD;&#x7EC3;&#x548C;&#x6D4B;&#x8BD5;&#x96C6;&#xFF0C;&#x4F7F;&#x7528; <code>torchvision</code></li>
<li>&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</li>
<li>&#x5B9A;&#x4E49;&#x635F;&#x5931;&#x51FD;&#x6570;</li>
<li>&#x5728;&#x8BAD;&#x7EC3;&#x96C6;&#x4E0A;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;</li>
<li>&#x5728;&#x6D4B;&#x8BD5;&#x96C6;&#x4E0A;&#x6D4B;&#x8BD5;&#x7F51;&#x7EDC;</li>
</ol>
<!-- -->
<h4 id="1cifar10">1. &#x8F7D;&#x5165;&#x548C;&#x89C4;&#x8303;&#x5316; CIFAR10</h4>
<p>&#x4F7F;&#x7528; <code>torchvision</code>&#xFF0C;&#x8F7D;&#x5165; CIFAR10 &#x975E;&#x5E38;&#x7B80;&#x5355;&#x3002;</p>
<pre><code class="language-python">import torch
import torchvision
import torchvision.transforms as transforms
</code></pre>
<p>torchvision datasets &#x7684;&#x8F93;&#x51FA;&#x65F6;&#x8303;&#x56F4;&#x5728; <code>[0, 1]</code> &#x7684; PILImage &#x56FE;&#x50CF;&#x3002;&#x6211;&#x4EEC;&#x5C06;&#x5B83;&#x4EEC;&#x8F6C;&#x6362;&#x4E3A;&#x89C4;&#x8303;&#x533A;&#x95F4; <code>[-1, 1]</code> &#x7684; Tensor&#x3002;</p>
<pre><code class="language-python">transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root=&apos;./data&apos;, train=True,
                                       download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root=&apos;./data&apos;, train=False,
                                       download=True, transform=transform)

testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=True, num_workers=2)

classes = (&apos;plane&apos;, &apos;car&apos;, &apos;bird&apos;, &apos;cat&apos;, &apos;deer&apos;, &apos;dog&apos;, &apos;frog&apos;, &apos;horse&apos;, &apos;ship&apos;, &apos;truck&apos;)
</code></pre>
<p>&#x8BA9;&#x6211;&#x4EEC;&#x5C55;&#x793A;&#x4E00;&#x4E9B;&#x8BAD;&#x7EC3;&#x56FE;&#x50CF;&#x3002;</p>
<pre><code class="language-python">import matplotlib.pyplot as plt
import numpy as np

# functions to show image
def imshow(img):
    img = img / 2 + 0.5 # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))

# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()

# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(&apos; &apos;.join(&apos;%5s&apos; % classes[labels[j]] for j in range(4)))
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/pytorch-4.png" class="kg-image" alt="Pytorch&#x6574;&#x7406;&#xFF1A;60&#x5206;&#x949F;&#x5165;&#x95E8;"></figure>
<!--kg-card-begin: markdown-->
<h4 id="2">2. &#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</h4>
<p>&#x590D;&#x5236;&#x5728;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x90A3;&#x4E00;&#x8282;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#xFF0C;&#x5C06;&#x5176;&#x66F4;&#x6539;&#x4E3A; 3 &#x901A;&#x9053;&#x56FE;&#x50CF;&#x8F93;&#x5165;&#xFF08;&#x800C;&#x4E0D;&#x662F;&#x539F;&#x59CB;&#x7684;&#x5355;&#x901A;&#x9053;&#x8F93;&#x5165;&#xFF09;&#x3002;</p>
<pre><code class="language-python">from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()
</code></pre>
<h4 id="3">3. &#x5B9A;&#x4E49;&#x635F;&#x5931;&#x51FD;&#x6570;&#x548C;&#x4F18;&#x5316;&#x5668;</h4>
<p>&#x8BA9;&#x6211;&#x4EEC;&#x6765;&#x4F7F;&#x7528;&#x5206;&#x7C7B;&#x4EA4;&#x53C9;&#x71B5;&#x548C;&#x5E26;&#x6709;&#x52A8;&#x91CF;&#x7684; SGD</p>
<pre><code class="language-python">import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
</code></pre>
<h4 id="4">4. &#x8BAD;&#x7EC3;&#x7F51;&#x7EDC;</h4>
<pre><code class="language-python">for epoch in range(10): # loop over the dataset multiple times
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the input
        inputs, labels = data

        # wrap time in Variable
        inputs, labels = Variable(inputs), Variable(labels)

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.data[0]
        if i % 2000 == 1999:   # print every 2000 mini-batches
            print(&apos;[%d, %5d] loss: %.3f&apos; %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print(&apos;Finished Training&apos;)
</code></pre>
<pre><code class="language-python">[1,  2000] loss: 1.184
[1,  4000] loss: 1.206
[1,  6000] loss: 1.186
[1,  8000] loss: 1.162
[1, 10000] loss: 1.195
[1, 12000] loss: 1.165
[2,  2000] loss: 1.095
[2,  4000] loss: 1.076
[2,  6000] loss: 1.086
[2,  8000] loss: 1.092
[2, 10000] loss: 1.060
[2, 12000] loss: 1.110
[3,  2000] loss: 0.999
[3,  4000] loss: 1.005
[3,  6000] loss: 1.016
[3,  8000] loss: 1.016
[3, 10000] loss: 1.017
[3, 12000] loss: 1.023
[4,  2000] loss: 0.922
[4,  4000] loss: 0.933
[4,  6000] loss: 0.959
[4,  8000] loss: 0.975
[4, 10000] loss: 0.985
[4, 12000] loss: 0.968
[5,  2000] loss: 0.861
[5,  4000] loss: 0.908
[5,  6000] loss: 0.911
[5,  8000] loss: 0.932
[5, 10000] loss: 0.920
[5, 12000] loss: 0.919
[6,  2000] loss: 0.839
[6,  4000] loss: 0.853
[6,  6000] loss: 0.887
[6,  8000] loss: 0.891
[6, 10000] loss: 0.890
[6, 12000] loss: 0.876
[7,  2000] loss: 0.819
[7,  4000] loss: 0.808
[7,  6000] loss: 0.831
[7,  8000] loss: 0.852
[7, 10000] loss: 0.842
[7, 12000] loss: 0.869
[8,  2000] loss: 0.761
[8,  4000] loss: 0.784
[8,  6000] loss: 0.808
[8,  8000] loss: 0.827
[8, 10000] loss: 0.841
[8, 12000] loss: 0.860
[9,  2000] loss: 0.731
[9,  4000] loss: 0.758
[9,  6000] loss: 0.801
[9,  8000] loss: 0.784
[9, 10000] loss: 0.831
[9, 12000] loss: 0.817
[10,  2000] loss: 0.723
[10,  4000] loss: 0.733
[10,  6000] loss: 0.775
[10,  8000] loss: 0.763
[10, 10000] loss: 0.802
[10, 12000] loss: 0.799
Finished Training
</code></pre>
<h4 id="5">5. &#x5728;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#x4E0A;&#x6D4B;&#x8BD5;&#x7F51;&#x7EDC;</h4>
<p>&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x5728;&#x8BAD;&#x7EC3;&#x96C6;&#x4E0A;&#x8BAD;&#x7EC3;&#x4E86; 10 &#x8F6E;&#x3002;&#x4F46;&#x662F;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x68C0;&#x67E5;&#x7F51;&#x7EDC;&#x662F;&#x5426;&#x6709;&#x5B66;&#x5230;&#x4EC0;&#x4E48;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x68C0;&#x6D4B;&#x9884;&#x6D4B;&#x7684;&#x7C7B;&#x522B;&#x6807;&#x7B7E;&#xFF0C;&#x518D;&#x4E0E;&#x771F;&#x5B9E;&#x6807;&#x7B7E;&#x8FDB;&#x884C;&#x5BF9;&#x6BD4;&#x3002;&#x5982;&#x679C;&#x9884;&#x6D4B;&#x662F;&#x5BF9;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x8FD9;&#x4E2A;&#x6837;&#x672C;&#x52A0;&#x5230;&#x5206;&#x7C7B;&#x6B63;&#x786E;&#x7684;&#x5217;&#x8868;&#x4E2D;&#x3002;</p>
<p>Okay&#xFF0C;&#x7B2C;&#x4E00;&#x6B65;&#x3002;&#x8BA9;&#x6211;&#x4EEC;&#x5148;&#x5C55;&#x793A;&#x4E00;&#x4E9B;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#x96C6;&#x4E2D;&#x7684;&#x56FE;&#x50CF;&#x3002;</p>
<pre><code class="language-python">dataiter = iter(testloader)
images, labels = dataiter.next()

# print images
imshow(torchvision.utils.make_grid(images))
print(&apos;GroundTruth: &apos;, &apos; &apos;.join(&apos;%5s&apos; % classes[labels[j]] for j in range(4)))
</code></pre>
<!--kg-card-end: markdown-->
<figure class="kg-card kg-image-card"><img src="https://gaussic.com/content/images/2020/01/pytorch-5.png" class="kg-image" alt="Pytorch&#x6574;&#x7406;&#xFF1A;60&#x5206;&#x949F;&#x5165;&#x95E8;"></figure>
<!--kg-card-begin: markdown-->
<p>&#x518D;&#x6765;&#x770B;&#x4E00;&#x4E0B;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x8BA4;&#x4E3A;&#x8FD9;&#x4E9B;&#x6837;&#x672C;&#x662F;&#x4EC0;&#x4E48;&#x3002;</p>
<p>&#x8F93;&#x51FA;&#x662F; 10 &#x4E2A;&#x7C7B;&#x522B;&#x7684;&#x80FD;&#x91CF;&#x3002;&#x4E00;&#x4E2A;&#x7C7B;&#x522B;&#x80FD;&#x91CF;&#x8D8A;&#x9AD8;&#xFF0C;&#x7F51;&#x7EDC;&#x5C31;&#x66F4;&#x591A;&#x5730;&#x8BA4;&#x4E3A;&#x56FE;&#x50CF;&#x662F;&#x8FD9;&#x4E2A;&#x7279;&#x5B9A;&#x7684;&#x7C7B;&#x522B;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x8BA9;&#x6211;&#x4EEC;&#x83B7;&#x53D6;&#x6700;&#x9AD8;&#x80FD;&#x91CF;&#x7C7B;&#x522B;&#x7684;&#x7D22;&#x5F15;&#x3002;</p>
<pre><code class="language-python">outputs = net(Variable(images))

_, predicted = torch.max(outputs.data, 1)

print(&apos;Predicted: &apos;, &apos; &apos;.join(&apos;%5s&apos; % classes[predicted[j][0]] for j in range(4)))
</code></pre>
<pre><code class="language-python">Predicted:  horse plane horse  frog
</code></pre>
<p>&#x7ED3;&#x679C;&#x770B;&#x8D77;&#x6765;&#x4E0D;&#x9519;&#x3002;</p>
<p>&#x8BA9;&#x6211;&#x4EEC;&#x518D;&#x6765;&#x770B;&#x770B;&#x7F51;&#x7EDC;&#x5728;&#x6574;&#x4E2A;&#x6570;&#x636E;&#x96C6;&#x4E0A;&#x7684;&#x6027;&#x80FD;&#x3002;</p>
<pre><code class="language-python">correct = 0
total = 0
for data in testloader:
    images, labels = data
    outputs = net(Variable(images))
    _, predicted = torch.max(outputs.data, 1)
    total += labels.size(0)
    correct += (predicted == labels).sum()

print(&apos;Accuracy of the network on the 10000 test images: %d %%&apos; % (100 * correct / total))
</code></pre>
<pre><code class="language-python">Accuracy of the network on the 10000 test images: 63 %
</code></pre>
<p>&#x8FD9;&#x4E2A;&#x7ED3;&#x679C;&#x770B;&#x8D77;&#x6765;&#x8FDC;&#x6BD4;&#x968F;&#x673A;&#x62BD;&#x53D6;&#x8981;&#x597D;&#xFF0C;&#x968F;&#x673A;&#x62BD;&#x53D6;&#x7684;&#x6982;&#x7387;&#x4E3A; 10%&#x3002;&#x770B;&#x8D77;&#x6765;&#x7F51;&#x7EDC;&#x786E;&#x5B9E;&#x5B66;&#x5230;&#x4E86;&#x4E00;&#x4E9B;&#x4E1C;&#x897F;&#x3002;</p>
<p>&#x90A3;&#x4E48;&#xFF0C;&#x6709;&#x54EA;&#x4E9B;&#x7C7B;&#x522B;&#x8868;&#x73B0;&#x4F18;&#x79C0;&#xFF0C;&#x54EA;&#x4E9B;&#x7C7B;&#x522B;&#x8868;&#x73B0;&#x4E0D;&#x4F73;&#x5462;&#xFF1F;</p>
<pre><code class="language-python">class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
for data in testloader:
    images, labels = data
    outputs = net(Variable(images))
    _, predicted = torch.max(outputs.data, 1)
    c = (predicted == labels).squeeze()
    for i in range(4):
        label = labels[i]
        class_correct[label] += c[i]
        class_total[label] += 1

for i in range(10):
    print(&apos;Accuracy of %5s: %2d %%&apos; % (classes[i], 100 * class_correct[i] / class_total[i]))
</code></pre>
<pre><code class="language-python">Accuracy of plane: 59 %
Accuracy of   car: 73 %
Accuracy of  bird: 51 %
Accuracy of   cat: 46 %
Accuracy of  deer: 51 %
Accuracy of   dog: 54 %
Accuracy of  frog: 76 %
Accuracy of horse: 69 %
Accuracy of  ship: 78 %
Accuracy of truck: 72 %
</code></pre>
<p>Okay&#xFF0C;&#x8FD8;&#x6709;&#x4EC0;&#x4E48;&#x8981;&#x8BF4;&#x660E;&#x7684;&#xFF1F;</p>
<p>&#x5982;&#x4F55;&#x5728; GPU &#x4E0A;&#x9762;&#x8FD0;&#x884C;&#x8FD9;&#x4E2A;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#xFF1F;</p>
<h3 id="gpu">&#x5728;GPU&#x4E0A;&#x8BAD;&#x7EC3;</h3>
<p>&#x4E0E;&#x4F60;&#x5982;&#x4F55;&#x5C06; Tensor &#x8F6C;&#x79FB;&#x5230; GPU &#x4E0A;&#x7C7B;&#x4F3C;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5C06;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x8F6C;&#x79FB;&#x5230; GPU &#x4E0A;&#x3002;&#x8FD9;&#x5C06;&#x9012;&#x5F52;&#x7684;&#x904D;&#x5386;&#x6240;&#x6709;&#x7684;&#x6A21;&#x5757;&#x5E76;&#x5C06;&#x5B83;&#x4EEC;&#x7684;&#x53C2;&#x6570;&#x548C;&#x7F13;&#x5B58;&#x8F6C;&#x5316;&#x4E3A; CUDA tensors&#x3002;</p>
<pre><code class="language-python">net.cuda()
</code></pre>
<p>&#x8BB0;&#x4F4F;&#xFF0C;&#x4F60;&#x8FD8;&#x5FC5;&#x987B;&#x5728;&#x6BCF;&#x4E00;&#x6B65;&#x5C06;&#x8F93;&#x5165;&#x548C;&#x7ED3;&#x679C;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x5230; GPU &#x4E0A;&#xFF1A;</p>
<pre><code class="language-python">inputs, labels = Variable(inputs.cuda()), Variable(labels.cuda())
</code></pre>
<p>&#x4E3A;&#x4EC0;&#x4E48;&#x6211;&#x6CA1;&#x6709;&#x6CE8;&#x610F;&#x5230;&#x76F8;&#x6BD4; CPU &#x7684;&#x5DE8;&#x5927;&#x7684;&#x52A0;&#x901F;&#xFF1F;&#x56E0;&#x4E3A;&#x4F60;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x975E;&#x5E38;&#x5C0F;&#x3002;</p>
<p><strong>&#x8BAD;&#x7EC3;</strong>&#xFF1A;&#x8BD5;&#x7740;&#x589E;&#x52A0;&#x4F60;&#x7684;&#x7F51;&#x7EDC;&#x5BBD;&#x5EA6;&#xFF08;&#x5C06;&#x7B2C;&#x4E00;&#x4E2A; <code>nn.Conv2d</code> &#x589E;&#x5E7F; 2&#xFF0C;&#x5C06;&#x7B2C;&#x4E8C;&#x4E2A; <code>nn.Conv2d</code> &#x589E;&#x5E7F; 1 - &#x5B83;&#x4EEC;&#x9700;&#x8981;&#x76F8;&#x540C;&#x7684;&#x6570;&#x91CF;&#xFF09;&#xFF0C;&#x770B;&#x770B;&#x4F60;&#x7684;&#x7F51;&#x7EDC;&#x63D0;&#x901F;&#x4E86;&#x591A;&#x5C11;&#x3002;</p>
<p><strong>&#x76EE;&#x6807;&#x8FBE;&#x6210;&#xFF1A;</strong></p>
<ul>
<li>&#x7406;&#x89E3; PyTorch &#x7684; Tensor &#x5E93;&#x4EE5;&#x53CA;&#x9AD8;&#x5C42;&#x6B21;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</li>
<li>&#x8BAD;&#x7EC3;&#x4E00;&#x4E2A;&#x5C0F;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x6765;&#x5206;&#x7C7B;&#x56FE;&#x50CF;</li>
</ul>
<!-- -->
<p>&#x8F6C;&#x8F7D;&#x8BF7;&#x8BF4;&#x660E;&#x51FA;&#x5904;&#xFF1A;<a href="https://gaussic.com/pytorch-60-minutes/">PyTorch &#x6574;&#x7406;&#xFF1A;60 &#x5206;&#x949F;&#x5165;&#x95E8;</a></p>
<!--kg-card-end: markdown-->
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>