1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="utf-8"> 5 6 <meta name="renderer" content="webkit"> 7 <meta http-equiv="X-UA-Compatible" content="IE=edge" > 8 <link rel="dns-prefetch" href="http://Lyrichu.github.io"> 9 <title>Lyrichu's Blog</title> 10 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> 11 <meta name="description" content="To be the best yourself!"> 12<meta name="keywords" content="coding,math,machine learning"> 13<meta property="og:type" content="website"> 14<meta property="og:title" content="Lyrichu's Blog"> 15<meta property="og:url" content="http://Lyrichu.github.io/page/2/index.html"> 16<meta property="og:site_name" content="Lyrichu's Blog"> 17<meta property="og:description" content="To be the best yourself!"> 18<meta property="og:locale" content="zh-CN"> 19<meta name="twitter:card" content="summary"> 20<meta name="twitter:title" content="Lyrichu's Blog"> 21<meta name="twitter:description" content="To be the best yourself!"> 22 23 <link rel="alternative" href="/atom.xml" title="Lyrichu's Blog" type="application/atom+xml"> 24 25 26 <link rel="icon" href="/favicon.png"> 27
28 <link rel="stylesheet" type="text/css" href="/./main.0cf68a.css"> 29 <style type="text/css"> 30 31 #container.show { 32 background: linear-gradient(200deg,#a0cfe4,#e8c37e); 33 } 34 </style> 35 36 37 38 39</head> 40 41<body> 42 <div id="container" q-class="show:isCtnShow"> 43 <canvas id="anm-canvas" class="anm-canvas"></canvas> 44 <div class="left-col" q-class="show:isShow"> 45 46<div class="overlay" style="background: #4d4d4d"></div> 47<div class="intrude-less"> 48 <header id="header" class="inner"> 49 <a href="/" class="profilepic"> 50 <img src="http://t1.aixinxi.net/o_1cegci9ej58d14rh1ts1siqcraa.jpg-w.jpg" class="js-avatar"> 51 </a> 52 <hgroup> 53 <h1 class="header-author"><a href="/">lyrichu</a></h1> 54 </hgroup> 55 56 <p class="header-subtitle">Love life,love coding!</p> 57 58 59 <nav class="header-menu"> 60 <ul> 61 62 <li><a href="/">主页</a></li> 63 64 </ul> 65 </nav> 66 <nav class="header-smart-menu"> 67 68 69 <a q-on="click: openSlider(e, 'innerArchive')" href="javascript:void(0)">æææç« </a> 70 71 72 73 <a q-on="click: openSlider(e, 'friends')" href="javascript:void(0)">åæ é¾æ¥</a> 74 75 76 77 <a q-on="click: openSlider(e, 'aboutme')" href="javascript:void(0)">å ³äºæ</a> 78 79 80 </nav> 81 <nav class="header-nav"> 82 <div class="social"> 83 84 <a class="github" target="_blank" href="http://www.github.com/Lyrichu" title="github"><i class="icon-github"></i></a> 85 86 <a class="weibo" target="_blank" href="#" title="weibo"><i class="icon-weibo"></i></a> 87 88 <a class="rss" target="_blank" href="#" title="rss"><i class="icon-rss"></i></a> 89 90 <a class="zhihu" target="_blank" href="https://www.zhihu.com/people/hu-cheng-chun-71" title="zhihu"><i class="icon-zhihu"></i></a> 91 92 </div> 93 </nav> 94 </header> 95</div> 96 97 </div> 98 <div class="mid-col" q-class="show:isShow,hide:isShow|isFalse"> 99 100<nav id="mobile-nav"> 101 <div class="overlay js-overlay" style="background: #4d4d4d"></div> 102 <div class="btnctn js-mobile-btnctn"> 103 <div class="slider-trigger list" q-on="click: openSlider(e)"><i class="icon icon-sort"></i></div> 104 </div> 105 <div class="intrude-less"> 106 <header id="header" class="inner"> 107 <div class="profilepic"> 108 <img src="http://t1.aixinxi.net/o_1cegci9ej58d14rh1ts1siqcraa.jpg-w.jpg" class="js-avatar"> 109 </div> 110 <hgroup> 111 <h1 class="header-author js-header-author">lyrichu</h1> 112 </hgroup> 113 114 <p class="header-subtitle"><i class="icon icon-quo-left"></i>Love life,love coding!<i class="icon icon-quo-right"></i></p> 115 116 117 118 119 120 121 122 <nav class="header-nav"> 123 <div class="social"> 124 125 <a class="github" target="_blank" href="http://www.github.com/Lyrichu" title="github"><i class="icon-github"></i></a> 126 127 <a class="weibo" target="_blank" href="#" title="weibo"><i class="icon-weibo"></i></a> 128 129 <a class="rss" target="_blank" href="#" title="rss"><i class="icon-rss"></i></a> 130 131 <a class="zhihu" target="_blank" href="https://www.zhihu.com/people/hu-cheng-chun-71" title="zhihu"><i class="icon-zhihu"></i></a> 132 133 </div> 134 </nav> 135 136 <nav class="header-menu js-header-menu"> 137 <ul style="width: 50%"> 138 139 140 <li style="width: 100%"><a href="/">主页</a></li> 141 142 </ul> 143 </nav> 144 </header> 145 </div> 146 <div class="mobile-mask" style="display:none" q-show="isShow"></div> 147</nav> 148 149 <div id="wrapper" class="body-wrap"> 150 <div class="menu-l"> 151 <div class="canvas-wrap"> 152 <canvas data-colors="#eaeaea" data-sectionHeight="100" data-contentId="js-content" id="myCanvas1" class="anm-canvas"></canvas> 153 </div> 154 <div id="js-content" class="content-ll"> 155 156 157 <article id="post-DCGAN代ç ç®å解读" class="article article-type-post article-index" itemscope itemprop="blogPost"> 158 <div class="article-inner"> 159 160 <header class="article-header"> 161 162 163 <h1 itemprop="name"> 164 <a class="article-title" href="/2018/05/27/DCGAN代ç ç®å解读/">DCGAN代ç ç®å解读</a> 165 </h1> 166 167 168 169 <a href="/2018/05/27/DCGAN代ç ç®å解读/" class="archive-article-date"> 170 <time datetime="2018-05-27T09:21:51.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-05-27</time> 171</a> 172 173 </header> 174 175 <div class="article-entry" itemprop="articleBody"> 176 177 <h3 id="nbsp-nbsp-nbsp-nbsp-ä¹åå¨DCGANæç« ç®å解读é说æäºDCGANçåçãæ¬æ¬¡æ¥å®ç°ä¸ä¸ªDCGAN-并卿°æ®éä¸å®é æµè¯å®çææãæ¬æ¬¡çä»£ç æ¥èªgithub弿ºä»£ç DCGAN-tensorflow-æè°¢carpedm20çè´¡ç®"><a href="#nbsp-nbsp-nbsp-nbsp-ä¹åå¨DCGANæç« ç®å解读é说æäºDCGANçåçãæ¬æ¬¡æ¥å®ç°ä¸ä¸ªDCGAN-并卿°æ®éä¸å®é æµè¯å®çææãæ¬æ¬¡çä»£ç æ¥èªgithub弿ºä»£ç DCGAN-tensorflow-æè°¢carpedm20çè´¡ç®" class="headerlink" title=" ä¹åå¨DCGANæç« ç®å解读é说æäºDCGANçåçãæ¬æ¬¡æ¥å®ç°ä¸ä¸ªDCGAN,并卿°æ®éä¸å®é æµè¯å®çææãæ¬æ¬¡çä»£ç æ¥èªgithub弿ºä»£ç DCGAN-tensorflow,æè°¢carpedm20çè´¡ç®!"></a> ä¹åå¨<a href="http://www.movieb2b.com/2018/05/18/dcgan-%E6%96%87%E7%AB%A0%E4%BB%A5%E5%8F%8A%E4%BB%A3%E7%A0%81%E7%AE%80%E5%8D%95%E8%A7%A3%E8%AF%BB/" target="_blank" rel="noopener">DCGANæç« ç®å解读</a>é说æäºDCGANçåçãæ¬æ¬¡æ¥å®ç°ä¸ä¸ªDCGAN,并卿°æ®éä¸å®é æµè¯å®çææãæ¬æ¬¡çä»£ç æ¥èªgithub弿ºä»£ç <a href="https://github.com/carpedm20/DCGAN-tensorflow" target="_blank" rel="noopener">DCGAN-tensorflow</a>,æè°¢<a href="https://github.com/carpedm20" target="_blank" rel="noopener">carpedm20</a>çè´¡ç®!</h3><h3 id="1-代ç ç»æ"><a href="#1-代ç ç»æ" class="headerlink" title="1. 代ç ç»æ"></a>1. 代ç ç»æ</h3><h3 id="nbsp-nbsp-nbsp-nbsp-代ç ç»æå¦ä¸å¾1æç¤º"><a href="#nbsp-nbsp-nbsp-nbsp-代ç ç»æå¦ä¸å¾1æç¤º" class="headerlink" title=" 代ç ç»æå¦ä¸å¾1æç¤º:"></a> 代ç ç»æå¦ä¸å¾1æç¤º:</h3><p><div align="center"><br><img src="http://t1.aixinxi.net/o_1cebffbrgs8j1icd1d0p1blo6uca.png-w.jpg"><br></div></p> 178<center>å¾1 代ç ç»æ</center> 179 180<p>æä»¬ä¸»è¦å ³æ³¨çæä»¶ä¸º<strong>download.py</strong>,<strong>main.py</strong>,<strong>model.py</strong>,<strong>ops.py</strong>以å<strong>utils.py</strong>ãå ¶å®çæä»¶åå就大æ¦å¯ä»¥çåºå个æä»¶çä½ç¨äºã</p> 181<ul> 182<li>
182download.py主è¦ä¸è½½æ°æ®éå°æ¬å°ï¼è¿éæä»¬éè¦ä¸è½½ä¸ä¸ªæ°æ®é:<a href="http://yann.lecun.com/exdb/mnist/" target="_blank" rel="noopener">MNIST</a>,<a href="http://lsun.cs.princeton.edu/2016/" target="_blank" rel="noopener">lsun</a>以å<a href="http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html" target="_blank" rel="noopener">celebA</a>ã</li> 183<li>main.pyæ¯ä¸»å½æ°ï¼ç¨äºé ç½®å½ä»¤è¡åæ°ä»¥å模åçè®ç»åæµè¯ã</li> 184<li>model.py æ¯å®ä¹DCGAN模åçå°æ¹ï¼ä¹æ¯æä»¬è¦éç¹å ³æ³¨ç代ç ã</li> 185<li>ops.py å®ä¹äºå¾å¤æé 模åçéè¦å½æ°ï¼æ¯å¦<strong>batch_norm</strong>(BNæä½),<strong>conv2d</strong>(å·ç§¯æä½),<strong>deconv2d</strong>(ç¿»å·ç§¯æä½)çã</li> 186<li><p>utils.py å®ä¹å¾å¤æç¨çå ¨å±è¾ å©å½æ°ã</p> 187<h3 id="2-代ç ç®å解读"><a href="#2-代ç ç®å解读" class="headerlink" title="2. 代ç ç®å解读"></a>2. 代ç ç®å解读</h3><h4 id="2-1-download-py"><a href="#2-1-download-py" class="headerlink" title="2.1 download.py"></a>2.1 <strong>download.py</strong></h4><h4 id="download-py代ç å¦ä¸"><a href="#download-py代ç å¦ä¸" class="headerlink" title="download.py代ç å¦ä¸:"></a>download.py代ç å¦ä¸:</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">
18753</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">"""</span></span><br><span class="line"><span class="string">Modification of https://github.com/stanfordnlp/treelstm/blob/master/scripts/download.py</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Downloads the following:</span></span><br><span class="line"><span class="string">- Celeb-A dataset</span></span><br><span class="line"><span class="string">- LSUN dataset</span></span><br><span class="line"><span class="string">- MNIST dataset</span></span><br><span class="line"><span class="string">"""</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> __future__ <span class="keyword">
187import</span> print_function</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> gzip</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> shutil</span><br><span class="line"><span class="keyword">import</span> zipfile</span><br><span class="line"><span class="keyword">import</span> argparse</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"><span class="keyword">from</span> tqdm <span class="keyword">import</span> tqdm</span><br><span class="line"><span class="keyword">from</span> six.moves <span class="keyword">import</span> urllib</span><br><span class="line"></span><br><span class="line">parser = argparse.ArgumentParser(description=<span class="string">'Download dataset for DCGAN.'</span>)</span><br><span class="line">parser.add_argument(<span class="string">'datasets'</span>, metavar=<span class="string">'N'</span>, type=str, nargs=<span class="string">'+'</span>, choices=[<span class="string">'celebA'</span>, <span class="string">'lsun'</span>, <span class="string">'mnist'</span>],</span><br><span class="line"> help=<span class="string">'name of dataset to download [celebA, lsun, mnist]'</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">download</span><span class="params">(url, dirpath)</span>:</span></span><br><span class="line"> filename = url.split(<span class="string">'/'</span>)[<span class="number">-1</span>]</span><br><span class="line"> filepath = os.path.join(dirpath, filename)</span><br><span class="line"> u = urllib.request.urlopen(url)</span><br><span class="line"> f = open(filepath, <span class="string">'wb'</span>)</span><br><span class="line"> filesize = int(u.headers[<span class="string">"Content-Length"</span>])</span><br><span class="line"> print(<span class="string">"Downloading: %s Bytes: %s"</span> % (filename, filesize))</span><br><span class="line"></span><br><span class="line"> downloaded = <span class="number">0</span></span><br><span class="line"> block_sz = <span class="number">8192</span></span><br><span class="line"> status_width = <span class="number">70</span></span><br><span class="line"> <span class="keyword">while</span> <span class="keyword">True</span>:</span><br><span class="line"> buf = u.read(block_sz)</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> buf:</span><br><span class="line"> print(<span class="string">''</span>)</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">''</span>, end=<span class="string">'\r'</span>)</span><br><span class="line"> downloaded += len(buf)</span><br><span class="line"> f.write(buf)</span><br><span class="line"> status = ((<span class="string">"[%-"</span> + str(status_width + <span class="number">1</span>) + <span class="string">"s] %3.2f%%"</span>) %</span><br><span class="line"> (<span class="string">'='</span> * int(float(downloaded) / filesize * status_width) + <span class="string">'&gt;'</span>, downloaded * <span class="number">100.</span> / filesize))</span><br><span class="line"> print(status, end=<span class="string">''</span>)</span><br><span class="line"> sys.stdout.flush()</span><br><span class="line"> f.close()</span><br><span class="line"> <span class="keyword">return</span> filepath</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">download_file_from_google_drive</span><span class="params">(id, destination)</span>:</span></span><br><span class="line"> URL = <span class="string">"https://docs.google.com/uc?export=download"</span></span><br><span class="line"> session = requests.Session()</span><br><span class="line"></span><br><span class="line"> response = session.get(URL, params={ <span class="string">
187'id'</span>: id }, stream=<span class="keyword">True</span>)</span><br><span class="line"> token = get_confirm_token(response)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> token:</span><br><span class="line"> params = { <span class="string">'id'</span> : id, <span class="string">'confirm'</span> : token }</span><br><span class="line"> response = session.get(URL, params=params, stream=<span class="keyword">True</span>)</span><br><span class="line"></span><br><span class="line"> save_response_content(response, destination)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_confirm_token</span><span class="params">(response)</span>:</span></span><br><span class="line"> <span class="keyword">for</span> key, value <span class="keyword">in</span> response.cookies.items():</span><br><span class="line"> <span class="keyword">if</span> key.startswith(<span class="string">'download_warning'</span>):</span><br><span class="line"> <span class="keyword">return</span> value</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">None</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">save_response_content</span><span class="params">(response, destination, chunk_size=<span class="number">32</span>*<span class="number">1024</span>)</span>:</span></span><br><span class="line"> total_size = int(response.headers.get(<span class="string">'content-length'</span>, <span class="number">0</span>))</span><br><span class="line"> <span class="keyword">with</span> open(destination, <span class="string">"wb"</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="comment"># æ¾ç¤ºè¿åº¦æ¡</span></span><br><span class="line"> <span class="keyword">for</span> chunk <span class="keyword">in</span> tqdm(response.iter_content(chunk_size), total=total_size,</span><br><span class="line"> unit=<span class="string">'B'</span>, unit_scale=<span class="keyword">True</span>, desc=destination):</span><br><span class="line"> <span class="keyword">if</span> chunk: <span class="comment"># filter out keep-alive new chunks</span></span><br><span class="line"> f.write(chunk)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">unzip</span><span class="params">(filepath)</span>:</span></span><br><span class="line"> print(<span class="string">"Extracting: "</span> + filepath)</span><br><span class="line"> dirpath = os.path.dirname(filepath)</span><br><span class="line"> <span class="keyword">with</span> zipfile.ZipFile(filepath) <span class="keyword">as</span> zf:</span><br><span class="line"> zf.extractall(dirpath)</span><br><span class="line"> os.remove(filepath)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">download_celeb_a</span><span class="params">(dirpath)</span>:</span></span><br><span class="line"> data_dir = <span class="string">'celebA'</span></span><br><span class="line"> <span class="comment"># ./data/celebA</span></span><br><span class="line"> <span class="keyword">if</span> os.path.exists(os.path.join(dirpath, data_dir)):</span><br><span class="line"> print(<span class="string">'Found Celeb-A - skip'</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> filename, drive_id = <span class="string">"img_align_celeba.zip"</span>, <span class="string">"0B7EVK8r0v71pZjFTYXZWM3FlRnM"</span></span><br><span class="line"> <span class="comment"># ./data/img_align_celeba.zip</span></span><br><span class="line"> save_path = os.path.join(dirpath, filename)</span><br><span class="line"> <span class="keyword">if</span> os.path.exists(save_path):</span><br><span class="line"> print(<span class="string">'[*] {} already exists'</span>.format(save_path)) <span class="comment"># æä»¶å·²ç»åå¨</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> download_file_from_google_drive(drive_id, save_path)</span><br><span class="line"></span><br><span class="line"> zip_dir = <span class="string">''</span></span><br><span class="line"> <span class="keyword">with</span> zipfile.ZipFile(save_path) <span class="keyword">as</span> zf:</span><br><span class="line"> zip_dir = zf.namelist()[<span class="number">0</span>] <span class="comment"># è§£å以åé»è®¤æä»¶å¤¹çåå</span></span><br><span class="line"> zf.extractall(dirpath) <span class="comment"># æåæä»¶å°è¯¥æä»¶å¤¹</span></span><br><span class="line"> os.remove(save_path) <span class="comment"># ç§»é¤å缩æä»¶</span></span><br><span class="line"> <span class="comment"># éå½åæä»¶å¤¹</span></span><br><span class="line"> os.rename(os.path.join(dirpath, zip_dir), os.path.join(dirpath, data_dir))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">_list_categories</span><span class="params">(tag)</span>:</span></span><br><span class="line"> url = <span class="string">'http://lsun.cs.princeton.edu/htbin/list.cgi?tag='</span> + tag</span><br><span class="line"> f = urllib.request.urlopen(url)</span><br><span class="line"> <span class="keyword">return</span> json.loads(f.read())</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">_download_lsun</span><span class="params">(out_dir, category, set_name, tag)</span>:</span></span><br><span class="line"> <span class="comment"># locals(),Return a dictionary containing the current scope's local variables</span></span><br><span class="line"> url = <span class="string">'http://lsun.cs.princeton.edu/htbin/download.cgi?tag={tag}'</span> \</span><br><span class="line">
187 <span class="string">'&amp;category={category}&amp;set={set_name}'</span>.format(**locals())</span><br><span class="line"> print(url)</span><br><span class="line"> <span class="keyword">if</span> set_name == <span class="string">'test'</span>:</span><br><span class="line"> out_name = <span class="string">'test_lmdb.zip'</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> out_name = <span class="string">'{category}_{set_name}_lmdb.zip'</span>.format(**locals())</span><br><span class="line"> <span class="comment"># out_path:./data/lsun/xxx.zip</span></span><br><span class="line"> out_path = os.path.join(out_dir, out_name)</span><br><span class="line"> cmd = [<span class="string">'curl'</span>, url, <span class="string">'-o'</span>, out_path]</span><br><span class="line"> print(<span class="string">'Downloading'</span>, category, set_name, <span class="string">'set'</span>)</span><br><span class="line"> <span class="comment"># è°ç¨linuxå½ä»¤</span></span><br><span class="line"> subprocess.call(cmd)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">download_lsun</span><span class="params">(dirpath)</span>:</span></span><br><span class="line"> data_dir = os.path.join(dirpath, <span class="string">'lsun'</span>)</span><br><span class="line"> <span class="keyword">if</span> os.path.exists(data_dir):</span><br><span class="line"> print(<span class="string">'Found LSUN - skip'</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> os.mkdir(data_dir)</span><br><span class="line"></span><br><span class="line"> tag = <span class="string">'latest'</span></span><br><span class="line"> <span class="comment">#categories = _list_categories(tag)</span></span><br><span class="line"> categories = [<span class="string">'bedroom'</span>]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> category <span class="keyword">in</span> categories:</span><br><span class="line"> _download_lsun(data_dir, category, <span class="string">'train'</span>, tag)</span><br><span class="line"> _download_lsun(data_dir, category, <span class="string">'val'</span>, tag)</span><br><span class="line"> _download_lsun(data_dir, <span class="string">''</span>, <span class="string">'test'</span>, tag)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">download_mnist</span><span class="params">(dirpath)</span>:</span></span><br><span class="line"> data_dir = os.path.join(dirpath, <span class="string">'mnist'</span>)</span><br><span class="line"> <span class="keyword">if</span> os.path.exists(data_dir):</span><br><span class="line"> print(<span class="string">'Found MNIST - skip'</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> os.mkdir(data_dir)</span><br><span class="line"> url_base = <span class="string">'http://yann.lecun.com/exdb/mnist/'</span></span><br><span class="line"> file_names = [<span class="string">'train-images-idx3-ubyte.gz'</span>,</span><br><span class="line"> <span class="string">'train-labels-idx1-ubyte.gz'</span>,</span><br><span class="line"> <span class="string">'t10k-images-idx3-ubyte.gz'</span>,</span><br><span class="line"> <span class="string">'t10k-labels-idx1-ubyte.gz'</span>]</span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> file_names:</span><br><span class="line"> url = (url_base+file_name).format(**locals())</span><br><span class="line"> print(url)</span><br><span class="line"> out_path = os.path.join(data_dir,file_name)</span><br><span class="line"> cmd = [<span class="string">'curl'</span>, url, <span class="string">'-o'</span>, out_path]</span><br><span class="line"> print(<span class="string">'Downloading '</span>, file_name)</span><br><span class="line"> subprocess.call(cmd)</span><br><span class="line"> cmd = [<span class="string">'gzip'</span>, <span class="string">'-d'</span>, out_path]</span><br><span class="line"> print(<span class="string">'Decompressing '</span>, file_name)</span><br><span class="line"> subprocess.call(cmd)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">prepare_data_dir</span><span class="params">(path = <span class="string">'./data'</span>)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(path):</span><br><span class="line"> os.mkdir(path)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> args = parser.parse_args()</span><br><span class="line"> prepare_data_dir()</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 妿datasetsåæ°æ¯ ['CelebA', 'celebA', 'celebA'] å
¶ä¸ä¹ä¸</span></span><br><span class="line"> <span class="keyword">if</span> any(name <span class="keyword">in</span> args.datasets <span class="keyword">
187for</span> name <span class="keyword">in</span> [<span class="string">'CelebA'</span>, <span class="string">'celebA'</span>, <span class="string">'celebA'</span>]):</span><br><span class="line"> download_celeb_a(<span class="string">'./data'</span>)</span><br><span class="line"> <span class="keyword">if</span> <span class="string">'lsun'</span> <span class="keyword">in</span> args.datasets:</span><br><span class="line"> download_lsun(<span class="string">'./data'</span>)</span><br><span class="line"> <span class="keyword">if</span> <span class="string">'mnist'</span> <span class="keyword">in</span> args.datasets:</span><br><span class="line"> download_mnist(<span class="string">'./data'</span>)</span><br></pre></td></tr></table></figure> 188</li> 189<li><p>é¦å éè¦å¯¼å ¥çå ä¸ï¼<strong>gzip</strong>å<strong>zipfile</strong>ç¨äºæä»¶å缩åè§£å缩ç¸å ³;<strong>argparse</strong>ç¨äºæå»ºå½ä»¤è¡åæ°;<strong>requests</strong>ç¨äºhttp请æ±ä¸è½½ç½ç»æä»¶èµæº;<strong>subprocess</strong>ç¨äºè¿è¡shellå½ä»¤;<strong>tqdm</strong>ç¨äºè¿åº¦æ¡æ¾ç¤º;<strong>six</strong>å ç¨äºpython2åpython3çå ¼å®¹,æ¯å¦ <span class="lang:default decode:true crayon-inline ">from six.moves import urllib</span> è¿å¥å°±æ¯å¯¼å ¥python2.xçurllibåºã</p> 190</li> 191<li>ä¸é¢ç代ç é¤äºåä½è å çæ³¨éä¹å¤ï¼æä¹å·²ç»å äºä¸é¨å注éï¼ææåºè¯¥æ¯è¾å¥½çè§£äºã主è¦åçäºæ ï¼å°±æ¯å©ç¨requestsåºä»ç½ç»ä¸å°<strong>mnist</strong>,<strong>lsun</strong>以å<strong>celebA</strong>è¿ä¸ä¸ªæ°æ®éä¸è½½ä¸æ¥ï¼ä¿åå¨dataç®å½ä¸ã注æ<strong>mnist</strong>å<strong>celebA</strong>æ°æ®éä¸è½½ä¸æ¥ä¹åè¿è¿è¡äºè§£å缩ã</li> 192<li>ä¸é¢çä¸ä¸ªæ°æ®é,<strong>mnist</strong>æ¯èåçæåæ°åæ°æ®åºï¼å¤§å®¶åºè¯¥é½å·²ç»å¾çæäº;lsunæ¯å¤§ååºæ¯çè§£æ°æ®é(large-scale-scene-understanding);celebAæ¯ä¸ä¸ªå¼æºçäººè¸æ°æ®åºãé¤äºmnistä¹å¤,å ¶ä½ä¸¤ä¸ªæ°æ®éä½ç§¯é½è¾å¤§,celebAå¤§æ¦æ20w+çå¾å,å缩æä»¶ä½ç§¯ä¸º1.4G;èlsunæå¾å¤ä¸ªåºæ¯ä¸åçæ°æ®éï¼å¦ææç §ä¸é¢çèæ¬ä¸è½½ï¼ä¸è½½çæä»¶ä¸ºbedroomæ°æ®éï¼å缩æä»¶æ46Gä¹å¤§ï¼èä¸å ¶å®ä¸è½½ä¸æ¥çæä»¶è§£åå为mdb(Accessæ°æ®åº)æ ¼å¼ï¼ä¸æ¯åå§å¾çæ ¼å¼ï¼ä¸æ¹ä¾¿å¤çãæä»¥æä»¬å®é ä¼ä¸è½½å ¶ä»çæ°æ®éä½ä¸ºæ¿ä»£ï¼æ¯å¦è¿ä¸ª<a href="http://lsun.cs.princeton.edu/challenge/2015/roomlayout/data/image.zip" target="_blank" rel="noopener">room layout estimation(2G)</a>æ°æ®ãå¦æä½¿ç¨download.pyèæ¬ä¸è½½éåº¦è¾æ ¢çè¯ï¼å¯ä»¥èªè¡ä¸è½½å¥½æ°æ®éï¼ç¶åæ¾å¨dataç®å½ä¸å³å¯ã</li> 193</ul> 194<h4 id="2-2-main-py"><a href="#2-2-main-py" class="headerlink" title="2.2 main.py"></a>2.2 <strong>main.py</strong></h4><h4 id="nbsp-nbsp-nbsp-nbsp-main-py代ç å¦ä¸"><a href="#nbsp-nbsp-nbsp-nbsp-main-py代ç å¦ä¸" class="headerlink" title=" main.py代ç å¦ä¸:"></a> main.py代ç å¦ä¸:</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">
19453</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> scipy.misc</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> model <span class="keyword">import</span> DCGAN</span><br><span class="line"><span class="keyword">from</span> utils <span class="keyword">import</span> pp, visualize, to_json, show_all_variables</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"></span><br><span class="line"><span class="comment"># tensorflow å®ä¹å½ä»¤è¡åæ°</span></span><br><span class="line">flags = tf.app.flags</span><br><span class="line"><span class="comment"># flag_name, default_value, docstring</span></span><br><span class="line">flags.DEFINE_integer(<span class="string">"epoch"</span>, <span class="number">25</span>, <span class="string">"Epoch to train [25]"</span>)</span><br><span class="line">flags.DEFINE_float(<span class="string">"learning_rate"</span>, <span class="number">0.0002</span>, <span class="string">"Learning rate of for adam [0.0002]"</span>)</span><br><span class="line">flags.DEFINE_float(<span class="string">"beta1"</span>, <span class="number">0.5</span>, <span class="string">"Momentum term of adam [0.5]"</span>)</span><br><span class="line">flags.DEFINE_float(<span class="string">"train_size"</span>, np.inf, <span class="string">"The size of train images [np.inf]"</span>)</span><br><span class="line">flags.DEFINE_integer(<span class="string">"batch_size"</span>, <span class="number">64</span>, <span class="string">"The size of batch images [64]"</span>)</span><br><span class="line">flags.DEFINE_integer(<span class="string">"input_height"</span>, <span class="number">108</span>, <span class="string">"The size of image to use (will be center cropped). [108]"</span>)</span><br><span class="line">flags.DEFINE_integer(<span class="string">"input_width"</span>, <span class="keyword">None</span>, <span class="string">"The size of image to use (will be center cropped). If None, same value as input_height [None]"</span>)</span><br><span class="line">flags.DEFINE_integer(<span class="string">"output_height"</span>, <span class="number">64</span>, <span class="string">"The size of the output images to produce [64]"</span>)</span><br><span class="line">flags.DEFINE_integer(<span class="string">"output_width"</span>, <span class="keyword">None</span>, <span class="string">"The size of the output images to produce. If None, same value as output_height [None]"</span>)</span><br><span class="line">flags.DEFINE_integer(<span class="string">"print_every"</span>,<span class="number">100</span>,<span class="string">"print train info every 100 iterations"</span>)</span><br><span class="line">flags.DEFINE_integer(<span class="string">"checkpoint_every"</span>,<span class="number">500</span>,<span class="string">"save checkpoint file every 500 iterations"</span>)</span><br><span class="line">flags.DEFINE_string(<span class="string">"dataset"</span>, <span class="string">
194"celebA"</span>, <span class="string">"The name of dataset [celebA, mnist, lsun]"</span>)</span><br><span class="line">flags.DEFINE_string(<span class="string">"input_fname_pattern"</span>, <span class="string">"*.jpg"</span>, <span class="string">"Glob pattern of filename of input images [*]"</span>)</span><br><span class="line">flags.DEFINE_string(<span class="string">"checkpoint_dir"</span>, <span class="string">"checkpoint"</span>, <span class="string">"Directory name to save the checkpoints [checkpoint]"</span>)</span><br><span class="line">flags.DEFINE_string(<span class="string">"data_dir"</span>, <span class="string">"./data"</span>, <span class="string">"Root directory of dataset [data]"</span>)</span><br><span class="line">flags.DEFINE_string(<span class="string">"sample_dir"</span>, <span class="string">"samples"</span>, <span class="string">"Directory name to save the image samples [samples]"</span>)</span><br><span class="line">flags.DEFINE_boolean(<span class="string">"train"</span>, <span class="keyword">False</span>, <span class="string">"True for training, False for testing [False]"</span>)</span><br><span class="line">flags.DEFINE_boolean(<span class="string">"crop"</span>, <span class="keyword">False</span>, <span class="string">"True for training, False for testing [False]"</span>)</span><br><span class="line">flags.DEFINE_boolean(<span class="string">"visualize"</span>, <span class="keyword">False</span>, <span class="string">"True for visualizing, False for nothing [False]"</span>)</span><br><span class="line">flags.DEFINE_integer(<span class="string">"generate_test_images"</span>, <span class="number">100</span>, <span class="string">"Number of images to generate during test. [100]"</span>)</span><br><span class="line">FLAGS = flags.FLAGS</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">(_)</span>:</span></span><br><span class="line"> pp.pprint(flags.FLAGS.__flags)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># å¦æå®½åº¦æ²¡ææå®ï¼é£ä¹åé«åº¦ä¸æ ·</span></span><br><span class="line"> <span class="keyword">if</span> FLAGS.input_width <span class="keyword">is</span> <span class="keyword">None</span>:</span><br><span class="line"> FLAGS.input_width = FLAGS.input_height</span><br><span class="line"> <span class="keyword">if</span> FLAGS.output_width <span class="keyword">is</span> <span class="keyword">None</span>:</span><br><span class="line"> FLAGS.output_width = FLAGS.output_height</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(FLAGS.checkpoint_dir):</span><br><span class="line"> os.makedirs(FLAGS.checkpoint_dir)</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(FLAGS.sample_dir):</span><br><span class="line"> os.makedirs(FLAGS.sample_dir)</span><br><span class="line"></span><br><span class="line"> <span class="comment">#gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)</span></span><br><span class="line"> run_config = tf.ConfigProto()</span><br><span class="line"> run_config.gpu_options.allow_growth=<span class="keyword">True</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">with</span> tf.Session(config=run_config) <span class="keyword">as</span> sess:</span><br><span class="line"> <span class="keyword">if</span> FLAGS.dataset == <span class="string">'mnist'</span>:</span><br><span class="line"> dcgan = DCGAN(</span><br><span class="line"> sess,</span><br><span class="line"> input_width=FLAGS.input_width,</span><br><span class="line"> input_height=FLAGS.input_height,</span><br><span class="line"> output_width=FLAGS.output_width,</span><br><span class="line"> output_height=FLAGS.output_height,</span><br><span class="line"> batch_size=FLAGS.batch_size,</span><br><span class="line"> sample_num=FLAGS.batch_size,</span><br><span class="line"> y_dim=<span class="number">10</span>,</span><br><span class="line"> z_dim=FLAGS.generate_test_images,</span><br><span class="line">
194 dataset_name=FLAGS.dataset,</span><br><span class="line"> input_fname_pattern=FLAGS.input_fname_pattern,</span><br><span class="line"> crop=FLAGS.crop,</span><br><span class="line"> checkpoint_dir=FLAGS.checkpoint_dir,</span><br><span class="line"> sample_dir=FLAGS.sample_dir,</span><br><span class="line"> data_dir=FLAGS.data_dir)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> dcgan = DCGAN(</span><br><span class="line"> sess,</span><br><span class="line"> input_width=FLAGS.input_width,</span><br><span class="line"> input_height=FLAGS.input_height,</span><br><span class="line"> output_width=FLAGS.output_width,</span><br><span class="line"> output_height=FLAGS.output_height,</span><br><span class="line"> batch_size=FLAGS.batch_size,</span><br><span class="line"> sample_num=FLAGS.batch_size,</span><br><span class="line"> z_dim=FLAGS.generate_test_images,</span><br><span class="line"> dataset_name=FLAGS.dataset,</span><br><span class="line"> input_fname_pattern=FLAGS.input_fname_pattern,</span><br><span class="line"> crop=FLAGS.crop,</span><br><span class="line"> checkpoint_dir=FLAGS.checkpoint_dir,</span><br><span class="line"> sample_dir=FLAGS.sample_dir,</span><br><span class="line"> data_dir=FLAGS.data_dir)</span><br><span class="line"></span><br><span class="line"> show_all_variables()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> FLAGS.train:</span><br><span class="line"> dcgan.train(FLAGS)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="comment"># dcgan.load return:True,counter</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> dcgan.load(FLAGS.checkpoint_dir)[<span class="number">0</span>]: <span class="comment">#没ææåå è½½checkpoint file</span></span><br><span class="line"> <span class="keyword">raise</span> Exception(<span class="string">"[!] Train a model first, then run test mode"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"># to_json("./web/js/layers.js", [dcgan.h0_w, dcgan.h0_b, dcgan.g_bn0],</span></span><br><span class="line"> <span class="comment"># [dcgan.h1_w, dcgan.h1_b, dcgan.g_bn1],</span></span><br><span class="line"> <span class="comment"># [dcgan.h2_w, dcgan.h2_b, dcgan.g_bn2],</span></span><br><span class="line"> <span class="comment"># [dcgan.h3_w, dcgan.h3_b, dcgan.g_bn3],</span></span><br><span class="line"> <span class="comment"># [dcgan.h4_w, dcgan.h4_b, None])</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># Below is codes for visualization</span></span><br><span class="line"> OPTION = <span class="number">4</span></span><br><span class="line"> visualize(sess, dcgan, FLAGS, OPTION)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> tf.app.run()</span><br></pre></td></tr></table></figure> 195<ul> 196<li>è¿ééè¦æ³¨æçæ¯ <span class="lang:default decode:true crayon-inline ">flags = tf.app.flags</span> ç¨äºtensorflowæå»ºå½ä»¤è¡åæ°, <span class="lang:default decode:true crayon-inline ">flags.DEFINE_xxx(param,default,description)</span> ç¨äºå®ä¹å½ä»¤è¡åæ°åå ¶åå¼,第ä¸ä¸ªåæ°<strong>param</strong>æ¯å ·ä½åæ°å¼,第äºä¸ªåæ°<strong>default</strong>æ¯åæ°é»è®¤åå¼,第ä¸ä¸ªåæ°<strong>description</strong>æ¯åæ°æè¿°å符串ã</li> 197<li>å¨æå»ºäºsessä¹åï¼æä»¬éè¦åºåæ°æ®éæ¯mnistè¿æ¯å ¶ä»æ°æ®éãå 为mnistæ¯è¾ç¹æ®ï¼å®æ10个类å«çæ°åå¾å,æä»¥æä»¬å¨æå»º<strong>DCGAN</strong>çæ¶åéè¦é¢å¤å¤ä¼ éä¸ä¸ª<strong>y_dim=10</strong>åæ°ã <span class="lang:python decode:true crayon-inline ">show_all_variables</span> 彿°ç¨äºæ¾ç¤ºmodelææåéçå ·ä½ä¿¡æ¯ã</li> 198<li>
198æ¥ä¸æ¥å¦ææ¯è®ç»ç¶æ( <span class="lang:default decode:true crayon-inline ">FLAGS.train == True</span> ),åè¿è¡æ¨¡åè®ç»( <span class="lang:default decode:true crayon-inline ">dcgan.train(FLAGS)</span> ;å¦åè¿è¡æµè¯,å³å è½½ä¹åè®ç»æ¶åä¿åçcheckpointæä»¶ï¼ç¶åè°ç¨ <span class="lang:default decode:true crayon-inline ">visualize</span> 彿°è¿è¡test(è¯¥å½æ°å¯ä»¥çæimageæè gif,å¯è§åå±ç¤ºè®ç»çææ)ã</li> 199<li><span class="lang:default decode:true crayon-inline ">tf.app.run()</span> æ¯å¸¸ç¨çtensorflowè¿è¡çèµ·å§å½ä»¤ã</li> 200</ul> 201<h4 id="2-3-model-py"><a href="#2-3-model-py" class="headerlink" title="2.3 model.py"></a>2.3 <strong>model.py</strong></h4><h4 id="nbsp-nbsp-nbsp-nbsp-model-py代ç å¦ä¸"><a href="#nbsp-nbsp-nbsp-nbsp-model-py代ç å¦ä¸" class="headerlink" title=" model.py代ç å¦ä¸:"></a> model.py代ç å¦ä¸:</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">
20153</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">
201194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">
201328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">
201424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> __future__ <span class="keyword">
201import</span> division</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> math</span><br><span class="line"><span class="keyword">from</span> glob <span class="keyword">import</span> glob</span><br><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> six.moves <span class="keyword">import</span> xrange</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> ops <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> utils <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">conv_out_size_same</span><span class="params">(size, stride)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> int(math.ceil(float(size) / float(stride)))</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">DCGAN</span><span class="params">(object)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, sess, input_height=<span class="number">108</span>, input_width=<span class="number">108</span>, crop=True,</span></span></span><br><span class="line"><span class="function"><span class="params"> batch_size=<span class="number">64</span>, sample_num = <span class="number">64</span>, output_height=<span class="number">64</span>, output_width=<span class="number">64</span>,</span></span></span><br><span class="line"><span class="function"><span class="params"> y_dim=None, z_dim=<span class="number">100</span>, gf_dim=<span class="number">64</span>, df_dim=<span class="number">64</span>,</span></span></span><br><span class="line"><span class="function"><span class="params"> gfc_dim=<span class="number">1024</span>, dfc_dim=<span class="number">1024</span>, c_dim=<span class="number">3</span>, dataset_name=<span class="string">'default'</span>,</span></span></span><br><span class="line"><span class="function"><span class="params"> input_fname_pattern=<span class="string">'*.jpg'</span>, checkpoint_dir=None, sample_dir=None, data_dir=<span class="string">'data'</span>)</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> Args:</span></span><br><span class="line"><span class="string"> sess: TensorFlow session</span></span><br><span class="line"><span class="string"> batch_size: The size of batch. Should be specified before training.</span></span><br><span class="line"><span class="string"> y_dim: (optional) Dimension of dim for y. [None]</span></span><br><span class="line"><span class="string"> z_dim: (optional) Dimension of dim for Z. [100]</span></span><br><span class="line"><span class="string"> # çæå¨ç¬¬ä¸ä¸ªå·ç§¯å± filters size</span></span><br><span class="line"><span class="string"> gf_dim: (optional) Dimension of gen filters in first conv layer. [64]</span></span><br><span class="line"><span class="string"> # é´å«å¨ç¬¬ä¸ä¸ªå·ç§¯å±filters size</span></span><br><span class="line"><span class="string"> df_dim: (optional) Dimension of discrim filters in first conv layer. [64]</span></span><br><span class="line"><span class="string"> # çæå¨å
¨è¿æ¥å±units size</span></span><br><span class="line"><span class="string"> gfc_dim: (optional) Dimension of gen units for for fully connected layer. [1024]</span></span><br><span class="line"><span class="string"> # é´å«å¨å
¨è¿æ¥å±units size</span></span><br><span class="line"><span class="string"> dfc_dim: (optional) Dimension of discrim units for fully connected layer. [1024]</span></span><br><span class="line"><span class="string"> # image channel</span></span><br><span class="line"><span class="string"> c_dim: (optional) Dimension of image color. For grayscale input, set to 1. [3]</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> self.sess = sess</span><br><span class="line"> self.crop = crop</span><br><span class="line"></span><br><span class="line"> self.batch_size = batch_size</span><br><span class="line"> self.sample_num = sample_num</span><br><span class="line"></span><br><span class="line"> self.input_height = input_height</span><br><span class="line"> self.input_width = input_width</span><br><span class="line"> self.output_height = output_height</span><br><span class="line"> self.output_width = output_width</span><br><span class="line"></span><br><span class="line"> self.y_dim = y_dim</span><br><span class="line"> self.z_dim = z_dim</span><br><span class="line"></span><br><span class="line"> self.gf_dim = gf_dim</span><br><span class="line"> self.df_dim = df_dim</span><br><span class="line"></span><br><span class="line"> self.gfc_dim = gfc_dim</span><br><span class="line"> self.dfc_dim = dfc_dim</span><br><span class="line"></span><br><span class="line"> <span class="comment"># batch normalization : deals with poor initialization helps gradient flow</span></span><br><span class="line"> self.d_bn1 = batch_norm(name=<span class="string">'d_bn1'</span>)</span><br><span class="line"> self.d_bn2 = batch_norm(name=<span class="string">'d_bn2'</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.y_dim:</span><br><span class="line"> self.d_bn3 = batch_norm(name=<span class="string">'d_bn3'</span>)</span><br><span class="line"></span><br><span class="line"> self.g_bn0 = batch_norm(name=<span class="string">'g_bn0'</span>)</span><br><span class="line"> self.g_bn1 = batch_norm(name=<span class="string">'g_bn1'</span>)</span><br><span class="line"> self.g_bn2 = batch_norm(name=<span class="string">'g_bn2'</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.y_dim:</span><br><span class="line"> self.g_bn3 = batch_norm(name=<span class="string">'g_bn3'</span>)</span><br><span class="line"></span><br><span class="line"> self.dataset_name = dataset_name</span><br><span class="line"> self.input_fname_pattern = input_fname_pattern</span><br><span class="line"> self.checkpoint_dir = checkpoint_dir</span><br><span class="line"> self.data_dir = data_dir</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> self.dataset_name == <span class="string">
201'mnist'</span>:</span><br><span class="line"> self.data_X, self.data_y = self.load_mnist()</span><br><span class="line"> self.c_dim = self.data_X[<span class="number">0</span>].shape[<span class="number">-1</span>]</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="comment"># dir *.jpg</span></span><br><span class="line"> self.data = glob(os.path.join(self.data_dir, self.dataset_name, self.input_fname_pattern))</span><br><span class="line"> imreadImg = imread(self.data[<span class="number">0</span>])</span><br><span class="line"> <span class="keyword">if</span> len(imreadImg.shape) &gt;= <span class="number">3</span>: <span class="comment">#check if image is a non-grayscale image by checking channel number</span></span><br><span class="line"> self.c_dim = imread(self.data[<span class="number">0</span>]).shape[<span class="number">-1</span>] <span class="comment"># color image,get image channel</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> self.c_dim = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> self.grayscale = (self.c_dim == <span class="number">1</span>) <span class="comment"># æ¯å¦æ¯ç°åº¦å¾å</span></span><br><span class="line"></span><br><span class="line"> self.build_model()</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">build_model</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> self.y_dim:</span><br><span class="line"> self.y = tf.placeholder(tf.float32, [self.batch_size, self.y_dim], name=<span class="string">'y'</span>)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> self.y = <span class="keyword">None</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> self.crop:</span><br><span class="line"> image_dims = [self.output_height, self.output_width, self.c_dim]</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> image_dims = [self.input_height, self.input_width, self.c_dim]</span><br><span class="line"></span><br><span class="line"> <span class="comment"># self.inputsãshape:(batch_size,height,width,channel)</span></span><br><span class="line"> self.inputs = tf.placeholder(</span><br><span class="line"> tf.float32, [self.batch_size] + image_dims, name=<span class="string">'real_images'</span>)</span><br><span class="line"></span><br><span class="line"> inputs = self.inputs</span><br><span class="line"></span><br><span class="line"> self.z = tf.placeholder(</span><br><span class="line"> tf.float32, [<span class="keyword">None</span>, self.z_dim], name=<span class="string">'z'</span>)</span><br><span class="line"> <span class="comment"># ç´æ¹å¾å¯è§å</span></span><br><span class="line"> self.z_sum = histogram_summary(<span class="string">"z"</span>, self.z)</span><br><span class="line"></span><br><span class="line"> self.G = self.generator(self.z, self.y)</span><br><span class="line"> self.D, self.D_logits = self.discriminator(inputs, self.y, reuse=<span class="keyword">False</span>)</span><br><span class="line"> self.sampler = self.sampler(self.z, self.y)</span><br><span class="line"> self.D_, self.D_logits_ = self.discriminator(self.G, self.y, reuse=<span class="keyword">True</span>)</span><br><span class="line"> </span><br><span class="line"> self.d_sum = histogram_summary(<span class="string">"d"</span>, self.D)</span><br><span class="line"> self.d__sum = histogram_summary(<span class="string">"d_"</span>, self.D_)</span><br><span class="line"> self.G_sum = image_summary(<span class="string">"G"</span>, self.G)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">sigmoid_cross_entropy_with_logits</span><span class="params">(x, y)</span>:</span></span><br><span class="line">
201 <span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">return</span> tf.nn.sigmoid_cross_entropy_with_logits(logits=x, labels=y)</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> <span class="keyword">return</span> tf.nn.sigmoid_cross_entropy_with_logits(logits=x, targets=y)</span><br><span class="line"></span><br><span class="line"> self.d_loss_real = tf.reduce_mean(</span><br><span class="line"> sigmoid_cross_entropy_with_logits(self.D_logits, tf.ones_like(self.D)))</span><br><span class="line"> self.d_loss_fake = tf.reduce_mean(</span><br><span class="line"> sigmoid_cross_entropy_with_logits(self.D_logits_, tf.zeros_like(self.D_)))</span><br><span class="line"> self.g_loss = tf.reduce_mean(</span><br><span class="line"> sigmoid_cross_entropy_with_logits(self.D_logits_, tf.ones_like(self.D_)))</span><br><span class="line"></span><br><span class="line"> <span class="comment"># scalar_summary:Outputs a `Summary` protocol buffer containing a single scalar value</span></span><br><span class="line"> <span class="comment"># è¿åä¸ä¸ªscalar</span></span><br><span class="line"> self.d_loss_real_sum = scalar_summary(<span class="string">"d_loss_real"</span>, self.d_loss_real)</span><br><span class="line"> self.d_loss_fake_sum = scalar_summary(<span class="string">"d_loss_fake"</span>, self.d_loss_fake)</span><br><span class="line"> </span><br><span class="line"> self.d_loss = self.d_loss_real + self.d_loss_fake</span><br><span class="line"></span><br><span class="line"> self.g_loss_sum = scalar_summary(<span class="string">"g_loss"</span>, self.g_loss)</span><br><span class="line"> self.d_loss_sum = scalar_summary(<span class="string">"d_loss"</span>, self.d_loss)</span><br><span class="line"></span><br><span class="line"> t_vars = tf.trainable_variables()</span><br><span class="line"></span><br><span class="line"> self.d_vars = [var <span class="keyword">for</span> var <span class="keyword">in</span> t_vars <span class="keyword">if</span> <span class="string">'d_'</span> <span class="keyword">in</span> var.name] <span class="comment"># é´å«å¨ç¸å
³åé</span></span><br><span class="line"> self.g_vars = [var <span class="keyword">for</span> var <span class="keyword">in</span> t_vars <span class="keyword">if</span> <span class="string">'g_'</span> <span class="keyword">in</span> var.name] <span class="comment"># çæå¨ç¸å
³åé</span></span><br><span class="line"></span><br><span class="line"> self.saver = tf.train.Saver()</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">train</span><span class="params">(self, config)</span>:</span></span><br><span class="line"> d_optim = tf.train.AdamOptimizer(config.learning_rate, beta1=config.beta1) \</span><br><span class="line"> .minimize(self.d_loss, var_list=self.d_vars)</span><br><span class="line"> g_optim = tf.train.AdamOptimizer(config.learning_rate, beta1=config.beta1) \</span><br><span class="line"> .minimize(self.g_loss, var_list=self.g_vars)</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> tf.global_variables_initializer().run()</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> tf.initialize_all_variables().run()</span><br><span class="line"></span><br><span class="line"> self.g_sum = merge_summary([self.z_sum, self.d__sum,</span><br><span class="line"> self.G_sum, self.d_loss_fake_sum, self.g_loss_sum])</span><br><span class="line"> self.d_sum = merge_summary(</span><br><span class="line"> [self.z_sum, self.d_sum, self.d_loss_real_sum, self.d_loss_sum])</span><br><span class="line"> self.writer = SummaryWriter(<span class="string">"./logs"</span>, self.sess.graph)</span><br><span class="line"></span><br><span class="line"> sample_z = np.random.uniform(<span class="number">-1</span>, <span class="number">1</span>, size=(self.sample_num , self.z_dim))</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> config.dataset == <span class="string">
201'mnist'</span>:</span><br><span class="line"> sample_inputs = self.data_X[<span class="number">0</span>:self.sample_num]</span><br><span class="line"> sample_labels = self.data_y[<span class="number">0</span>:self.sample_num]</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="comment"># self.data is like:["0.jpg","1.jpg",...]</span></span><br><span class="line"> sample_files = self.data[<span class="number">0</span>:self.sample_num]</span><br><span class="line"> sample = [</span><br><span class="line"> <span class="comment"># get_imageè¿åçæ¯åå¼ä¸º(-1,1)ç,shape为(resize_height,resize_width)ç</span></span><br><span class="line"> <span class="comment"># ndarray</span></span><br><span class="line"> get_image(sample_file,</span><br><span class="line"> input_height=self.input_height,</span><br><span class="line"> input_width=self.input_width,</span><br><span class="line"> resize_height=self.output_height,</span><br><span class="line"> resize_width=self.output_width,</span><br><span class="line"> crop=self.crop,</span><br><span class="line"> grayscale=self.grayscale) <span class="keyword">for</span> sample_file <span class="keyword">in</span> sample_files]</span><br><span class="line"> <span class="keyword">if</span> (self.grayscale):</span><br><span class="line"> <span class="comment"># ç°åº¦å¾åçchannel为1</span></span><br><span class="line"> sample_inputs = np.array(sample).astype(np.float32)[:, :, :, <span class="keyword">None</span>]</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="comment"># color image</span></span><br><span class="line"> sample_inputs = np.array(sample).astype(np.float32)</span><br><span class="line"> </span><br><span class="line"> counter = <span class="number">1</span></span><br><span class="line"> start_time = time.time()</span><br><span class="line"> could_load, checkpoint_counter = self.load(self.checkpoint_dir)</span><br><span class="line"> <span class="keyword">if</span> could_load:</span><br><span class="line"> counter = checkpoint_counter</span><br><span class="line"> print(<span class="string">" [*] Load SUCCESS"</span>)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">" [!] Load failed..."</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> epoch <span class="keyword">in</span> xrange(config.epoch):</span><br><span class="line"> <span class="keyword">if</span> config.dataset == <span class="string">'mnist'</span>:</span><br><span class="line"> batch_idxs = min(len(self.data_X), config.train_size) // config.batch_size</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="comment"># self.data is like:["0.jpg","1.jpg",...]</span></span><br><span class="line"> self.data = glob(os.path.join(</span><br><span class="line"> config.data_dir, config.dataset, self.input_fname_pattern))</span><br><span class="line"> batch_idxs = min(len(self.data), config.train_size) // config.batch_size</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> idx <span class="keyword">in</span> xrange(<span class="number">0</span>, batch_idxs):</span><br><span class="line"> <span class="keyword">if</span> config.dataset == <span class="string">'mnist'</span>:</span><br><span class="line"> batch_images = self.data_X[idx*config.batch_size:(idx+<span class="number">1</span>)*config.batch_size]</span><br><span class="line"> batch_labels = self.data_y[idx*config.batch_size:(idx+<span class="number">1</span>)*config.batch_size]</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> batch_files = self.data[idx*config.batch_size:(idx+<span class="number">1</span>)*config.batch_size]</span><br><span class="line"> batch = [</span><br><span class="line"> get_image(batch_file,</span><br><span class="line"> input_height=self.input_height,</span><br><span class="line"> input_width=self.input_width,</span><br><span class="line"> resize_height=self.output_height,</span><br><span class="line"> resize_width=self.output_width,</span><br><span class="line"> crop=self.crop,</span><br><span class="line"> grayscale=self.grayscale) <span class="keyword">
201for</span> batch_file <span class="keyword">in</span> batch_files]</span><br><span class="line"> <span class="keyword">if</span> self.grayscale:</span><br><span class="line"> <span class="comment"># add a channel for grayscale</span></span><br><span class="line"> <span class="comment"># batch_images shape:(batch,height,width,channel)</span></span><br><span class="line"> batch_images = np.array(batch).astype(np.float32)[:, :, :, <span class="keyword">None</span>]</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> batch_images = np.array(batch).astype(np.float32)</span><br><span class="line"> <span class="comment"># add noise</span></span><br><span class="line"> batch_z = np.random.uniform(<span class="number">-1</span>, <span class="number">1</span>, [config.batch_size, self.z_dim]) \</span><br><span class="line"> .astype(np.float32)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> config.dataset == <span class="string">'mnist'</span>:</span><br><span class="line"> <span class="comment"># Update D network</span></span><br><span class="line"> _, summary_str = self.sess.run([d_optim, self.d_sum],</span><br><span class="line"> feed_dict={ </span><br><span class="line"> self.inputs: batch_images,</span><br><span class="line"> self.z: batch_z,</span><br><span class="line"> self.y:batch_labels,</span><br><span class="line"> })</span><br><span class="line"> <span class="comment"># ç¨äºå¯è§å</span></span><br><span class="line"> self.writer.add_summary(summary_str, counter)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># Update G network</span></span><br><span class="line"> _, summary_str = self.sess.run([g_optim, self.g_sum],</span><br><span class="line"> feed_dict={</span><br><span class="line"> self.z: batch_z, </span><br><span class="line"> self.y:batch_labels,</span><br><span class="line"> })</span><br><span class="line"> self.writer.add_summary(summary_str, counter)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># Run g_optim twice to make sure that d_loss does not go to zero (different from paper)</span></span><br><span class="line"> _, summary_str = self.sess.run([g_optim, self.g_sum],</span><br><span class="line"> feed_dict={ self.z: batch_z, self.y:batch_labels })</span><br><span class="line"> self.writer.add_summary(summary_str, counter)</span><br><span class="line"> </span><br><span class="line"> errD_fake = self.d_loss_fake.eval({</span><br><span class="line"> self.z: batch_z, </span><br><span class="line"> self.y:batch_labels</span><br><span class="line"> })</span><br><span class="line"> errD_real = self.d_loss_real.eval({</span><br><span class="line"> self.inputs: batch_images,</span><br><span class="line"> self.y:batch_labels</span><br><span class="line"> })</span><br><span class="line"> errG = self.g_loss.eval({</span><br><span class="line"> self.z: batch_z,</span><br><span class="line"> self.y: batch_labels</span><br><span class="line"> })</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="comment"># Update D network</span></span><br><span class="line"> _, summary_str = self.sess.run([d_optim, self.d_sum],</span><br><span class="line"> feed_dict={ self.inputs: batch_images, self.z: batch_z })</span><br><span class="line"> self.writer.add_summary(summary_str, counter)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># Update G network</span></span><br><span class="line"> _, summary_str = self.sess.run([g_optim, self.g_sum],</span><br><span class="line"> feed_dict={ self.z: batch_z })</span><br><span class="line"> self.writer.add_summary(summary_str, counter)</span><br><span class="line"></span><br><span class="line">
201 <span class="comment"># Run g_optim twice to make sure that d_loss does not go to zero (different from paper)</span></span><br><span class="line"> _, summary_str = self.sess.run([g_optim, self.g_sum],</span><br><span class="line"> feed_dict={ self.z: batch_z })</span><br><span class="line"> self.writer.add_summary(summary_str, counter)</span><br><span class="line"> </span><br><span class="line"> errD_fake = self.d_loss_fake.eval({ self.z: batch_z })</span><br><span class="line"> errD_real = self.d_loss_real.eval({ self.inputs: batch_images })</span><br><span class="line"> errG = self.g_loss.eval({self.z: batch_z})</span><br><span class="line"></span><br><span class="line"> counter += <span class="number">1</span></span><br><span class="line"> print(<span class="string">"Epoch: [%2d/%2d] [%4d/%4d] time: %4.4f, d_loss: %.8f, g_loss: %.8f"</span> \</span><br><span class="line"> % (epoch, config.epoch, idx, batch_idxs,</span><br><span class="line"> time.time() - start_time, errD_fake+errD_real, errG))</span><br><span class="line"> <span class="comment"># np.mod:Return element-wise remainder of division.</span></span><br><span class="line"> <span class="comment"># æ¯100次çæä¸æ¬¡samples</span></span><br><span class="line"> <span class="keyword">if</span> np.mod(counter, config.print_every) == <span class="number">1</span>:</span><br><span class="line"> <span class="keyword">if</span> config.dataset == <span class="string">'mnist'</span>:</span><br><span class="line"> samples, d_loss, g_loss = self.sess.run(</span><br><span class="line"> [self.sampler, self.d_loss, self.g_loss],</span><br><span class="line"> feed_dict={</span><br><span class="line"> self.z: sample_z,</span><br><span class="line"> self.inputs: sample_inputs,</span><br><span class="line"> self.y:sample_labels,</span><br><span class="line"> }</span><br><span class="line"> )</span><br><span class="line"> <span class="comment"># ä¿åçæçæ ·æ¬</span></span><br><span class="line"> save_images(samples, image_manifold_size(samples.shape[<span class="number">0</span>]),</span><br><span class="line"> <span class="string">'./{}/train_{:02d}_{:04d}.png'</span>.format(config.sample_dir, epoch, idx))</span><br><span class="line"> print(<span class="string">"[Sample] d_loss: %.8f, g_loss: %.8f"</span> % (d_loss, g_loss)) </span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> samples, d_loss, g_loss = self.sess.run(</span><br><span class="line"> [self.sampler, self.d_loss, self.g_loss],</span><br><span class="line"> feed_dict={</span><br><span class="line"> self.z: sample_z,</span><br><span class="line"> self.inputs: sample_inputs,</span><br><span class="line"> },</span><br><span class="line"> )</span><br><span class="line"> save_images(samples, image_manifold_size(samples.shape[<span class="number">0</span>]),</span><br><span class="line"> <span class="string">'./{}/train_{:02d}_{:04d}.png'</span>.format(config.sample_dir, epoch, idx))</span><br><span class="line"> print(<span class="string">"[Sample] d_loss: %.8f, g_loss: %.8f"</span> % (d_loss, g_loss)) </span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> print(<span class="string">"one pic error!..."</span>)</span><br><span class="line"> <span class="comment"># æ¯500次ä¿åä¸ä¸checkpoint</span></span><br><span class="line"> <span class="keyword">if</span>
201 np.mod(counter, config.checkpoint_every) == <span class="number">2</span>: <span class="comment"># save checkpoint file</span></span><br><span class="line"> self.save(config.checkpoint_dir, counter)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">discriminator</span><span class="params">(self, image, y=None, reuse=False)</span>:</span></span><br><span class="line"> <span class="keyword">with</span> tf.variable_scope(<span class="string">"discriminator"</span>) <span class="keyword">as</span> scope:</span><br><span class="line"> <span class="keyword">if</span> reuse:</span><br><span class="line"> scope.reuse_variables()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.y_dim:</span><br><span class="line"> h0 = lrelu(conv2d(image, self.df_dim, name=<span class="string">'d_h0_conv'</span>))</span><br><span class="line"> h1 = lrelu(self.d_bn1(conv2d(h0, self.df_dim*<span class="number">2</span>, name=<span class="string">'d_h1_conv'</span>)))</span><br><span class="line"> h2 = lrelu(self.d_bn2(conv2d(h1, self.df_dim*<span class="number">4</span>, name=<span class="string">'d_h2_conv'</span>)))</span><br><span class="line"> h3 = lrelu(self.d_bn3(conv2d(h2, self.df_dim*<span class="number">8</span>, name=<span class="string">'d_h3_conv'</span>)))</span><br><span class="line"> h4 = linear(tf.reshape(h3, [self.batch_size, <span class="number">-1</span>]), <span class="number">1</span>, <span class="string">'d_h4_lin'</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> tf.nn.sigmoid(h4), h4</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> yb = tf.reshape(y, [self.batch_size, <span class="number">1</span>, <span class="number">1</span>, self.y_dim])</span><br><span class="line"> x = conv_cond_concat(image, yb)</span><br><span class="line"></span><br><span class="line"> h0 = lrelu(conv2d(x, self.c_dim + self.y_dim, name=<span class="string">'d_h0_conv'</span>))</span><br><span class="line"> h0 = conv_cond_concat(h0, yb)</span><br><span class="line"></span><br><span class="line"> h1 = lrelu(self.d_bn1(conv2d(h0, self.df_dim + self.y_dim, name=<span class="string">'d_h1_conv'</span>)))</span><br><span class="line"> h1 = tf.reshape(h1, [self.batch_size, <span class="number">-1</span>]) </span><br><span class="line"> h1 = concat([h1, y], <span class="number">1</span>)</span><br><span class="line"> </span><br><span class="line"> h2 = lrelu(self.d_bn2(linear(h1, self.dfc_dim, <span class="string">'d_h2_lin'</span>)))</span><br><span class="line"> h2 = concat([h2, y], <span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> h3 = linear(h2, <span class="number">1</span>, <span class="string">'d_h3_lin'</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> tf.nn.sigmoid(h3), h3</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">generator</span><span class="params">(self, z, y=None)</span>:</span></span><br><span class="line"> <span class="keyword">with</span> tf.variable_scope(<span class="string">"generator"</span>) <span class="keyword">as</span> scope:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.y_dim:</span><br><span class="line"> s_h, s_w = self.output_height, self.output_width</span><br><span class="line"> <span class="comment"># 2 is stride</span></span><br><span class="line"> s_h2, s_w2 = conv_out_size_same(s_h, <span class="number">2</span>), conv_out_size_same(s_w, <span class="number">2</span>)</span><br><span class="line"> s_h4, s_w4 = conv_out_size_same(s_h2, <span class="number">2</span>), conv_out_size_same(s_w2, <span class="number">2</span>)</span><br><span class="line"> s_h8, s_w8 = conv_out_size_same(s_h4, <span class="number">2</span>), conv_out_size_same(s_w4, <span class="number">2</span>)</span><br><span class="line"> s_h16, s_w16 = conv_out_size_same(s_h8, <span class="number">2</span>), conv_out_size_same(s_w8, <span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">
201 <span class="comment"># project `z` and reshape</span></span><br><span class="line"> self.z_, self.h0_w, self.h0_b = linear(</span><br><span class="line"> z, self.gf_dim*<span class="number">8</span>*s_h16*s_w16, <span class="string">'g_h0_lin'</span>, with_w=<span class="keyword">True</span>)</span><br><span class="line"></span><br><span class="line"> self.h0 = tf.reshape(</span><br><span class="line"> self.z_, [<span class="number">-1</span>, s_h16, s_w16, self.gf_dim * <span class="number">8</span>])</span><br><span class="line"> h0 = tf.nn.relu(self.g_bn0(self.h0))</span><br><span class="line"></span><br><span class="line"> self.h1, self.h1_w, self.h1_b = deconv2d(</span><br><span class="line"> h0, [self.batch_size, s_h8, s_w8, self.gf_dim*<span class="number">4</span>], name=<span class="string">'g_h1'</span>, with_w=<span class="keyword">True</span>)</span><br><span class="line"> h1 = tf.nn.relu(self.g_bn1(self.h1))</span><br><span class="line"></span><br><span class="line"> h2, self.h2_w, self.h2_b = deconv2d(</span><br><span class="line"> h1, [self.batch_size, s_h4, s_w4, self.gf_dim*<span class="number">2</span>], name=<span class="string">'g_h2'</span>, with_w=<span class="keyword">True</span>)</span><br><span class="line"> h2 = tf.nn.relu(self.g_bn2(h2))</span><br><span class="line"></span><br><span class="line"> h3, self.h3_w, self.h3_b = deconv2d(</span><br><span class="line"> h2, [self.batch_size, s_h2, s_w2, self.gf_dim*<span class="number">1</span>], name=<span class="string">'g_h3'</span>, with_w=<span class="keyword">True</span>)</span><br><span class="line"> h3 = tf.nn.relu(self.g_bn3(h3))</span><br><span class="line"></span><br><span class="line"> h4, self.h4_w, self.h4_b = deconv2d(</span><br><span class="line"> h3, [self.batch_size, s_h, s_w, self.c_dim], name=<span class="string">'g_h4'</span>, with_w=<span class="keyword">True</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> tf.nn.tanh(h4)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> s_h, s_w = self.output_height, self.output_width</span><br><span class="line"> s_h2, s_h4 = int(s_h/<span class="number">2</span>), int(s_h/<span class="number">4</span>)</span><br><span class="line"> s_w2, s_w4 = int(s_w/<span class="number">2</span>), int(s_w/<span class="number">4</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># yb = tf.expand_dims(tf.expand_dims(y, 1),2)</span></span><br><span class="line"> yb = tf.reshape(y, [self.batch_size, <span class="number">1</span>, <span class="number">1</span>, self.y_dim])</span><br><span class="line"> z = concat([z, y], <span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> h0 = tf.nn.relu(</span><br><span class="line"> self.g_bn0(linear(z, self.gfc_dim, <span class="string">'g_h0_lin'</span>)))</span><br><span class="line"> h0 = concat([h0, y], <span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> h1 = tf.nn.relu(self.g_bn1(</span><br><span class="line"> linear(h0, self.gf_dim*<span class="number">2</span>*s_h4*s_w4, <span class="string">'g_h1_lin'</span>)))</span><br><span class="line"> h1 = tf.reshape(h1, [self.batch_size, s_h4, s_w4, self.gf_dim * <span class="number">2</span>])</span><br><span class="line"></span><br><span class="line"> h1 = conv_cond_concat(h1, yb)</span><br><span class="line"></span><br><span class="line"> h2 = tf.nn.relu(self.g_bn2(deconv2d(h1,</span><br><span class="line"> [self.batch_size, s_h2, s_w2, self.gf_dim * <span class="number">2</span>], name=<span class="string">'g_h2'</span>)))</span><br><span class="line"> h2 = conv_cond_concat(h2, yb)</span><br><span class="line"></span><br><span class="line">
201 <span class="keyword">return</span> tf.nn.sigmoid(</span><br><span class="line"> deconv2d(h2, [self.batch_size, s_h, s_w, self.c_dim], name=<span class="string">'g_h3'</span>))</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">sampler</span><span class="params">(self, z, y=None)</span>:</span> <span class="comment"># éæ ·æµè¯</span></span><br><span class="line"> <span class="keyword">with</span> tf.variable_scope(<span class="string">"generator"</span>) <span class="keyword">as</span> scope:</span><br><span class="line"> scope.reuse_variables()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.y_dim: <span class="comment"># generator</span></span><br><span class="line"> s_h, s_w = self.output_height, self.output_width</span><br><span class="line"> s_h2, s_w2 = conv_out_size_same(s_h, <span class="number">2</span>), conv_out_size_same(s_w, <span class="number">2</span>)</span><br><span class="line"> s_h4, s_w4 = conv_out_size_same(s_h2, <span class="number">2</span>), conv_out_size_same(s_w2, <span class="number">2</span>)</span><br><span class="line"> s_h8, s_w8 = conv_out_size_same(s_h4, <span class="number">2</span>), conv_out_size_same(s_w4, <span class="number">2</span>)</span><br><span class="line"> s_h16, s_w16 = conv_out_size_same(s_h8, <span class="number">2</span>), conv_out_size_same(s_w8, <span class="number">2</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># project `z` and reshape</span></span><br><span class="line"> h0 = tf.reshape(</span><br><span class="line"> linear(z, self.gf_dim*<span class="number">8</span>*s_h16*s_w16, <span class="string">'g_h0_lin'</span>),</span><br><span class="line"> [<span class="number">-1</span>, s_h16, s_w16, self.gf_dim * <span class="number">8</span>])</span><br><span class="line"> h0 = tf.nn.relu(self.g_bn0(h0, train=<span class="keyword">False</span>))</span><br><span class="line"></span><br><span class="line"> h1 = deconv2d(h0, [self.batch_size, s_h8, s_w8, self.gf_dim*<span class="number">4</span>], name=<span class="string">'g_h1'</span>)</span><br><span class="line"> h1 = tf.nn.relu(self.g_bn1(h1, train=<span class="keyword">False</span>))</span><br><span class="line"></span><br><span class="line"> h2 = deconv2d(h1, [self.batch_size, s_h4, s_w4, self.gf_dim*<span class="number">2</span>], name=<span class="string">'g_h2'</span>)</span><br><span class="line"> h2 = tf.nn.relu(self.g_bn2(h2, train=<span class="keyword">False</span>))</span><br><span class="line"></span><br><span class="line"> h3 = deconv2d(h2, [self.batch_size, s_h2, s_w2, self.gf_dim*<span class="number">1</span>], name=<span class="string">'g_h3'</span>)</span><br><span class="line"> h3 = tf.nn.relu(self.g_bn3(h3, train=<span class="keyword">False</span>))</span><br><span class="line"></span><br><span class="line"> h4 = deconv2d(h3, [self.batch_size, s_h, s_w, self.c_dim], name=<span class="string">'g_h4'</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> tf.nn.tanh(h4)</span><br><span class="line"> <span class="keyword">else</span>: <span class="comment"># discriminator</span></span><br><span class="line"> s_h, s_w = self.output_height, self.output_width</span><br><span class="line"> s_h2, s_h4 = int(s_h/<span class="number">2</span>), int(s_h/<span class="number">4</span>)</span><br><span class="line"> s_w2, s_w4 = int(s_w/<span class="number">2</span>), int(s_w/<span class="number">4</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># yb = tf.reshape(y, [-1, 1, 1, self.y_dim])</span></span><br><span class="line"> yb = tf.reshape(y, [self.batch_size, <span class="number">1</span>, <span class="number">1</span>, self.y_dim])</span><br><span class="line"> z = concat([z, y], <span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> h0 = tf.nn.relu(self.g_bn0(linear(z, self.gfc_dim, <span class="string">'g_h0_lin'</span>), train=<span class="keyword">False</span>))</span><br><span class="line"> h0 = concat([h0, y], <span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> h1 = tf.nn.relu(self.g_bn1(</span><br><span class="line"> linear(h0, self.gf_dim*<span class="number">2</span>*s_h4*s_w4, <span class="string">'g_h1_lin'</span>), train=<span class="keyword">False</span>))</span><br><span class="line"> h1 = tf.reshape(h1, [self.batch_size, s_h4, s_w4, self.gf_dim * <span class="number">2</span>])</span><br><span class="line"> h1 = conv_cond_concat(h1, yb)</span><br><span class="line"></span><br><span class="line"> h2 = tf.nn.relu(self.g_bn2(</span><br><span class="line"> deconv2d(h1, [self.batch_size, s_h2, s_w2, self.gf_dim * <span class="number">2</span>], name=<span class="string">
201'g_h2'</span>), train=<span class="keyword">False</span>))</span><br><span class="line"> h2 = conv_cond_concat(h2, yb)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> tf.nn.sigmoid(deconv2d(h2, [self.batch_size, s_h, s_w, self.c_dim], name=<span class="string">'g_h3'</span>))</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">load_mnist</span><span class="params">(self)</span>:</span></span><br><span class="line"> data_dir = os.path.join(self.data_dir, self.dataset_name)</span><br><span class="line"> </span><br><span class="line"> fd = open(os.path.join(data_dir,<span class="string">'train-images-idx3-ubyte'</span>))</span><br><span class="line"> loaded = np.fromfile(file=fd,dtype=np.uint8)</span><br><span class="line"> trX = loaded[<span class="number">16</span>:].reshape((<span class="number">60000</span>,<span class="number">28</span>,<span class="number">28</span>,<span class="number">1</span>)).astype(np.float)</span><br><span class="line"></span><br><span class="line"> fd = open(os.path.join(data_dir,<span class="string">'train-labels-idx1-ubyte'</span>))</span><br><span class="line"> loaded = np.fromfile(file=fd,dtype=np.uint8)</span><br><span class="line"> trY = loaded[<span class="number">8</span>:].reshape((<span class="number">60000</span>)).astype(np.float)</span><br><span class="line"></span><br><span class="line"> fd = open(os.path.join(data_dir,<span class="string">'t10k-images-idx3-ubyte'</span>))</span><br><span class="line"> loaded = np.fromfile(file=fd,dtype=np.uint8)</span><br><span class="line"> teX = loaded[<span class="number">16</span>:].reshape((<span class="number">10000</span>,<span class="number">28</span>,<span class="number">28</span>,<span class="number">1</span>)).astype(np.float)</span><br><span class="line"></span><br><span class="line"> fd = open(os.path.join(data_dir,<span class="string">'t10k-labels-idx1-ubyte'</span>))</span><br><span class="line"> loaded = np.fromfile(file=fd,dtype=np.uint8)</span><br><span class="line"> teY = loaded[<span class="number">8</span>:].reshape((<span class="number">10000</span>)).astype(np.float)</span><br><span class="line"></span><br><span class="line"> trY = np.asarray(trY)</span><br><span class="line"> teY = np.asarray(teY)</span><br><span class="line"> </span><br><span class="line"> X = np.concatenate((trX, teX), axis=<span class="number">0</span>)</span><br><span class="line"> y = np.concatenate((trY, teY), axis=<span class="number">0</span>).astype(np.int)</span><br><span class="line"> </span><br><span class="line"> seed = <span class="number">547</span></span><br><span class="line"> np.random.seed(seed)</span><br><span class="line"> np.random.shuffle(X)</span><br><span class="line"> np.random.seed(seed)</span><br><span class="line"> np.random.shuffle(y)</span><br><span class="line"> </span><br><span class="line"> y_vec = np.zeros((len(y), self.y_dim), dtype=np.float)</span><br><span class="line"> <span class="keyword">for</span> i, label <span class="keyword">in</span> enumerate(y):</span><br><span class="line"> y_vec[i,y[i]] = <span class="number">1.0</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> X/<span class="number">255.</span>,y_vec</span><br><span class="line"></span><br><span class="line"><span class="meta"> @property # å¯ä»¥å½å±æ§æ¥ç¨</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">model_dir</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">"{}_{}_{}_{}"</span>.format(</span><br><span class="line"> self.dataset_name, self.batch_size,</span><br><span class="line"> self.output_height, self.output_width)</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">save</span><span class="params">(self, checkpoint_dir, step)</span>:</span></span><br><span class="line"> <span class="comment"># save checkpoint files</span></span><br><span class="line"> model_name = <span class="string">"DCGAN.model"</span></span><br><span class="line"> checkpoint_dir = os.path.join(checkpoint_dir, self.model_dir)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(checkpoint_dir):</span><br><span class="line"> os.makedirs(checkpoint_dir)</span><br><span class="line"></span><br><span class="line"> self.saver.save(self.sess,</span><br><span class="line"> os.path.join(checkpoint_dir, model_name),</span><br><span class="line"> global_step=step)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># load checkpoints file</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">load</span><span class="params">(self, checkpoint_dir)</span>:</span></span><br><span class="line"> <span class="keyword">
201import</span> re</span><br><span class="line"> print(<span class="string">" [*] Reading checkpoints..."</span>)</span><br><span class="line"> checkpoint_dir = os.path.join(checkpoint_dir, self.model_dir)</span><br><span class="line"> <span class="comment">#A CheckpointState if the state was available, None</span></span><br><span class="line"> <span class="comment"># otherwise</span></span><br><span class="line"> ckpt = tf.train.get_checkpoint_state(checkpoint_dir)</span><br><span class="line"> <span class="keyword">if</span> ckpt <span class="keyword">and</span> ckpt.model_checkpoint_path:</span><br><span class="line"> <span class="comment"># basename:Returns the final component of a pathname</span></span><br><span class="line"> ckpt_name = os.path.basename(ckpt.model_checkpoint_path)</span><br><span class="line"> self.saver.restore(self.sess, os.path.join(checkpoint_dir, ckpt_name))</span><br><span class="line"> counter = int(next(re.finditer(<span class="string">"(\d+)(?!.*\d)"</span>,ckpt_name)).group(<span class="number">0</span>))</span><br><span class="line"> print(<span class="string">" [*] Success to read {}"</span>.format(ckpt_name))</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">True</span>, counter</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">" [*] Failed to find a checkpoint"</span>)</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">False</span>, <span class="number">0</span></span><br></pre></td></tr></table></figure> 202<ul> 203<li><span class="lang:python decode:true crayon-inline ">from __future__ import division</span> è¿å¥è¯å½pythonççæ¬ä¸º2.xæ¶çæï¼å¯ä»¥è®©ä¸¤ä¸ªæ´æ°æ°åç¸é¤çç»æè¿åä¸ä¸ªæµ®ç¹æ°(å¨python2ä¸é»è®¤æ¯æ´æ°,python3é»è®¤ä¸ºæµ®ç¹æ°)ãglobå¯ä»¥ä»¥ç®åçæ£å表达å¼çéçæ¹å¼è¿åæä¸ªæä»¶å¤¹ä¸ç¬¦åè¦æ±çæä»¶åå表ã</li> 204<li>DCGANçæé æ¹æ³é¤äºè®¾ç½®ä¸å¤§å ç屿§ä¹å¤ï¼è¿è¦æ³¨æåºådatasetæ¯å¦æ¯mnist,å 为mnistæ¯ç°åº¦å¾å,æä»¥åºè¯¥è®¾ç½®channel = 1( <span class="lang:default decode:true crayon-inline ">self.c_dim = 1</span> ),妿æ¯å½©è²å¾åï¼å <span class="lang:default decode:true crayon-inline ">self.c_dim = 3</span> or <span class="lang:default decode:true crayon-inline ">self.c_dim = 4</span> ãç¶åå°±æ¯<strong>build_model</strong>ã</li> 205<li><span class="lang:default decode:true crayon-inline ">self.generator</span> ç¨äºæé çæå¨; <span class="lang:default decode:true crayon-inline ">self.discriminator</span> ç¨äºæé é´å«å¨; <span class="lang:default decode:true crayon-inline ">self.sampler</span> ç¨äºéæºéæ ·(ç¨äºçææ ·æ¬)ãè¿ééè¦æ³¨æçæ¯, <span class="lang:default decode:true crayon-inline ">self.y</span> åªæå½datasetæ¯mnistçæ¶åæä¸ä¸ºNone,䏿¯mnistçæ åµä¸,åªéè¦ <span class="lang:default decode:true crayon-inline ">self.z</span> å³å¯çæsamplesã</li> 206<li><span class="lang:default decode:true crayon-inline ">sigmoid_cross_entropy_with_logits</span> 彿°è¢«éæ°å®ä¹äºï¼æ¯ä¸ºäºå ¼å®¹ä¸åçæ¬çtensorflowãè¯¥å½æ°é¦å 使ç¨sigmoid activationï¼ç¶å计ç®cross-entropy lossã</li> 207<li><span class="lang:default decode:true crayon-inline ">self.g_loss</span> æ¯çæå¨æå¤±; <span class="lang:default decode:true crayon-inline ">self.d_loss_real</span> æ¯çå®å¾ççé´å«å¨æå¤±; <span class="lang:default decode:true crayon-inline ">self.d_loss_fake</span> æ¯èåå¾ç(ç±çæå¨çæçfake images)çæå¤±; <span class="lang:default decode:true crayon-inline ">self.d_loss</span> æ¯æ»çé´å«å¨æå¤±ã</li> 208<li>è¿éç <span class="lang:default decode:true crayon-inline ">histogram_summary</span> å <span class="lang:default decode:true crayon-inline ">scalar_summary</span> æ¯ä¸ºäºå¨åç»å¨tensorboardä¸å¯¹å个æå¤±å½æ°è¿è¡å¯è§åã</li> 209<li><span class="lang:default decode:true crayon-inline ">tf.trainable_variables()</span> å¯ä»¥è·åmodelçå ¨é¨å¯è®ç»åæ°,ç±äºæä»¬å¨å®ä¹çæå¨åé´å«å¨åéçæ¶å使ç¨äºä¸åçname,å æ¤æä»¬å¯ä»¥éè¿variableçnameæ¥è·åå¾å°<strong>self.d_vars</strong>(é´å«å¨ç¸å ³åé),<strong>self.g_vars</strong>(çæå¨ç¸å ³åé)ã <span class="lang:default decode:true crayon-inline ">self.saver = tf.train.Saver()</span> ç¨äºä¿åè®ç»å¥½ç模ååæ°å°checkpointã</li> 210<li><span class="lang:default decode:true crayon-inline ">train</span> 彿°æ¯æ ¸å¿çè®ç»å½æ°ãè¿éoptimizeråDCGANçåæä¿æä¸ç´ï¼éç¨<strong>Adam</strong>ä¼å彿°, <span class="lang:default decode:true crayon-inline ">lr=0.0002</span> , <span class="lang:default decode:true crayon-inline ">beta1=0.5</span> ã <span class="lang:default decode:true crayon-inline ">merge_summary</span> 彿°å <span class="lang:default decode:true crayon-inline ">SummaryWriter</span> ç¨äºæå»ºsummary,å¨tensorboard䏿¾ç¤ºã</li> 211<li><span class="lang:default decode:true crayon-inline ">sample_z</span> æ¯ä»[-1,1]çåååå¸äº§ççã妿datasetæ¯mnist,åå¯ä»¥ç´æ¥è¯»å<strong>sample_inputs</strong>å<strong>sample_labels</strong>
211ãå¦åéè¦æå¨é个å¤çå¾å, <span class="lang:default decode:true crayon-inline ">get_image</span><br>è¿åçæ¯åå¼ä¸º(-1,1)ç,shape为(resize_height,resize_width)çndarrayã妿å¤ççå¾åæ¯ç°åº¦å¾å,åéè¦åå¢å ä¸ä¸ªdim,表示å¾åç<strong>channel=1</strong>ï¼å¯¹åºçä»£ç æ¯ <span class="lang:default decode:true crayon-inline ">sample_inputs = np.array(sample).astype(np.float32)[:, :, :, None]</span> ã</li> 212<li>æ¥ä¸æ¥éè¿ <span class="lang:default decode:true crayon-inline ">self.sess.run([d_optim,â¦</span> å <span class="lang:default decode:true crayon-inline ">self.sess.run([g_optim,â¦)</span> æ¥æ´æ°é´å«å¨åçæå¨ã <span class="lang:default decode:true crayon-inline ">self.writer.add_summary(summary_str, counter)</span> å¢å summaryå°writerãç±äºåæ ·çåå ,è¿éä»ç¶éè¦åºåmniståå ¶ä»çæ°æ®éï¼æä»¥è®¡ç®æä¼å彿°çè¿ç¨éè¦ä¸ä¸ª<strong>if</strong>åä¸ä¸ª<strong>else</strong>ã</li> 213<li><span class="lang:default decode:true crayon-inline ">np.mod(counter, config.print_every) == 1</span> 表示æ¯<em>print_every</em>次çæä¸æ¬¡samples; <span class="lang:default decode:true crayon-inline ">np.mod(counter, config.checkpoint_every) == 2</span> 表示æ¯<em>checkpoint_every</em>次ä¿åä¸ä¸checkpoint fileã</li> 214<li>ä¸é¢æ¯discriminator(é´å«å¨)çå ·ä½å®ç°ãé¦å é´å«å¨ä½¿ç¨<strong>conv</strong>(å·ç§¯)æä½ï¼æ¿æ´»å½æ°ä½¿ç¨<strong>leaky-relu</strong>,æ¯ä¸ä¸ªlayeréè¦ä½¿ç¨batch normalizationãtensorflowçbatch normalizationä½¿ç¨ <span class="lang:default decode:true crayon-inline ">tf.contrib.layers.batch_norm</span> å®ç°ã妿䏿¯mnist,å第ä¸å±ä½¿ç¨<strong>leaky-relu+conv2d</strong>,åé¢ä¸å±é½ä½¿ç¨<strong>conv2d+BN+leaky-relu</strong>,æåå ä¸ä¸ä¸ªone hidden unitçlinear layer,åéå ¥sigmoid彿°å³å¯ï¼å¦ææ¯mnist,å <span class="lang:default decode:true crayon-inline ">yb = tf.reshape(y, [self.batch_size, 1, 1, self.y_dim])</span> é¦å ç»yå¢å 两维ï¼ä»¥ä¾¿å¯ä»¥åimageè¿æ¥èµ·æ¥ï¼è¿éå®é 䏿¯ä½¿ç¨äºconditional GAN(æ¡ä»¶GAN)çææ³ã <span class="lang:default decode:true crayon-inline ">x = conv_cond_concat(image, yb)</span> å¾å°conditionåimageåå¹¶ä¹åçç»æï¼ç¶å <span class="lang:default decode:true crayon-inline ">h0 = lrelu(conv2d(x, self.c_dim + self.y_dim, name=âd_h0_convâ))</span> è¿è¡å·ç§¯æä½ãç¬¬äºæ¬¡è¿è¡<strong>conv2d+leaky-relu+concat</strong>æä½ãç¬¬ä¸æ¬¡è¿è¡<strong>conv2d+BN+leaky-relu+reshape+concat</strong>æä½ãç¬¬åæ¬¡è¿è¡<strong>linear+BN+leaky-relu+concat</strong>æä½ãæååæ ·æ¯<strong>linear+sigmoid</strong>æä½ã</li> 215<li>ä¸é¢æ¯generator(çæå¨)çå ·ä½å®ç°ãådiscriminatorä¸åçæ¯,generatoréè¦ä½¿ç¨deconv(åå·ç§¯)以årelu æ¿æ´»å½æ°ãgeneratorçç»ææ¯:1.妿䏿¯mnist:<strong>linear+reshape+BN+reluâ->(deconv+BN+relu)x3 â->deconv+tanh</strong>;2.妿æ¯mnist,åé¤äºéè¦èèè¾å ¥zä¹å¤ï¼è¿éè¦èèlabel y,å³éè¦å°zåyè¿æ¥èµ·æ¥(Conditional GAN),å ·ä½çç»ææ¯:reshape+concatâ->linear+BN+relu+concatâ->linear+BN+relu+reshape+concatâ->deconv+BN+relu+concatâ->deconv+sigmoidãæ³¨æçæåçæ¿æ´»å½æ°æ²¡æéç¨é常çtanh,èæ¯éç¨äºsigmoid(å ¶è¾åºä¼ç´æ¥æ å°å°0-1ä¹é´)ã</li> 216<li>sampler彿°æ¯éæ ·å½æ°ï¼ç¨äºçææ ·æ¬éå ¥å½åè®ç»ççæå¨ï¼æ¥çè®ç»ææãå ¶é»è¾ågenerator彿°åºæ¬ç±»ä¼¼,乿¯éè¦åºåæ¯å¦æ¯mnist,äºè éè¦éç¨ä¸åçç»æã䏿¯mnistæ¶,y=Noneå³å¯ï¼å¦åmnistè¿éè¦èèyã</li> 217<li><span class="lang:default decode:true crayon-inline ">load_mnist</span> 彿°ç¨äºå è½½mnistæ°æ®é; <span class="lang:default decode:true crayon-inline ">save</span> 彿°ç¨äºä¿åcheckpoint; <span class="lang:default decode:true crayon-inline ">load</span> 彿°ç¨äºå è½½checkpointã</li> 218</ul> 219<h4 id="2-4-ops-py"><a href="#2-4-ops-py" class="headerlink" title="2.4 ops.py"></a>2.4 <strong>ops.py</strong></h4><h4 id="nbsp-nbsp-nbsp-nbsp-ops-py代ç å¦ä¸"><a href="#nbsp-nbsp-nbsp-nbsp-ops-py代ç å¦ä¸" class="headerlink" title=" ops.py代ç å¦ä¸:"></a> ops.py代ç å¦ä¸:</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">
21953</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> math</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np </span><br><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> tensorflow.python.framework <span class="keyword">import</span> ops</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> utils <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> image_summary = tf.image_summary</span><br><span class="line"> scalar_summary = tf.scalar_summary</span><br><span class="line"> histogram_summary = tf.histogram_summary</span><br><span class="line"> merge_summary = tf.merge_summary</span><br><span class="line"> SummaryWriter = tf.train.SummaryWriter</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"> image_summary = tf.summary.image</span><br><span class="line"> scalar_summary = tf.summary.scalar</span><br><span class="line"> histogram_summary = tf.summary.histogram</span><br><span class="line"> merge_summary = tf.summary.merge</span><br><span class="line"> SummaryWriter = tf.summary.FileWriter</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="string">"concat_v2"</span> <span class="keyword">in</span> dir(tf):</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">concat</span><span class="params">(tensors, axis, *args, **kwargs)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> tf.concat_v2(tensors, axis, *args, **kwargs)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">concat</span><span class="params">(tensors, axis, *args, **kwargs)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> tf.concat(tensors, axis, *args, **kwargs)</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">batch_norm</span><span class="params">(object)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, epsilon=<span class="number">1e-5</span>, momentum = <span class="number">
2190.9</span>, name=<span class="string">"batch_norm"</span>)</span>:</span></span><br><span class="line"> <span class="keyword">with</span> tf.variable_scope(name):</span><br><span class="line"> self.epsilon = epsilon</span><br><span class="line"> self.momentum = momentum</span><br><span class="line"> self.name = name</span><br><span class="line"></span><br><span class="line"> <span class="comment"># å®ä¹äºclass ç__call__ æ¹æ³ï¼å¯ä»¥æç±»å彿°ä¸æ ·è°ç¨</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__call__</span><span class="params">(self, x, train=True)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> tf.contrib.layers.batch_norm(x,</span><br><span class="line"> decay=self.momentum, </span><br><span class="line"> updates_collections=<span class="keyword">None</span>,</span><br><span class="line"> epsilon=self.epsilon,</span><br><span class="line"> scale=<span class="keyword">True</span>,</span><br><span class="line"> is_training=train,</span><br><span class="line"> scope=self.name)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">conv_cond_concat</span><span class="params">(x, y)</span>:</span></span><br><span class="line"> <span class="string">"""Concatenate conditioning vector on feature map axis."""</span></span><br><span class="line"> x_shapes = x.get_shape()</span><br><span class="line"> y_shapes = y.get_shape()</span><br><span class="line"> <span class="comment"># 沿axis = 3(æåä¸ä¸ªç»´åº¦è¿æ¥)</span></span><br><span class="line"> <span class="keyword">return</span> concat([</span><br><span class="line"> x, y*tf.ones([x_shapes[<span class="number">0</span>], x_shapes[<span class="number">1</span>], x_shapes[<span class="number">2</span>], y_shapes[<span class="number">3</span>
219]])], <span class="number">3</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">conv2d</span><span class="params">(input_, output_dim, </span></span></span><br><span class="line"><span class="function"><span class="params"> k_h=<span class="number">5</span>, k_w=<span class="number">5</span>, d_h=<span class="number">2</span>, d_w=<span class="number">2</span>, stddev=<span class="number">0.02</span>,</span></span></span><br><span class="line"><span class="function"><span class="params"> name=<span class="string">"conv2d"</span>)</span>:</span></span><br><span class="line"> <span class="keyword">with</span> tf.variable_scope(name):</span><br><span class="line"> w = tf.get_variable(<span class="string">'w'</span>, [k_h, k_w, input_.get_shape()[<span class="number">-1</span>], output_dim],</span><br><span class="line"> initializer=tf.truncated_normal_initializer(stddev=stddev))</span><br><span class="line"> conv = tf.nn.conv2d(input_, w, strides=[<span class="number">1</span>, d_h, d_w, <span class="number">1</span>], padding=<span class="string">'SAME'</span>)</span><br><span class="line"></span><br><span class="line"> biases = tf.get_variable(<span class="string">'biases'</span>, [output_dim], initializer=tf.constant_initializer(<span class="number">0.0</span>))</span><br><span class="line"> conv = tf.reshape(tf.nn.bias_add(conv, biases), conv.get_shape())</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> conv</span><br><span class="line"></span><br><span class="line"><span class="comment"># åä¸ä¸ªåå·ç§¯æä½,tf.nn.conv2d_transpose</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">deconv2d</span><span class="params">(input_, output_shape,</span></span></span><br><span class="line"><span class="function"><span class="params"> k_h=<span class="number">5</span>, k_w=<span class="number">5</span>, d_h=<span class="number">2</span>, d_w=<span class="number">2</span>, stddev=<span class="number">0.02</span>,</span></span></span><br><span class="line"><span class="function"><span class="params"> name=<span class="string">"deconv2d"</span>, with_w=False)</span>:</span></span><br><span class="line"> <span class="keyword">with</span> tf.variable_scope(name):</span><br><span class="line"> <span class="comment"># filter : [height, width, output_channels, in_channels]</span></span><br><span class="line"> w = tf.get_variable(<span class="string">'w'</span>, [k_h, k_w, output_shape[<span class="number">-1</span>], input_.get_shape()[<span class="number">-1</span>]],</span><br><span class="line"> initializer=tf.random_normal_initializer(stddev=stddev))</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> deconv = tf.nn.conv2d_transpose(input_, w, output_shape=output_shape,</span><br><span class="line"> strides=[<span class="number">1</span>, d_h, d_w, <span class="number">1</span>])</span><br><span class="line"></span><br><span class="line"> <span class="comment"># Support for verisons of TensorFlow before 0.7.0</span></span><br><span class="line"> <span class="keyword">except</span> AttributeError:</span><br><span class="line"> deconv = tf.nn.deconv2d(input_, w, output_shape=output_shape,</span><br><span class="line"> strides=[<span class="number">1</span>, d_h, d_w, <span class="number">1</span>])</span><br><span class="line"></span><br><span class="line"> biases = tf.get_variable(<span class="string">'biases'</span>, [output_shape[<span class="number">-1</span>]], initializer=tf.constant_initializer(<span class="number">0.0</span>))</span><br><span class="line"> deconv = tf.reshape(tf.nn.bias_add(deconv, biases), deconv.get_shape())</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> with_w:</span><br><span class="line">
219 <span class="keyword">return</span> deconv, w, biases</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> deconv</span><br><span class="line"></span><br><span class="line"><span class="comment"># leaky relu</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">lrelu</span><span class="params">(x, leak=<span class="number">0.2</span>, name=<span class="string">"lrelu"</span>)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> tf.maximum(x, leak*x)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">linear</span><span class="params">(input_, output_size, scope=None, stddev=<span class="number">0.02</span>, bias_start=<span class="number">0.0</span>, with_w=False)</span>:</span></span><br><span class="line"> <span class="comment"># æ¬è´¨å
¶å®å°±æ¯åäºä¸ä¸ªmatmul....</span></span><br><span class="line"> shape = input_.get_shape().as_list()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">with</span> tf.variable_scope(scope <span class="keyword">or</span> <span class="string">"Linear"</span>):</span><br><span class="line"> matrix = tf.get_variable(<span class="string">"Matrix"</span>, [shape[<span class="number">1</span>], output_size], tf.float32,</span><br><span class="line"> tf.random_normal_initializer(stddev=stddev))</span><br><span class="line"> bias = tf.get_variable(<span class="string">"bias"</span>, [output_size],</span><br><span class="line"> initializer=tf.constant_initializer(bias_start))</span><br><span class="line"> <span class="keyword">if</span> with_w:</span><br><span class="line"> <span class="keyword">return</span>
219 tf.matmul(input_, matrix) + bias, matrix, bias</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> tf.matmul(input_, matrix) + bias</span><br></pre></td></tr></table></figure> 220<ul> 221<li>第9è¡å°ç¬¬20è¡çä»£ç æ¯ä¸ºäºä¿ætf0.xåtf1.xçæ¬çå ¼å®¹æ§ãtf0.xçæ¬ä½¿ç¨<strong>tf.xxx_summary</strong>飿 ¼ç彿°ï¼ètf1.xçæ¬å使ç¨tf.summary.xxx飿 ¼ç彿°ã为äºä¿æä¸è´æ§ï¼éè¿éå½åç»ä¸æ<strong>tf.xxx_summary</strong>飿 ¼äºã</li> 222<li>22è¡å°27è¡éæ°å®ä¹äºconcat彿°ï¼ä¹æ¯ä¸ºäºå ¼å®¹æ§èè, <span class="lang:default decode:true crayon-inline ">if âconcat_v2â in dir(tf):</span> è¿å¥è¯æ¯è¯´å¦ætfæconcat_v2è¿ä¸ªæ¹æ³çè¯ï¼tf0.xä¸ä½¿ç¨<strong>concat_v2</strong>彿°ï¼ètf1.xçæ¬ä¸ä½¿ç¨<strong>concat</strong>彿°ã</li> 223<li>29è¡å°44è¡å®ä¹äº<strong>batch_norm</strong>ç±»ãéè¦æ³¨æçæ¯37-44è¡å®ä¹äºç±»ç__call__ç¹æ®æ¹æ³ï¼è¿ä¸ªæ¹æ³çä½ç¨æ¯å¯ä»¥å°ç±»åæ®éç彿°é£æ ·ç´æ¥è°ç¨ï¼èä¸ç¨å æé ä¸ä¸ªå¯¹è±¡åè°ç¨æ¹æ³ï¼è¿æ¯å¸¸ç¨çä¸ä¸ªæå·§ãtfä¸çbatch normalization æ¯å½æ° <span class="lang:default decode:true crayon-inline ">tf.contrib.layers.batch_norm</span> </li> 224<li><strong>conv_cond_concat</strong>彿°çä½ç¨æ¯å°conv(å·ç§¯)åcond(æ¡ä»¶)concatèµ·æ¥ãå¨mnistçgeneratorådiscriminatorä¸ä¼ç¨å°ã</li> 225<li>54è¡å°65è¡ç<strong>conv2d</strong>彿°éæ°å®ä¹äºå·ç§¯æä½ï¼ä¸»è¦æ¯å°è£ äº <span class="lang:default decode:true crayon-inline ">tf.nn.conv2d</span> 彿°ã</li> 226<li>68è¡å°91è¡å®ä¹äº<strong>deconv2d</strong>(åå·ç§¯)彿°ãtf0.xçåå·ç§¯å½æ°ä¸º <span class="lang:default decode:true crayon-inline ">tf.nn.deconv2d</span> ,tf1.xçåå·ç§¯å½æ°ä¸º <span class="lang:default decode:true crayon-inline ">tf.nn.conv2d_transpose</span> ãæåè¿å ä¸äºä¸ä¸ªbias( <span class="lang:default decode:true crayon-inline ">tf.nn.bias_add</span> )ã</li> 227<li>94å°95è¡å®ä¹äºleaky-relu彿°<strong>lrelu</strong>ãå ¶å®å°±ä¸è¡ä»£ç : <span class="lang:default decode:true crayon-inline ">tf.maximum(x, leak*x)</span> ã</li> 228<li>97è¡å°109è¡å®ä¹äºlinear彿°ï¼å ¶å®å°±æ¯ä¸ä¸ª<strong>fully_connected layer</strong>ã</li> 229</ul> 230<h4 id="2-5-utils-py"><a href="#2-5-utils-py" class="headerlink" title="2.5 utils.py"></a>2.5 <strong>utils.py</strong></h4><h4 id="nbsp-nbsp-nbsp-nbsp-utils-py代ç å¦ä¸"><a href="#nbsp-nbsp-nbsp-nbsp-utils-py代ç å¦ä¸" class="headerlink" title=" utils.py代ç å¦ä¸:"></a> utils.py代ç å¦ä¸:</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">
23053</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">
230194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">
230328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br></pre></td><td class="code"><pre><span class="line">"""</span><br><span class="line">Some codes from https://github.com/Newmu/dcgan_code</span><br><span class="line">"""</span><br><span class="line">from __future__ import division</span><br><span class="line">from glob import glob</span><br><span class="line">from os.path import join,basename,exists</span><br><span class="line">from os import makedirs</span><br><span class="line">import math</span><br><span class="line">import json</span><br><span class="line">import random</span><br><span class="line">import pprint</span><br><span class="line">import scipy.misc</span><br><span class="line">import numpy as np</span><br><span class="line">from time import gmtime, strftime</span><br><span class="line">from six.moves import xrange</span><br><span class="line"></span><br><span class="line">import tensorflow as tf</span><br><span class="line">import tensorflow.contrib.slim as slim</span><br><span class="line"></span><br><span class="line">pp = pprint.PrettyPrinter()</span><br><span class="line"></span><br><span class="line">get_stddev = lambda x, k_h, k_w: 1/math.sqrt(k_w*k_h*x.get_shape()[-1])</span><br><span class="line"></span><br><span class="line">def show_all_variables():</span><br><span class="line"> model_vars = tf.trainable_variables()</span><br><span class="line"> # Prints the names and shapes of the variables</span><br><span class="line"> slim.model_analyzer.analyze_vars(model_vars, print_info=True)</span><br><span class="line"></span><br><span class="line">def get_image(image_path, input_height, input_width,</span><br><span class="line"> resize_height=64, resize_width=64,</span><br><span class="line"> crop=True, grayscale=False):</span><br><span class="line"> image = imread(image_path, grayscale)</span><br><span class="line"> return transform(image, input_height, input_width,</span><br><span class="line"> resize_height, resize_width, crop)</span><br><span class="line"></span><br><span class="line">def save_images(images, size, image_path):</span><br><span class="line"> return imsave(inverse_transform(images), size, image_path)</span><br><span class="line"></span><br><span class="line">def imread(path, grayscale = False):</span><br><span class="line"> if (grayscale):</span><br><span class="line"> return scipy.misc.imread(path, flatten = True).astype(np.float)</span><br><span class="line"> else:</span><br><span class="line"> return scipy.misc.imread(path).astype(np.float)</span><br><span class="line"></span><br><span class="line">def merge_images(images, size):</span><br><span class="line"> return inverse_transform(images)</span><br><span class="line"></span><br><span class="line">def merge(images, size):</span><br><span class="line"> # samples å¾çççå®é«å宽</span><br><span class="line"> h, w = images.shape[1], images.shape[2]</span><br><span class="line"> # å¾çchannelçææå¼åªè½æ¯3æè
4</span><br><span class="line"> if (images.shape[3] in (3,4)):</span><br><span class="line"> c = images.shape[3]</span><br><span class="line"> # imgæ¯åå¹¶ä¹åç大å¾ç,å¾ç宽åé«é½åå¢äº</span><br><span class="line"> img = np.zeros((h * size[0], w * size[1], c))</span><br><span class="line"> # é忝ä¸å¼ å¾ç</span><br><span class="line"> for idx, image in enumerate(images):</span><br><span class="line"> i = idx % size[1]</span><br><span class="line"> j = idx // size[1]</span><br><span class="line"> # 便¬¡å大å¾å¡«å
å°å¾(æè¡å¡«å
)</span><br><span class="line"> img[j * h:j * h + h, i * w:i * w + w, :] = image</span><br><span class="line"> return img</span><br><span class="line"> elif images.shape[3]==1:</span><br><span class="line"> # drop channel</span><br><span class="line"> img = np.zeros((h * size[0], w * size[1]))</span><br><span class="line"> for idx, image in enumerate(images):</span><br><span class="line"> i = idx % size[1]</span><br><span class="line"> j = idx // size[1]</span><br><span class="line"> img[j * h:j * h + h, i * w:i * w + w] = image[:,:,0]</span><br><span class="line"> return img</span><br><span class="line"> else:</span><br><span class="line"> raise ValueError('in merge(images,size) images parameter '</span><br><span class="line"> 'must have dimensions: HxW or HxWx3 or HxWx4')</span><br><span class="line"></span><br><span class="line">def imsave(images, size, path):</span><br><span class="line"> '''</span><br><span class="line">
230 modified imsave</span><br><span class="line"> :param images: ndarray,shape:(batch,height,width,channel)</span><br><span class="line"> :param size: (row images num,col images num)</span><br><span class="line"> :param path: save path</span><br><span class="line"> :return:</span><br><span class="line"> '''</span><br><span class="line"> # np.squeeze:å»é¤ç»´åº¦ä¸º1çç»´</span><br><span class="line"> image = np.squeeze(merge(images, size))</span><br><span class="line"> return scipy.misc.imsave(path, image)</span><br><span class="line"></span><br><span class="line">def center_crop(x, crop_h, crop_w,</span><br><span class="line"> resize_h=64, resize_w=64):</span><br><span class="line"> '''</span><br><span class="line"> 对å¾åè¿è¡ä¸å¿åcropå¤ç</span><br><span class="line"> :param x: image ndarray</span><br><span class="line"> :param crop_h: input height</span><br><span class="line"> :param crop_w: input width</span><br><span class="line"> :param resize_h: resize height</span><br><span class="line"> :param resize_w: resize width</span><br><span class="line"> :return: resized image</span><br><span class="line"> '''</span><br><span class="line"> if crop_w is None:</span><br><span class="line"> crop_w = crop_h</span><br><span class="line"> h, w = x.shape[:2]</span><br><span class="line"> j = int(round((h - crop_h)/2.))</span><br><span class="line"> i = int(round((w - crop_w)/2.))</span><br><span class="line"> return scipy.misc.imresize(</span><br><span class="line"> x[j:j+crop_h, i:i+crop_w], [resize_h, resize_w])</span><br><span class="line"></span><br><span class="line">def transform(image, input_height, input_width, </span><br><span class="line"> resize_height=64, resize_width=64, crop=True):</span><br><span class="line"> '''</span><br><span class="line"> 对å¾åè¿è¡è½¬åå¤ç</span><br><span class="line"> :param image: ndarray of image</span><br><span class="line"> :param input_height: image height</span><br><span class="line"> :param input_width: image width</span><br><span class="line"> :param resize_height: height after resize</span><br><span class="line"> :param resize_width: width after resize</span><br><span class="line"> :param crop: if to crop or not</span><br><span class="line"> :return:</span><br><span class="line"> '''</span><br><span class="line"> if crop:</span><br><span class="line"> cropped_image = center_crop(</span><br><span class="line"> image, input_height, input_width, </span><br><span class="line"> resize_height, resize_width)</span><br><span class="line"> else:</span><br><span class="line"> # ç´æ¥resize</span><br><span class="line"> cropped_image = scipy.misc.imresize(image, [resize_height, resize_width])</span><br><span class="line"> # å°(0,255)æ å°å°(-1,1)</span><br><span class="line"> return np.array(cropped_image)/127.5 - 1.</span><br><span class="line"></span><br><span class="line">def inverse_transform(images):</span><br><span class="line"> # (-1,1) ---&gt; (0,1)</span><br><span class="line"> return (images+1.)/2.</span><br><span class="line"></span><br><span class="line">def to_json(output_path, *layers):</span><br><span class="line"> with open(output_path, "w") as layer_f:</span><br><span class="line"> lines = ""</span><br><span class="line"> for w, b, bn in layers:</span><br><span class="line"> layer_idx = w.name.split('/')[0].split('h')[1]</span><br><span class="line"></span><br><span class="line"> B = b.eval()</span><br><span class="line"></span><br><span class="line"> if "lin/" in w.name:</span><br><span class="line"> W = w.eval()</span><br><span class="line"> depth = W.shape[1]</span><br><span class="line"> else:</span><br><span class="line"> W = np.rollaxis(w.eval(), 2, 0)</span><br><span class="line"> depth = W.shape[0]</span><br><span class="line"></span><br><span class="line"> biases = {"sy": 1, "sx": 1, "depth": depth, "w": ['%.2f' % elem for elem in list(B)]}</span><br><span class="line"> if bn != None:</span><br><span class="line"> gamma = bn.gamma.eval()</span><br><span class="line"> beta = bn.beta.eval()</span><br><span class="line"></span><br><span class="line"> gamma = {"sy": 1, "sx": 1, "depth": depth, "w": ['%.2f' % elem for elem in list(gamma)]}</span><br><span class="line"> beta = {"sy": 1, "sx": 1, "depth": depth, "w": ['%.2f' % elem for elem in list(beta)]}</span><br><span class="line"> else:</span><br><span class="line"> gamma = {"sy": 1, "sx": 1, "depth": 0, "w": []}</span><br><span class="line"> beta = {"sy": 1, "sx": 1, "depth": 0, "w": []}</span><br><span class="line"></span><br><span class="line"> if "lin/" in w.name:</span><br><span class="line"> fs = []</span><br><span class="line"> for w in W.T:</span><br><span class="line"> fs.append({"sy": 1, "sx": 1, "depth": W.shape[0], "w": ['%.2f' % elem for elem in list(w)]})</span><br><span class="line"></span><br><span class="line"> lines += """</span><br><span class="line"> var layer_%s = {</span><br><span class="line"> "layer_type": "fc", </span><br><span class="line"> "sy": 1, "sx": 1, </span><br><span class="line"> "out_sx": 1, "out_sy": 1,</span><br><span class="line"> "
230stride": 1, "pad": 0,</span><br><span class="line"> "out_depth": %s, "in_depth": %s,</span><br><span class="line"> "biases": %s,</span><br><span class="line"> "gamma": %s,</span><br><span class="line"> "beta": %s,</span><br><span class="line"> "filters": %s</span><br><span class="line"> };""" % (layer_idx.split('_')[0], W.shape[1], W.shape[0], biases, gamma, beta, fs)</span><br><span class="line"> else:</span><br><span class="line"> fs = []</span><br><span class="line"> for w_ in W:</span><br><span class="line"> fs.append({"sy": 5, "sx": 5, "depth": W.shape[3], "w": ['%.2f' % elem for elem in list(w_.flatten())]})</span><br><span class="line"></span><br><span class="line"> lines += """</span><br><span class="line"> var layer_%s = {</span><br><span class="line"> "layer_type": "deconv", </span><br><span class="line"> "sy": 5, "sx": 5,</span><br><span class="line"> "out_sx": %s, "out_sy": %s,</span><br><span class="line"> "stride": 2, "pad": 1,</span><br><span class="line"> "out_depth": %s, "in_depth": %s,</span><br><span class="line"> "biases": %s,</span><br><span class="line"> "gamma": %s,</span><br><span class="line"> "beta": %s,</span><br><span class="line"> "filters": %s</span><br><span class="line"> };""" % (layer_idx, 2**(int(layer_idx)+2), 2**(int(layer_idx)+2),</span><br><span class="line"> W.shape[0], W.shape[3], biases, gamma, beta, fs)</span><br><span class="line"> layer_f.write(" ".join(lines.replace("'","").split()))</span><br><span class="line"></span><br><span class="line">def make_gif(images, fname, duration=2, true_image=False):</span><br><span class="line"> # çægifå¾</span><br><span class="line"> # duration:æç»æ¶é´</span><br><span class="line"> # images shape:(batch_size,height,width,channel)</span><br><span class="line"> import moviepy.editor as mpy</span><br><span class="line"></span><br><span class="line"> def make_frame(t):</span><br><span class="line"> try:</span><br><span class="line"> # x 代表æ¯tæ¶å»éåç帧å¾ç</span><br><span class="line"> x = images[int(len(images)/duration*t)]</span><br><span class="line"> except:</span><br><span class="line"> x = images[-1]</span><br><span class="line"></span><br><span class="line"> if true_image: # è¿åä¸ç»è¿å¤ççndarray,å
ç´ å¼æ¯(-1,1)ä¹é´</span><br><span class="line"> return x.astype(np.uint8)</span><br><span class="line"> else:</span><br><span class="line"> # (-1,1) ---&gt; (0,255)</span><br><span class="line"> return ((x+1)/2*255).astype(np.uint8)</span><br><span class="line"></span><br><span class="line"> clip = mpy.VideoClip(make_frame, duration=duration)</span><br><span class="line"> clip.write_gif(fname, fps = len(images) / duration)</span><br><span class="line"></span><br><span class="line">def visualize(sess, dcgan, config, option):</span><br><span class="line"> # ç¨äºå¯è§å</span><br><span class="line"> image_frame_dim = int(math.ceil(config.batch_size**.5)) # å¾ç尺寸</span><br><span class="line"> if option == 0:</span><br><span class="line"> # noise</span><br><span class="line"> z_sample = np.random.uniform(-0.5, 0.5, size=(config.batch_size, dcgan.z_dim))</span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample})</span><br><span class="line"> save_images(samples, [image_frame_dim, image_frame_dim], './%s/test_%s.png' % (config.sample_dir,strftime("%Y-%m-%d-%H-%M-%S", gmtime())))</span><br><span class="line"> elif option == 1: # å°samplesçæå¤§å¾</span><br><span class="line"> values = np.arange(0, 1, 1./config.batch_size)</span><br><span class="line"> for idx in xrange(dcgan.z_dim):</span><br><span class="line"> print(" [*] %d" % idx)</span><br><span class="line"> z_sample = np.random.uniform(-1, 1, size=(config.batch_size , dcgan.z_dim))</span><br><span class="line"> for kdx, z in enumerate(z_sample):</span><br><span class="line"> z[idx] = values[kdx]</span><br><span class="line"></span><br><span class="line"> if config.dataset == "mnist":</span><br><span class="line"> # yæ¯batch_size个0-9ä¹é´çéæºæ°</span><br><span class="line"> y = np.random.choice(10, config.batch_size)</span><br><span class="line"> save_random_digits(y,image_frame_dim,image_frame_dim,'./%s/test_arange_%s.txt' % (config.sample_dir,idx))</span><br><span class="line"> y_one_hot = np.zeros((config.batch_size, 10))</span><br><span class="line"> y_one_hot[np.arange(config.batch_size), y] = 1</span><br><span class="line"></span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample, dcgan.y: y_one_hot})</span><br><span class="line"> else:</span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample})</span><br><span class="line"></span><br><span class="line"> save_images(samples, [image_frame_dim, image_frame_dim], &ap
230os;./%s/test_arange_%s.png' % (config.sample_dir,idx))</span><br><span class="line"> elif option == 2:</span><br><span class="line"> values = np.arange(0, 1, 1./config.batch_size)</span><br><span class="line"> # idxæ¯éæºç</span><br><span class="line"> for idx in [random.randint(0, dcgan.z_dim - 1) for _ in xrange(dcgan.z_dim)]:</span><br><span class="line"> print(" [*] %d" % idx)</span><br><span class="line"> # z_dim:test_images_num</span><br><span class="line"> z = np.random.uniform(-0.2, 0.2, size=(dcgan.z_dim))</span><br><span class="line"> # np.tile:æç §æå®ç维度å°arrayéå¤</span><br><span class="line"> # z_sample shape:(batch_size,z_dim)</span><br><span class="line"> z_sample = np.tile(z, (config.batch_size, 1))</span><br><span class="line"> #z_sample = np.zeros([config.batch_size, dcgan.z_dim])</span><br><span class="line"> for kdx, z in enumerate(z_sample):</span><br><span class="line"> z[idx] = values[kdx]</span><br><span class="line"></span><br><span class="line"> if config.dataset == "mnist":</span><br><span class="line"> y = np.random.choice(10, config.batch_size)</span><br><span class="line"> #save_random_digits(y, image_frame_dim, image_frame_dim, './%s/test_%s.txt' % % (config.sample_dir,strftime("%Y-%m-%d-%H-%M-%S", gmtime())))</span><br><span class="line"> y_one_hot = np.zeros((config.batch_size, 10))</span><br><span class="line"> y_one_hot[np.arange(config.batch_size), y] = 1</span><br><span class="line"></span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample, dcgan.y: y_one_hot})</span><br><span class="line"> else:</span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample})</span><br><span class="line"></span><br><span class="line"> try:</span><br><span class="line"> make_gif(samples, './%s/test_gif_%s.gif' % (config.sample_dir,idx))</span><br><span class="line"> except:</span><br><span class="line"> save_images(samples, [image_frame_dim, image_frame_dim], './%s/test_%s.png' % (config.sample_dir,strftime("%Y-%m-%d-%H-%M-%S", gmtime())))</span><br><span class="line"> elif option == 3: # ä¸è½æ¯mnist,ç´æ¥çægif</span><br><span class="line"> values = np.arange(0, 1, 1./config.batch_size)</span><br><span class="line"> for idx in xrange(dcgan.z_dim):</span><br><span class="line"> print(" [*] %d" % idx)</span><br><span class="line"> z_sample = np.zeros([config.batch_size, dcgan.z_dim])</span><br><span class="line"> for kdx, z in enumerate(z_sample):</span><br><span class="line"> z[idx] = values[kdx]</span><br><span class="line"></span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample})</span><br><span class="line"> make_gif(samples, './%s/test_gif_%s.gif' % (config.sample_dir,idx))</span><br><span class="line"> elif option == 4:</span><br><span class="line"> image_set = []</span><br><span class="line"> values = np.arange(0, 1, 1./config.batch_size)</span><br><span class="line"></span><br><span class="line"> for idx in xrange(dcgan.z_dim):</span><br><span class="line"> print(" [*] %d" % idx)</span><br><span class="line"> z_sample = np.zeros([config.batch_size, dcgan.z_dim])</span><br><span class="line"> for kdx, z in enumerate(z_sample): z[idx] = values[kdx]</span><br><span class="line"></span><br><span class="line"> image_set.append(sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample}))</span><br><span class="line"> #make_gif(image_set[-1], './%s/test_gif_%s.gif' % (config.sample_dir,idx))</span><br><span class="line"></span><br><span class="line"> # åæä¸å¼ 大å¾gif(64å¼ å¤§å¾)</span><br><span class="line"> new_image_set = [merge(np.array([images[idx] for images in image_set]), [10, 10]) \</span><br><span class="line"> for idx in range(63, -1, -1)] # 63-0</span><br><span class="line"> make_gif(new_image_set, './%s/test_gif_merged.gif' % config.sample_dir, duration=8)</span><br><span class="line"></span><br><span class="line">def save_random_digits(arr,height,width,save_path):</span><br><span class="line"> '''</span><br><span class="line"> å°arr䏿°åä¿åå°æä»¶ï¼æè¡ä¿åï¼å ±æheightè¡,widthå</span><br><span class="line"> :param arr: ndarray</span><br><span class="line"> :param height: è¡æ°</span><br><span class="line"> :param width: åæ°</span><br><span class="line"> :param save_path: ä¿åæä»¶å°å</span><br><span class="line"> :return:</span><br><span class="line"> '''</span><br><span class="line"> with open(save_path,"w") as f:</span><br><span class="line"> for i in range(height):</span><br><span class="line"> for j in range(width):</span><br><span class="line"> if j != width-1:</span><br><span class="line"> f.write("%d," % arr[i*width+j])</span><br><span class="line"> else:</span><br><span class="line"> f.write("%d\n" % arr[i*width+j])</span><br><span class="line"> f.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def image_manifold_size(num_images):</span><br><span class="line"> manifold_h = int(np.floor(np.sqrt(num_images)))</span><br><span class="line"> manifold_w = int(np.ceil(np.sqrt(num_images)))</span><br><span class="line"> assert manifold_h * manifold_w == num_images</span><br><span class="line"> return manifold_h, manifold_w</span><br><span class="line"></span><br><span class="line">def resize_imgs(imgs_path,size,save_dir):</span><br><span class="line"> '''</span><br><span class="line"> å°imgs_pathæä»¶å¤¹çææå¾çé½resizeå°size大å°ï¼å¹¶éæ°ä¿åå°save_dir</span><br><span class="line"> :param imgs_path: åå§å¾åæä»¶å¤¹å°å</span><br><span class="line"> :param size: resizeä¹åçå¾å大å°</span><br><span class="line"> :param save_dir: resizeä¹åçå¾åä¿åå°å</span><br><span class="line"> :return:</span><br><span class="line"> '''</span><br><span class="line"> if not exists(save_dir):</span><br><span class="line"> makedirs(save_dir)</span><br><span class="line"> imgs = glob(imgs_path+"*.jpg")</span><br><span class="line"> for i,img in enumerate(imgs,1):</span><br><span class="line"> try:</span><br><span class="line"> img_arr = scipy.misc.imread(img)</span><br><span class="line"> new_img = scipy.misc.imresize(img_arr,size)</span><br><span class="line"> scipy.misc.imsave(join(save_dir,basename(img)),new_img)</span><br><span class="line"> except Exception as e:</span><br><span class="line"> print(e)</span><br><span class="line"> if i % 100 == 0:</span><br><span class="line"> print("Resize and save %d images!" % i)</span><br><span class="line"> print("Resize and save all %d images!" % len(imgs))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># if __name__ == '__main__':</span><br><span class="line"># imgs_path = "data/images/"</span><br><span class="line"># save_dir = "data/lsun_new/"</span><br><span class="line"># size = (108,108)</span><br><span class="line"># resize_imgs(imgs_path,size,save_dir)</span><br></pre></td></tr></table></figure> 231<p>utils.pyå®ä¹äºå¾å¤æç¨çå ¨å±å·¥å ·å½æ°ï¼å¯ä»¥ç´æ¥è¢«å ¶ä»çèæ¬è°ç¨ã</p> 232<ul> 233<li>globåºç¨æ¥list æä¸ä¸ªæä»¶å¤¹ä¸çfiles;osåºç¨æ¥æä½è·¯å¾åæä»¶å¤¹ç;pprintç¨äºç¾è§æå°;gtimeåstrftimeæç¨æ ¼å¼åæ¥æ;scipy.miscå å«äºå¾å¤åå¾åç¸å ³çæç¨ç彿°ã</li> 234<li>24-27è¡ç<strong>show_all_variables</strong>彿°ï¼è°ç¨äº <span class="lang:default decode:true crayon-inline ">slim.model_analyzer.analyze_vars(vars,print_info)</span> 彿°æ¥æå°modelæævariablesçä¿¡æ¯ã</li> 235<li>39-43è¡ç<strong>imread</strong>彿°å°è£ äº <span class="lang:python decode:true crayon-inline ">scipy.misc.imread</span> 彿°,è¯¥å½æ°åæ° <span class="lang:default decode:true crayon-inline ">flatten = True</span> 表示å°color layer å±å¹³æä¸ä¸ªsingle gray-scale layerã</li> 236<li>48-73è¡ç<strong>merge</strong>彿°ç¨äºä»ä¸ç³»åå°å¾äº§ç大å¾,images[0]表示å°å¾ç个æ°,h=images[1]表示å°å¾çé«,w = images[2]表示å°å¾ç宽ï¼x_h = size[0]表示æç»å¤§å¾heightåºè¯¥æ©å±çåæ°,x_w = size[1]表示æç»å¤§å¾widthåºè¯¥æ©å±çåæ°ãè¯¥å½æ°æç»çæä¸ä¸ªé«ä¸ºh*x_hï¼å®½ä¸ºw*
236x_wç大å¾ã表示大å¾çé«åº¦æ¹åå å«x_h个å°å¾,宽度æ¹åå å«x_w个å°å¾ã</li> 237<li>75-85è¡å®ä¹äºä¿åå¾åç<strong>imsave</strong>彿°ã注æ <span class="lang:default decode:true crayon-inline ">np.squeeze</span> å¯ä»¥å»é¤æ°ç»ä¸ç»´åº¦ä¸º1çé£äºç»´(éç»´),ä¸ä¹ç¸åçæä½æ¯ <span class="lang:default decode:true crayon-inline ">np.expand_dims(arr,axis)</span> 彿°ï¼å¯ä»¥ç»æå®çaxis维度å¢å ä¸ç»´ã</li> 238<li>87-104è¡ç<strong>center_crop</strong>彿°çä½ç¨æ¯ä¸å¿ååªåå¤ç,忶坹å¾åè¿è¡äºresizeæä½ã</li> 239<li>106-126è¡ç<strong>transform</strong>彿°ï¼ä¹æ¯å¯¹å¾åè¿è¡center_crop(å¯é)以åresizeæä½ï¼åªä¸è¿å®æåå°image arrayçæ¯ä¸ªå ç´ çåå¼èå´ä»(0,255)æ å°å°(-1,1),(-1,1)æ¯tanh彿°çåå¼èå´ã</li> 240<li>132-193è¡ç<strong>to_json</strong>彿°å°å个layersç»æä¿åå°jsonæä»¶ï¼æä»¬ä¸ç¨è¿ä¸ªå½æ°ï¼å°±ä¸ç»è¯´äºã</li> 241<li>195-215è¡ç<strong>make_gif</strong>彿°å¯ä»¥å°çæçåºåå¾å转æ¢ä¸ºgifå¾åï¼è¿é使ç¨moviepyåºæ¥å®æè¿ä¸ªå·¥ä½ï¼å ³äºmoviepyçä»ç»å使ç¨ï¼å¯ä»¥åèæä¹åçä¸ç¯<a href="http://www.movieb2b.com/2018/05/24/%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%AApython%E8%A7%86%E9%A2%91%E5%A4%84%E7%90%86%E5%BA%93moviepy/" target="_blank" rel="noopener">æç« </a>ã</li> 242<li>217-298è¡ç<strong>visualize</strong>ç¨äºæµè¯é¶æ®µçæå¾åæ ·æ¬ï¼å¯ä»¥æ¯å个jpgæ ¼å¼çå¾åï¼ä¹å¯ä»¥æ¯gifå¾åï¼è¿å¯ä»¥æ¯å°å¾æ¼æ¥æç大å¾ãvisualize彿°éè¿optionåéçåå¼(å¯ä»¥å0,1,2,3,4äºä¸ªå¼)æ¥æ§å¶ä»¥äºç§ä¸åçæ¹å¼ä¿åç»æã</li> 243</ul> 244<ol> 245<li><em>option=0</em>:è¿ç§æ åµåªéç¨äºdataset ä¸çäºmnistçæ åµï¼ç´æ¥å°samples mergeæä¸ä¸ªå¤§å¾ï¼ç¶åä¿åå³å¯ï¼å ¶ä¸å¤§å¾å ±æbatch_sizeå¼ å°å¾ï¼æ¯è¡åæ¯ååæceil(sqrt(batch_size))个;</li> 246<li><em>option=1</em>:è¿ç§æ åµåoption=0类似ï¼åªæ¯å®èèå°äºdataset为mnistçæ åµï¼å¦ææ¯mnist,åä¼éæºçæbatch_size个digit labels,ç¶åä»generatorçæç¸åºçæ°åï¼æåæ¼æ¥æä¸ä¸ªå¤§å¾,è¿éæèªå·±å®ä¹äºä¸ä¸ª<strong>save_random_digits</strong>彿°ç¨äºå°æ¯æ¬¡éæºçæçæ°åä¿åå°txtæä»¶ä¸å»ï¼è¿æ ·åç»å¯ä»¥éªè¯çæçæ°åå¾åæ¯å¦æ¯æä»¬å¸æçæç;</li> 247<li><em>option=2</em>:è¿ç§æ åµä¸ï¼ä¸ä¼çæä¸å¼ 大å¾ï¼èæ¯çæå«æbatch_size帧çgifå¾ï¼é»è®¤æ¶é´æ¯2s,妿çægif失败ï¼åä¼çæåoption=1䏿 ·ç大å¾;</li> 248<li><em>option=3</em>:ä¸è½æ¯mnistæ°æ®éï¼çæåoption=2䏿 ·çgifã</li> 249<li><em>option=4</em>:åæä¸å¼ 大å¾çgif,ä¸å ±æbatch_size个大å¾,æ¯ä¸ªå¤§å¾ç±<strong>z_dim</strong>ï¼çææ ·æ¬æ°ç®)个å°å¾ç»æã</li> 250</ol> 251<ul> 252<li>300-316è¡ç<strong>save_random_digits</strong>彿°æ¯æèªå®ä¹ç彿°ï¼ç¨äºå°éæºæ°åä¿åå°txtæä»¶;</li> 253<li>æå326-346è¡ç<strong>resize_imgs</strong>彿°æ¯æèªå·±æ·»å çï¼ä½ç¨å°±æ¯å°æå®æä»¶å¤¹ä¸çå¾åresizeææå®ç大å°ï¼è¿æ ·æä»¬å°±å¯ä»¥å©ç¨èªå·±çæ°æ®éè®ç»modeläºã</li> 254</ul> 255<h3 id="3-代ç è¿è¡ç»æ-çæå¾åææéªè¯"><a href="#3-代ç è¿è¡ç»æ-çæå¾åææéªè¯" class="headerlink" title="3. 代ç è¿è¡ç»æ(çæå¾åææéªè¯)"></a>3. 代ç è¿è¡ç»æ(çæå¾åææéªè¯)</h3><h4 id="1-mnist"><a href="#1-mnist" class="headerlink" title="1. mnist"></a>1. <strong>mnist</strong></h4><h4 id="nbsp-nbsp-nbsp-nbsp-æ ¹æ®æä»¬ä¸é¢ç解读ï¼è¿è¡å¦ä¸å½ä»¤å³å¯ä»¥ä½¿ç¨mnistè®ç»DCGAN"><a href="#nbsp-nbsp-nbsp-nbsp-æ ¹æ®æä»¬ä¸é¢ç解读ï¼è¿è¡å¦ä¸å½ä»¤å³å¯ä»¥ä½¿ç¨mnistè®ç»DCGAN" class="headerlink" title=" æ ¹æ®æä»¬ä¸é¢ç解读ï¼è¿è¡å¦ä¸å½ä»¤å³å¯ä»¥ä½¿ç¨mnistè®ç»DCGAN:"></a> æ ¹æ®æä»¬ä¸é¢ç解读ï¼è¿è¡å¦ä¸å½ä»¤å³å¯ä»¥ä½¿ç¨mnistè®ç»DCGAN:</h4><pre class="lang:sh decode:true " title="train_mnist.sh">python3 main.py --dataset=mnist --input_height=28 --output_height=28 --train True 256</pre> 257ä½ éè¦ç¡®ä¿main.pyç®å½ä¸çdata/mnistæä»¶å¤¹ä¸æå·²ç»è§£å缩çmnistæ°æ®æä»¶ãç±äºmnistæ°æ®è§æ¨¡ä¸å¤§ï¼æä»¥ä½¿ç¨gpuè®ç»å¤§æ¦åªéè¦å ååéãè®ç»å®æä¹åï¼è®ç»è¿ç¨ä¸éæ ·å¾å°ççæå¾çä¿åå¨samplesæä»¶å¤¹ä¸ï¼ç¬¬ä¸æ¬¡éæ ·åæå䏿¬¡éæ ·å¾å°å¾çåå«ä¸ºä¸å¾1åå¾2æç¤º: 258<div align="center"> 259<img src="http://t1.aixinxi.net/o_1ced498bonb91jvabu5m82rufa.png-w.jpg"> 260</div> 261<center>å¾1 mnistè®ç»ç¬¬ä¸æ¬¡éæ ·çæå¾ç</center> 262<div align="center"> 263<img src="http://t1.aixinxi.net/o_1ced735uau75sq1i2l1cf11n30a.png-w.jpg"> 264</div> 265<center>å¾2 mnistè®ç»æå䏿¬¡éæ ·çæå¾ç</center> 266å¯ä»¥çåºéçè®ç»çè¿è¡ï¼çæçæåæ°åçè´¨éç¡®å®æ¯æ ¢æ ¢æé«çã好äºï¼æ¥çå©ç¨è®ç»å¾å°çcheckpointæ¥è¿è¡test,è¿évisualizeçoptionåæ°è®¾ç½®ä¸º1,ç¶åè¿è¡å¦ä¸çå½ä»¤å³å¯ä»¥è¿è¡æµè¯: 267 268<pre class="lang:sh decode:true ">python3 main.py --dataset=mnist --input_height=28 --output_height=28 --train False</pre> 269æµè¯é»è®¤ä¼çæ100å¼ åæç大å¾ï¼æä»¬éæºæ½åä¸å¼ ï¼æ¯å¦ç¬¬66å¼ å§ï¼å ¶çå®çéæºæ°åæååçæçæåæ°åå¦ä¸å¾3åå¾4æç¤º: 270<div align="center"> 271<img src="http://t1.aixinxi.net/o_1ced7emnkgmouab1fjk149t1amva.png-w.jpg"> 272</div> 273<center>å¾3 第66å¼ çå®çéæºæ°åæå</center> 274 275<div align="center"> 276<img src="http://t1.aixinxi.net/o_1ced7npdg6s1127g1aau8eg1vr9a.png-w.jpg"> 277</div> 278<center>å¾4 第66å¼ çæçæåæ°å</center> 279å¯ä»¥åç°çæçæåæ°ååçå®çæ°åæ¯å®å ¨ç¬¦åçï¼éè¿éæºæ¥çå ¶ä»ççæå¾çï¼å¯ä»¥åç°åºæ¬å ¨é¨æ¯100%符åçï¼è¿è¯´æconditional DCGANæ¯é常ææçã 280 281#### 2. **celebA** 282#### celebAæ°æ®éæ¯mnistæ°æ®éè§æ¨¡è¦å¤§ï¼æå¤§çº¦20w+ç人è¸å¾çï¼å¾çæ¯å½©è²ç108*108尺寸ãè¿è¡ä¸é¢çå½ä»¤å³å¯ä»¥è¿è¡è®ç»: 283 284<pre class="lang:sh decode:true " title="train_celebA">python3 main.py --dataset celebA --input_height=108 --crop --train True \ 285 --epoch 2 --sample_dir ./celebA_samples --visualize True </pre> 286注æé»è®¤è®ç»éæ ·ä¿åçæä»¶å¤¹æ¯samplesæä»¶å¤¹ï¼ç±äºæä»¬å·²ç»æmnistçç»æä¿åå¨é£éäºï¼å¦æç»§ç»ä½¿ç¨è¿ä¸ªæä»¶å¤¹ï¼celebAçç»æä¼æä¹åçæä»¶è¦çæã为äºé¿å è¿æ ·çæ åµï¼æä»¬éæ°è®¾å®ä¿åsampleçæä»¶å¤¹ä¸ºcelebA_samplesæä»¶å¤¹ï¼è¿ä¸ªæä»¶å¤¹ä¼å¨è¿è¡è¿ç¨ä¸èªå¨å建ï¼ä¸éè¦æå¨å建ãç±äºcelebAçæ°æ®éè§æ¨¡è¾å¤§,æçµèçé ç½®æ¯:ubuntu 16.04,tensorflow1.4.1,cuda8+cudnn6,æ¾å¡æ¯nvidia GTX950M,æ¾å4Gãå¨batch_size = 64çæ åµä¸ï¼å¤§æ¦1.5så¯ä»¥è®ç»ä¸ä¸ªbatch,å æ¤å¦ææç §é»è®¤é ç½®epoch=25,ä¸ä¸ªepochçbatch_num = ceil(202602/64)=3166,å æ¤å ¨é¨è®ç»å®å¤§çº¦éè¦çæ¶é´ä¸º1.5\*3166\*25/3600 â33hãç±äºææ²¡æå°å¼æºï¼èªå·±çç¬è®°æ¬ä¸å¤ªå¯è½ä¸ç´è®ç»è¿ä¹é¿æ¶é´ï¼æºæ¿ççµèé 置太渣,trainä¸å¨ãæä»¥æåªè½é便trainä¸ä¸äºãæçè³ä¸è½®é½æ²¡æè®ç»å®å°±å䏿¥äºã第1个epoch第100个batchçæçå¾åå¦ä¸å¾5æç¤º: 287<div align="center"> 288<img src="http://t1.aixinxi.net/o_1ced8totluqs4nn15oqhuc3a.png-w.jpg"> 289</div> 290<center>å¾5 第1个epoch第100个batchçæçå¾å</center> 291第1个epoch第2500个batchçæçå¾åå¦ä¸å¾6æç¤º: 292<div align="center"> 293<img src="http://t1.aixinxi.net/o_1ced90si8stn1pontvt128u1tp6a.png-w.jpg"> 294</div> 295<center>å¾6 第1个epoch第2500个batchçæçå¾å</center> 296å¯ä»¥åç°ï¼è½ç¶é½æ²¡æå®æ´çè®ç»ä¸ä¸ªepoch,使¯ç¬¬2500个batchçæçå¾åææå·²ç»è½åæ¥çåºäººè¸çè½®å»äºï¼å¦æä½ æè¶³å¤çç®åï¼ä¸å¦¨è¯ç宿´è®ç»ä¸ä¸ï¼æåå¾å°çç»æåºè¯¥ä¼ç¸å½ä¸éã 297 298æ¥çæä»¬å¯ä»¥å©ç¨ä¸é¢é£ä¸ªåªè®ç»äºä¸ç¹ç¹ç模åè¿è¡æµè¯,æµè¯celebAè¿è¡å½ä»¤: 299 300<pre class="lang:sh decode:true ">python3 main.py --dataset celebA --input_height=108 --crop --train False \ 301 --checkpoint_dir ./checkpoint --sample_dir ./celebA_samples</pre> 302å½ç¶ä½ ä»ç¶å¯ä»¥éè¿è®¾å®optionç弿¥æ§å¶testçè¾åºãä¸é¢çå¾7åå¾8æ¯çæçgifå¾(å¾8ç±äºä½ç§¯å¤ªå¤§å·²ç»è½¬ä¸ºjpgæ ¼å¼)ï¼ç±äºè®ç»é常ä¸å åï¼å æ¤ææä¸ä½³ï¼ä½æ¯ä»ç¶æè¸é¨çè½®å»: 303<div align="center"> 304<img src="http://www.movieb2b.com/wp-content/uploads/2018/05/test_gif_66.gif"> 305</div> 306<center>å¾7 celebAè®ç»ä¸å°ä¸è½®çæè¸é¨å¾ågif(å°å¾)</center> 307<div align="center"> 308<img src="http://t1.aixinxi.net/o_1cedacdggvrgdhhdac1atjdaja.jpg-w.jpg"> 309</div> 310<center>å¾8 celebAè®ç»ä¸å°ä¸è½®çæè¸é¨å¾ågif(大å¾)</center> 311 312#### 3. **lsun** 313#### ç±äºæä½¿ç¨download.pyä¸è½½çlsunæä»¶ä½ç§¯é常大(46G),è䏿 ¼å¼æ¯mdbæ ¼å¼çï¼ä¸å¥½ç´æ¥è¯»åãæä»¥æåæ¥ä»lsunçå®ç½åèªå·±éæ°ä¸è½½äºä¸ä¸ª2Gçå¾åå缩æä»¶ï¼è§£å缩ä¹åå¤§æ¦æ9000å¼ å¾åï¼éé¢çå¾åç§ç±»è¾å¤ï¼ä¸»è¦æ¯å ³äºåç§èªç¶æ¯è§çãç±äºå¾åæ°éä¸å¤§ï¼èä¸å个å¾å飿 ¼å·®å¼è¾å¤§ï¼å æ¤ä¸æ¯å¾éåè®ç»DCGAN(å½ç¶ä¹æ¯å¯ä»¥trainç),æä»¥æèªå·±å°±æ²¡æå®éªäºã妿大家æå ´è¶£å¯ä»¥èªå·±å°è¯è®ç»ä¸ä¸ççæææä¹æ ·ã 314 315#### 4. **beauty_girls** 316#### è¿ä¸ªæ¯æèªå·±æéçæ°æ®éï¼çååå°±ç¥éæ¯å ³äºç¾å¥³çåã大约æ2000å¼ ç¾å¥³å¾ï¼åºæ¬ä¸æ¯å ¨èº«å¾ï¼åå¾å°ºå¯¸è¾å¤§ï¼èä¸sizeä¸ç»ä¸ï¼æä»¬éè¦å©ç¨ä¸é¢æå°çutils.pyä¸çresize_imgs彿°é¦å å°ææå¾çresizeå°ç¸åç尺寸(è¿éæresizeå°widthåheight齿¯108)ï¼ç¶åä¿å尿件夹beauty_girls,å°è¯¥æä»¶å¤¹æ¾å ¥dataç®å½ä¸ï¼ç¶åè¿è¡å¦ä¸çå½ä»¤å°±å¯ä»¥è®ç»: 317 318<pre class="lang:sh decode:true ">python3 main.py --dataset beauty_girls --input_height=108 --crop --train True \ 319 --epoch 500 --sample_dir ./beauty_girls_samples --visualize True \ 320 --print_every 10 --checkpoint_every 240 321</pre> 322 323<p>è¿ä¸æ¬¡å 为å¾çæ°éåªæ2000ï¼æä»¥æè®¾å®è¦è®ç»500è½®ï¼æå¨æä¸ç¡è§çæ¶åç¨ç¬è®°æ¬è·äºä¸ä¸ï¼è¿ä¸å´ç¿»è½¦äºï¼è®ç»éæ ·å¾å°çå¾çæ¯è¿æ ·ç:</p> 324<p><div align="center"><br><img src="http://t1.aixinxi.net/o_1cedbrmoblmmjm0kfe1hagfp3a.jpg-w.jpg"><br></div></p> 325<center>å¾9 beauty_girls ä»ä¸å°ä¸ä¾æ¬¡è®ç»1è½®,66è½®,200è½®,300è½®,500è½®çæçå¾å</center><br>å¯ä»¥åç°ä»ç¬¬1è½®å°ç¬¬300è½®çæå¾ççè´¨éæ¯æé«çï¼ä½æ¯åå¾åè®ç»ï¼ç¹å«æ¯å°äºæå500è½®çæ¶åï¼å¾åææ
325¾è±äºï¼å¾å¤å°å¾é½æ¯ç¸ä¼¼ççä¸æçæ¨¡å¼(ä¹å°±æ¯è®ºæé说çmode collapseï¼ï¼è¿è¯´ææå¤è®ç»å°300è½®å·¦å³æ¨¡å就已ç»å·®ä¸å¤æ¶æäºï¼åå¾åææå¯è½ä¼æ´å·®ï¼ä¹è®¸ä¼åçmode collapseè¿ç§ç°è±¡ãè¿ä¸ç¹å论ææåæå°çæ¯ä¸è´çãèä¸å¯ä»¥åç°å³ä½¿æ¯æå¥½ççæå¾çï¼è´¨éä¹ä¸æ¯ç¹å«å¥½ï¼è¿å¯è½ä¸»è¦æ¯ä¸è®ç»æ ·æ¬æ°å¤ªå°ï¼åªæ2000ï¼èä¸å¾å飿 ¼å·®å¼å¤ªå¤§å¼èµ·çãæåï¼ä¸è¦é®æè¦åå§è®ç»å¾çï¼æ¯æ¿ä»ä¹å¾çè®ç»çï¼ä½ ççæå¾çé¾éçä¸å°ä¹?åååã<br><br>#### 5. <strong>girl_face</strong><br>#### è¿ä¸ªæ°æ®éæ¥èªç¥ä¹ç½åBest Julyçæç« :<a href="https://zhuanlan.zhihu.com/p/26639135" target="_blank" rel="noopener">ç¨DCGANçæå¥³æå</a>,æå ´è¶£å¤§å®¶å¯ä»¥ççè¿ç¯æç« ãè¯¥æ°æ®éå å«äºåªå好ç8000å¤å¼ 妹åç头åï¼å¤§å°é½æ¯96x96çãå·®ä¸å¤æ¯ä¸é¢è¿ç§:<br><div align="center"><br><img src="http://t1.aixinxi.net/o_1ceddckoak751cticps71vu4ca.jpg-w.jpg"><br></div><br><center>å¾10 girl_face è®ç»ç¤ºä¾å¾ç</center><br>æ°æ®é大家å¯ä»¥å»<a href="https://pan.baidu.com/s/1dERYUmH" target="_blank" rel="noopener">faces</a>ä¸è½½ï¼å¯ç :09h9ãè¿è¡ä¸é¢çå½ä»¤å³å¯ä»¥å¼å§è®ç»:<br><br><pre class="lang:sh decode:true ">python3 main.py âdataset girl_face âinput_height=96 âcrop âtrain True \<br> âepoch 200 âsample_dir ./girl_face âvisualize True \<br> âprint_every 30 âcheckpoint_every 300</pre><br>ä½ éè¦ç¡®ä¿å°å å«å¾çæ°æ®çgirl_faceæä»¶å¤¹æ¾å¨dataç®å½ä¸ï¼æä»¬è®¾å®è®ç»200è½®ï¼å ¨é¨è®ç»å®æä¼°è®¡è¦5,6ä¸ªå°æ¶ãä¸å¾11(ä»ä¸è³ä¸)æ¯åå«è®ç»1è½®,30è½®,70è½®ï¼100è½®ï¼130轮以å170è½®æ¶å产ççå¾åï¼å¯ä»¥åç°éçè®ç»è½®æ°çå¢å ï¼çæå¾åçè´¨éæ¯éæ¸å¢å çï¼å¤§æ¦å°100轮左å³çæ¶åï¼å ¶å®çæç头åè´¨éå·²ç»å¾ä¸éäº(å¯ä»¥åç°æ¯ç¾å¥³äº),åç»ä¸ªå«ä½ç½®çå°å¾è´¨éææå¢å ï¼ä½æ¯å§ç»æä¸äºå°å¾æä¸äºç¸åï¼ä¸æ¯ç¹å«èªç¶ã使¯æ»ä½ä¸æ¥è¯´ï¼çæçå¾çè´¨éå¾ä¸éäºã<br><div align="center"><br><img src="http://t1.aixinxi.net/o_1cedk932717201vnr5rn1jjovrca.jpg-w.jpg"><br></div><br><center>å¾11 girl_face è®ç»1è½®,30è½®,70è½®ï¼100è½®ï¼130轮以å170è½®æ¶å产ççå¾å(ä»ä¸è³ä¸)</center> 326 327<p>è®ç»å®æä¹åï¼æä»¬ä½¿ç¨è®ç»å¾å°çmodelè¿è¡test,使¯å ¶å®æä¸ä¸ªé®é¢æä»¬ä¹å没ææå°ï¼é£å°±æ¯å¦æè®ç»è½®æ°è®¾å®çè¿å¤ï¼é£ä¹ææ°çä¸ä¸ªcheckpointå è½½å¾å°çmodelæªå¿ æ¯æä¼çï¼æä¼çå¯è½å¨ä¸é´çæä¸ä¸ªepochã使¯å代ç åªè½å è½½ææ°çä¸ä¸ªcheckpoint,æä»¥æä»¬å°model.pyä¸ç <strong>load</strong> 彿°ä¿®æ¹å¦ä¸:</p> 328<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># load checkpoints file</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">load</span><span class="params">(self, checkpoint_dir,checkpoint_name = None)</span>:</span></span><br><span class="line"> <span class="keyword">
328import</span> re</span><br><span class="line"> print(<span class="string">" [*] Reading checkpoints..."</span>)</span><br><span class="line"> checkpoint_dir = os.path.join(checkpoint_dir, self.model_dir)</span><br><span class="line"> <span class="comment">#A CheckpointState if the state was available, None</span></span><br><span class="line"> <span class="comment"># otherwise</span></span><br><span class="line"> ckpt = tf.train.get_checkpoint_state(checkpoint_dir)</span><br><span class="line"> <span class="keyword">if</span> ckpt <span class="keyword">and</span> ckpt.model_checkpoint_path:</span><br><span class="line"> <span class="comment"># basename:Returns the final component of a pathname</span></span><br><span class="line"> ckpt_name = os.path.basename(ckpt.model_checkpoint_path)</span><br><span class="line"> <span class="keyword">if</span> checkpoint_name <span class="keyword">is</span> <span class="keyword">None</span>:</span><br><span class="line"> <span class="comment"># å è½½ææ°çcheckpoint</span></span><br><span class="line"> self.saver.restore(self.sess, os.path.join(checkpoint_dir, ckpt_name))</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="comment"># å è½½æå®çè䏿¯ææ°çcheckpoint</span></span><br><span class="line"> self.saver.restore(self.sess, os.path.join(checkpoint_dir, checkpoint_name))</span><br><span class="line"> counter = int(next(re.finditer(<span class="string">"(\d+)(?!.*\d)"</span>,ckpt_name)).group(<span class="number">0</span>))</span><br><span class="line"> <span class="keyword">if</span> checkpoint_name <span class="keyword">is</span> <span class="keyword">None</span>:</span><br><span class="line"> print(<span class="string">" [*] Success to read {}"</span>.format(ckpt_name))</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">" [*] Success to read {}"</span>.format(checkpoint_name))</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">True</span>, counter</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">" [*] Failed to find a checkpoint"</span>)</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">False</span>, <span class="number">0</span></span><br></pre></td></tr></table></figure> 329<p>主è¦çä¿®æ¹å°±æ¯å¢å äºä¸ä¸ª<strong>checkpoint_name</strong>åæ°ï¼ç¨äºæå®ç¹å®çè䏿¯ææ°çcheckpoint fileãåæ¶æä»¬å¢å äºä¸ä¸ªcheckpoint_nameå½ä»¤è¡åæ°: <span class="lang:default decode:true crayon-inline ">flags.DEFINE_string(âcheckpoint_nameâ,None,âthe name of the loaded checkpoint file,default is the lastest checkpointâ)</span> ç¨æ¥æå®checkpoint_nameåæ°ï¼é»è®¤å¼æ¯Noneã</p> 330<p>å¦å¤è¿æä¸ä¸ªé®é¢å°±æ¯ï¼å¨trainçæ¶åsampleçæ ·æ¬ï¼è¾å ¥åªå£°zæ¯æä»(-1,1)çåååå¸ï¼èå代ç çvisualize彿°å¨option=1,2,3,4çæ¶åï¼sample䏿¯éè¿(-1,1)çåååå¸éæ ·å¾å°çï¼ç»è¿æçå®éªï¼å¦æå¨option=1,2,3,4çæ¶åç´æ¥ç¨å代ç è¿è¡test,å¾å°ççæå¾çå ä¹é½æ¯æ¨¡ç³çãæçæ³è¿æ¯å 为teståtrainçæ¶åçè¾å ¥éæ ·åå¸ä¸ä¸è´å¯¼è´çç»æãå æ¤æä¹å¯¹utils.pyçvisualize彿°è¿è¡äºä¿®æ¹å¦ä¸:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">
33053</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">visualize</span><span class="params">(sess, dcgan, config, option)</span>:</span></span><br><span class="line"> <span class="comment"># ç¨äºå¯è§å</span></span><br><span class="line"> image_frame_dim = int(math.ceil(config.batch_size**<span class="number">.5</span>)) <span class="comment"># å¾ç尺寸</span></span><br><span class="line"> <span class="keyword">if</span> option == <span class="number">-1</span>:</span><br><span class="line"> <span class="comment"># noise</span></span><br><span class="line"> z_sample = np.random.uniform(<span class="number">-1</span>, <span class="number">1</span>, size=(config.batch_size, dcgan.z_dim))</span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample})</span><br><span class="line"> save_images(samples, [image_frame_dim, image_frame_dim],</span><br><span class="line"> <span class="string">'./%s/test_%s.png'</span> % (config.sample_dir, strftime(<span class="string">"%Y-%m-%d-%H-%M-%S"</span>, gmtime())))</span><br><span class="line"> <span class="keyword">elif</span> option == <span class="number">0</span>:</span><br><span class="line"> <span class="comment"># noise</span></span><br><span class="line"> z_sample = np.random.uniform(<span class="number">-0.5</span>, <span class="number">0.5</span>, size=(config.batch_size, dcgan.z_dim))</span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample})</span><br><span class="line"> save_images(samples, [image_frame_dim, image_frame_dim], <span class="string">'./%s/test_%s.png'</span> % (config.sample_dir,strftime(<span class="string">"%Y-%m-%d-%H-%M-%S"</span>, gmtime())))</span><br><span class="line"> <span class="keyword">elif</span> option == <span class="number">1</span>: <span class="comment"># å°samplesçæå¤§å¾</span></span><br><span class="line"> <span class="comment">#values = np.arange(0, 1, 1./config.batch_size)</span></span><br><span class="line"> <span class="keyword">for</span> idx <span class="keyword">in</span> xrange(dcgan.z_dim):</span><br><span class="line"> print(<span class="string">" [*] %d"</span> % idx)</span><br><span class="line"> z_sample = np.random.uniform(<span class="number">-1</span>, <span class="number">1</span>, size=(config.batch_size , dcgan.z_dim))</span><br><span class="line"> <span class="comment"># for kdx, z in enumerate(z_sample):</span></span><br><span class="line"> <span class="comment"># z[idx] = values[kdx]</span></span><br><span class="line"></span><br><span class="line">
330 <span class="keyword">if</span> config.dataset == <span class="string">"mnist"</span>:</span><br><span class="line"> <span class="comment"># yæ¯batch_size个0-9ä¹é´çéæºæ°</span></span><br><span class="line"> y = np.random.choice(<span class="number">10</span>, config.batch_size)</span><br><span class="line"> save_random_digits(y,image_frame_dim,image_frame_dim,<span class="string">'./%s/test_arange_%s.txt'</span> % (config.sample_dir,idx))</span><br><span class="line"> y_one_hot = np.zeros((config.batch_size, <span class="number">10</span>))</span><br><span class="line"> y_one_hot[np.arange(config.batch_size), y] = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample, dcgan.y: y_one_hot})</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample})</span><br><span class="line"></span><br><span class="line"> save_images(samples, [image_frame_dim, image_frame_dim], <span class="string">'./%s/test_arange_%s.png'</span> % (config.sample_dir,idx))</span><br><span class="line"> <span class="keyword">elif</span> option == <span class="number">2</span>:</span><br><span class="line"> <span class="comment"># values = np.arange(0, 1, 1./config.batch_size)</span></span><br><span class="line"> <span class="comment"># idxæ¯éæºç</span></span><br><span class="line"> <span class="comment"># for idx in [random.randint(0, dcgan.z_dim - 1) for _ in xrange(dcgan.z_dim)]:</span></span><br><span class="line"> <span class="keyword">for</span> idx <span class="keyword">in</span> xrange(dcgan.z_dim):</span><br><span class="line"> print(<span class="string">" [*] %d"</span> % idx)</span><br><span class="line"> <span class="comment"># z_dim:test_images_num</span></span><br><span class="line"> <span class="comment">#z = np.random.uniform(-0.2, 0.2, size=(dcgan.z_dim))</span></span><br><span class="line"> <span class="comment"># np.tile:æç
§æå®ç维度å°arrayéå¤</span></span><br><span class="line"> <span class="comment"># z_sample shape:(batch_size,z_dim)</span></span><br><span class="line"> <span class="comment">#z_sample = np.tile(z, (config.batch_size, 1))</span></span><br><span class="line"> <span class="comment">#z_sample = np.zeros([config.batch_size, dcgan.z_dim])</span></span><br><span class="line"> <span class="comment"># for kdx, z in enumerate(z_sample):</span></span><br><span class="line"> <span class="comment"># z[idx] = values[kdx]</span></span><br><span class="line"> z_sample = np.random.uniform(<span class="number">-1</span>, <span class="number">1</span>, size=(config.batch_size, dcgan.z_dim))</span><br><span class="line"> <span class="keyword">if</span> config.dataset == <span class="string">"mnist"</span>:</span><br><span class="line"> y = np.random.choice(<span class="number">10</span>, config.batch_size)</span><br><span class="line"> <span class="comment">#save_random_digits(y, image_frame_dim, image_frame_dim, './%s/test_%s.txt' % % (config.sample_dir,strftime("%Y-%m-%d-%H-%M-%S", gmtime())))</span></span><br><span class="line"> y_one_hot = np.zeros((config.batch_size, <span class="number">10</span>))</span><br><span class="line"> y_one_hot[np.arange(config.batch_size), y] = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample, dcgan.y: y_one_hot})</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample})</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> make_gif(samples, <span class="string">'./%s/test_gif_%s.gif'</span> % (config.sample_dir,idx),<span class="number">4</span>)</span><br><span class="line">
330 <span class="keyword">except</span>:</span><br><span class="line"> save_images(samples, [image_frame_dim, image_frame_dim], <span class="string">'./%s/test_%s.png'</span> % (config.sample_dir,strftime(<span class="string">"%Y-%m-%d-%H-%M-%S"</span>, gmtime())))</span><br><span class="line"> <span class="keyword">elif</span> option == <span class="number">3</span>: <span class="comment"># ä¸è½æ¯mnist,ç´æ¥çægif</span></span><br><span class="line"> <span class="comment"># values = np.arange(0, 1, 1./config.batch_size)</span></span><br><span class="line"> <span class="keyword">for</span> idx <span class="keyword">in</span> xrange(dcgan.z_dim):</span><br><span class="line"> print(<span class="string">" [*] %d"</span> % idx)</span><br><span class="line"> <span class="comment"># z_sample = np.zeros([config.batch_size, dcgan.z_dim])</span></span><br><span class="line"> <span class="comment"># for kdx, z in enumerate(z_sample):</span></span><br><span class="line"> <span class="comment"># z[idx] = values[kdx]</span></span><br><span class="line"> z_sample = np.random.uniform(<span class="number">-1</span>, <span class="number">1</span>, size=(config.batch_size, dcgan.z_dim))</span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample})</span><br><span class="line"> make_gif(samples, <span class="string">'./%s/test_gif_%s.gif'</span> % (config.sample_dir,idx),<span class="number">4</span>)</span><br><span class="line"> <span class="keyword">elif</span> option == <span class="number">4</span>:</span><br><span class="line"> image_set = []</span><br><span class="line"> <span class="comment"># values = np.arange(0, 1, 1./config.batch_size)</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> idx <span class="keyword">in</span> xrange(dcgan.z_dim):</span><br><span class="line"> print(<span class="string">" [*] %d"</span> % idx)</span><br><span class="line"> <span class="comment"># z_sample = np.zeros([config.batch_size, dcgan.z_dim])</span></span><br><span class="line"> <span class="comment"># for kdx, z in enumerate(z_sample): z[idx] = values[kdx]</span></span><br><span class="line"> z_sample = np.random.uniform(<span class="number">-1</span>, <span class="number">1</span>, size=(config.batch_size, dcgan.z_dim))</span><br><span class="line"> image_set.append(sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample}))</span><br><span class="line"> make_gif(image_set[<span class="number">-1</span>], <span class="string">'./%s/test_gif_%s.gif'</span> % (config.sample_dir,idx),<span class="number">12</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># åæä¸å¼ 大å¾gif(64å¼ å¤§å¾)</span></span><br><span class="line"> new_image_set = [merge(np.array([images[idx] <span class="keyword">for</span> images <span class="keyword">in</span> image_set]), [<span class="number">10</span>, <span class="number">10</span>]) \</span><br><span class="line"> <span class="keyword">for</span> idx <span class="keyword">in</span> range(<span class="number">63</span>, <span class="number">-1</span>, <span class="number">-1</span>)] <span class="comment"># 63-0</span></span><br><span class="line"> make_gif(new_image_set, <span class="string">'./%s/test_gif_merged.gif'</span> % config.sample_dir, duration=<span class="number">8</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">elif</span> option == <span class="number">5</span>:</span><br><span class="line"> <span class="comment">#ä¿åå个çå°å¾</span></span><br><span class="line"> z_sample = np.random.uniform(<span class="number">-1</span>, <span class="number">1</span>, size=(config.batch_size, dcgan.z_dim))</span><br><span class="line"> samples = sess.run(dcgan.sampler, feed_dict={dcgan.z: z_sample})</span><br><span class="line"> <span class="keyword">for</span> i,sample <span class="keyword">in</span> enumerate(samples):</span><br><span class="line"> scipy.misc.imsave(<span class="string">"./%s/single_test_%s.png"</span> %(config.sample_dir,i),sample)</span><br></pre></td></tr></table></figure></p> 331<p>主è¦çä¿®æ¹æ¯å°ææçéæ ·æ¹å¼é½æ¹ä¸º(-1,1)çåååå¸: <span class="lang:default decode:true crayon-inline ">z_sample = np.random.uniform(-1, 1, size=(config.batch_size, dcgan.z_dim))</span> ãå®éªåç°ï¼è¿ç§æ¹å¼å¨testçæ¶åæ¯é常ææçãå¦å¤ï¼æä¿çäºoption=0çæ åµä¸åï¼å¢å äºoption=-1çæ åµä»¥åoption=5çæ åµãoption=5表示å°çæçå¾çæå°å¾ä¿åãä¸é¢çå å¼ å¾å±ç¤ºäºtestçç»æ:</p> 332<p><div align="center"><br><img src="http://t1.aixinxi.net/o_1cedlm2ev1f516e11gb81vn5lgba.png-w.jpg"><br></div></p> 333<center>å¾12 girl_face éæºéåçä¸ä¸ªtest çæå¾å大å¾</center> 334 335<p><div align="center"><br><img src="http://t1.aixinxi.net/o_1cedlt5tf12321k5k1rhnodqfroa.jpg-w.jpg"><br></div></p> 336<center>å¾13 girl_face éæºéåçå å¼ test çæå¾åå°å¾åé</center> 337 338<p><div align="center"><br><img src="http://www.movieb2b.com/wp-content/uploads/2018/05/test_gif_66-1.gif" alt="" width="64" height="64" class="alignnone size-full wp-image-226"><br></div></p> 339<center>å¾14 girl_face éæºéåççægifå¾å</center> 340 341<p><div align="center"><br><img src="http://t1.aixinxi.net/o_1cedo45nicb8v9j1nsi10j6ttc.gif-j.jpg"><br></div></p> 342<center>å¾15 girl_face çæç大å¾gifå¾å</center> 343 344<h3 id="4-æ»ç»"><a href="#4-æ»ç»" class="headerlink" title="4. æ»ç»"></a>4. æ»ç»</h3><h4 id="nbsp-nbsp-nbsp-nbsp-æ¬æè¯¦ç»è§£è¯»äºDCGAN代ç çtensorflowå®ç°ï¼å¹¶å¨mnist-celebA-以åèªå®ä¹çæ°æ®ébeauty-girsågirl-faceæ°æ®éä¸è¿è¡äºè®ç»ï¼æµè¯ãæä»¬åç°DCGANç¡®å®å¨ä¸å®ç¨åº¦ä¸æé«äºGANè®ç»çç¨³å®æ§-ä¸å¤ªå®¹æåçmode-collapseçæ åµ-èä¸çæçå¾çè´¨éå¦ææ°æ®éæ°éè¾é«ãè®ç»å åï¼è¿æ¯å¾ä¸éçã使¯å¦æè®ç»æ¶é´è¿é¿ï¼è¿æ¯å¯è½ä¼åçmode-collapseçæ åµï¼èä¸è®ç»ç»æçè´¨éä¹å¾åå³äºæ°æ®éçè´¨éï¼æ°æ®éæå¥½è¶³å¤å¤§-è³å°1w-å§-èä¸å¾çç飿 ¼æå¥½æ¯ä¸è´çï¼å¦åå¯è½æ æ³å¾å°è®©äººæ»¡æçç»æ-å°±åbeauty-girls飿 ·-ã"><a href="#nbsp-nbsp-nbsp-nbsp-æ¬æè¯¦ç»è§£è¯»äºDCGAN代ç çtensorflowå®ç°ï¼å¹¶å¨mnist-celebA-以åèªå®ä¹çæ°æ®ébeauty-girsågirl-faceæ°æ®éä¸è¿è¡äºè®ç»ï¼æµè¯ãæä»¬åç°DCGANç¡®å®å¨ä¸å®ç¨åº¦ä¸æé«äºGANè®ç»çç¨³å®æ§-ä¸å¤ªå®¹æåçmode-collapseçæ åµ-èä¸çæçå¾çè´¨éå¦ææ°æ®éæ°éè¾é«ãè®ç»å åï¼è¿æ¯å¾ä¸éçã使¯å¦æè®ç»æ¶é´è¿é¿ï¼è¿æ¯å¯è½ä¼åçmode-collapseçæ åµï¼èä¸è®ç»ç»æçè´¨éä¹å¾åå³äºæ°æ®éçè´¨éï¼æ°æ®éæå¥½è¶³å¤å¤§-è³å°1w-å§-èä¸å¾çç飿 ¼æå¥½æ¯ä¸è´çï¼å¦åå¯è½æ æ³å¾å°è®©äººæ»¡æçç»æ-å°±åbeauty-girls飿 ·-ã" class="headerlink" title=" æ¬æè¯¦ç»è§£è¯»äºDCGAN代ç çtensorflowå®ç°ï¼å¹¶å¨mnist,celebA,以åèªå®ä¹çæ°æ®ébeauty_girsågirl_faceæ°æ®éä¸è¿è¡äºè®ç»ï¼æµè¯ãæä»¬åç°DCGANç¡®å®å¨ä¸å®ç¨åº¦ä¸æé«äºGANè®ç»çç¨³å®æ§(ä¸å¤ªå®¹æåçmode collapseçæ åµ),èä¸çæçå¾çè´¨éå¦ææ°æ®éæ°éè¾é«ãè®ç»å åï¼è¿æ¯å¾ä¸éçã使¯å¦æè®ç»æ¶é´è¿é¿ï¼è¿æ¯å¯è½ä¼åçmode collapseçæ åµï¼èä¸è®ç»ç»æçè´¨éä¹å¾åå³äºæ°æ®éçè´¨éï¼æ°æ®éæå¥½è¶³å¤å¤§(è³å°1w+å§),èä¸å¾çç飿 ¼æå¥½æ¯ä¸è´çï¼å¦åå¯è½æ æ³å¾å°è®©äººæ»¡æçç»æ(å°±åbeauty_girls飿 ·)ã"></a> æ¬æè¯¦ç»è§£è¯»äºDCGAN代ç çtensorflowå®ç°ï¼å¹¶å¨mnist,celebA,以åèªå®ä¹çæ°æ®ébeauty_girsågirl_faceæ°æ®éä¸è¿è¡äºè®ç»ï¼æµè¯ãæä»¬åç°DCGANç¡®å®å¨ä¸å®ç¨åº¦ä¸æé«äºGANè®ç»çç¨³å®æ§(ä¸å¤ªå®¹æåçmode collapseçæ åµ),èä¸çæçå¾çè´¨éå¦ææ°æ®éæ°éè¾é«ãè®ç»å åï¼è¿æ¯å¾ä¸éçã使¯å¦æè®ç»æ¶é´è¿é¿ï¼è¿æ¯å¯è½ä¼åçmode collapseçæ åµï¼èä¸è®ç»ç»æçè´¨éä¹å¾åå³äºæ°æ®éçè´¨éï¼æ°æ®éæå¥½è¶³å¤å¤§(è³å°1w+å§),èä¸å¾çç飿 ¼æå¥½æ¯ä¸è´çï¼å¦åå¯è½æ æ³å¾å°è®©äººæ»¡æçç»æ(å°±åbeauty_girls飿 ·)ã</h4><h2><center>æ¬æå®ï¼æè°¢é 读!</center></h2> 345 346 347 348 349 </div> 350 <div class="article-info article-info-index"> 351 352 353 <div class="article-tag tagcloud"> 354 <i class="icon-price-tags icon"></i> 355 <ul class="article-tag-list"> 356 357 <li class="article-tag-list-item"> 358 <a href="javascript:void(0)" class="js-tag article-tag-list-link color4">GAN</a> 359 </li> 360 361 <li class="article-tag-list-item"> 362 <a href="javascript:void(0)" class="js-tag article-tag-list-link color2">çæå¯¹æç½ç»</a> 363 </li> 364 365 <li class="article-tag-list-item"> 366 <a href="javascript:void(0)" class="js-tag article-tag-list-link color1">DCGAN</a> 367 </li> 368 369 <li class="article-tag-list-item"> 370 <a href="javascript:void(0)" class="js-tag article-tag-list-link color5">代ç 解读</a> 371 </li> 372 373 </ul> 374 </div> 375 376 377 378 379 <p class="article-more-link"> 380 <a class="article-more-a" href="/2018/05/27/DCGAN代ç ç®å解读/">å±å¼å ¨æ >></a> 381 </p> 382 383 384 385 <div class="clearfix"></div> 386 </div> 387 </div> 388</article> 389 390<aside class="wrap-side-operation"> 391 <div class="mod-side-operation"> 392 393 <div class="jump-container" id="js-jump-container" style="display:none;"> 394 <a href="javascript:void(0)" class="mod-side-operation__jump-to-top"> 395 <i class="icon-font icon-back"></i> 396 </a> 397 <div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;"> 398 <i class="icon-font icon-plane jump-plane"></i> 399 </div> 400 </div> 401 402 403 </div> 404</aside> 405 406 407 408 409 410 <article id="post-haskellç®æå ¥é¨-ä¸" class="article article-type-post article-index" itemscope itemprop="blogPost"> 411 <div class="article-inner"> 412 413 <header class="article-header"> 414 415 416 <h1 itemprop="name"> 417 <a class="article-title" href="/2018/05/27/haskellç®æå ¥é¨-ä¸/">haskellç®æå ¥é¨(ä¸)</a> 418 </h1> 419 420 421 422 <a href="/2018/05/27/haskellç®æå ¥é¨-ä¸/" class="archive-article-date"> 423 <time datetime="2018-05-27T09:08:37.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-05-27</time> 424</a> 425 426 </header> 427 428 <div class="article-entry" itemprop="articleBody"> 429 430 <h3 id="æ¬æç主è¦å 容åèèªãHaskellè¶£å¦æåã"><a href="#æ¬æç主è¦å 容åèèªãHaskellè¶£å¦æåã" class="headerlink" title="æ¬æç主è¦å 容åèèªãHaskellè¶£å¦æåã"></a>æ¬æç主è¦å 容åèèªãHaskellè¶£å¦æåã</h3><p></p><h2>1. What is Haskell?</h2><br> 以ä¸å 容å¼ç¨èª<a href="https://www.haskell.org/" target="_blank" rel="noopener">Haskell</a>å®ç½:<p></p> 431<blockquote> 432<p>Haskellæ¯ä¸ä¸ªå è¿çï¼çº¯ç²¹ç彿°å¼ç¼ç¨è¯è¨ãä¸ä¸ªå ¸åç声æå¼å°ï¼éæç±»åç代ç å¦ä¸:<br><figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="title">primes</span> = filterPrime [<span class="number">2.</span>.] </span><br><span class="line"> <span class="keyword">where</span> filterPrime (p:xs) = </span><br><span class="line"> p : filterPrime [x | x <- xs, x `mod` p /= <span class="number">0</span>]</span><br></pre></td></tr></table></figure></p> 433</blockquote> 434<p>Haskell æå¦ä¸çç¹æ§:</p> 435<blockquote> 436<ul> 437<li><strong>éæç±»å</strong>(Statically Typed)ãHaskellçæ¯ä¸ä¸ªè¡¨è¾¾å¼é½æä¸ä¸ªå¨ç¼è¯æ¶å³å®çç±»åãææçç±å½æ°å¼ç¨ç»åèµ·æ¥çç±»åå¿ é¡»ç¸å¹é (match up),å¦åæ æ³æ£å¸¸ç¼è¯ãç±»åä¸ä» ä» æ¯å½¢å¼ä¸çä¿è¯ï¼æ´æ¯ç¨äºè¡¨è¾¾ç¨åºç»æçè¯è¨ã</li> 438<li><strong>çº¯ç²¹å½æ°å¼</strong>(Purely functional)ãHaskellçæ¯ä¸ä¸ªå½æ°é½æ¯æ°å¦æä¹ä¸ç(pure)ãå³ä½¿æ¯æå¯ä½ç¨çIOæä½ä¹ä¸è¿æ¯å¨æè¿°å¨åä»ä¹ï¼åæ ·ç±çº¯ç²¹ç代ç 产çãæ²¡æå£°ææè æä»¤ï¼ä» ä» åªæè¡¨è¾¾å¼ï¼è¯¥è¡¨è¾¾å¼ä¸è½å¯¹åéè¿è¡ä¿®æ¹(å±é¨åéæè å ¨å±åé),æè æ¯è·ååæ¶é´ãéæºæ°è¿æ ·çç¶æã</li> 439<li><strong>ç±»åæ¨æ</strong>(Type Inference)ãä½ å¹¶ä¸éè¦å¨Haskell䏿¾å¼å°ååºæ¯ä¸ç§ç±»åï¼ç±»åå°ä¼è¿è¡å忍æãå½ç¶ï¼ä½ ä¹å¯ä»¥éæ©èªå·±ååºç±»åï¼æè 让ç¼è¯ä¸ºä½ è¿è¡æ¨æã</li> 440<li><strong>å¹¶å</strong>(Concurrent)ãHaskellå¯ä»¥å¾å®¹æè¿è¡å¹¶åç¼ç¨ï¼è¿å¾åäºå®å¯ä»¥æ¾å¼å°å¤çeffectsãå®çççç¼è¯å¨GHC带æä¸ä¸ªé«æ§è½çå¹¶è¡çåå¾åæ¶å¨ï¼è¿æä¸ä¸ªè½»é级çå¹¶ååºï¼å ¶ä¸å å«äºå¾å¤çæç¨çå¹¶å彿°ååä»¥åæ½è±¡æ¥å£ã</li> 441<li><strong>æ°æ§è®¡ç®</strong>(Lazy)ã彿°å¹¶ä¸ä¼ç´æ¥è®¡ç®å®ä»¬çå¼ãè¿æå³çç¨åºå¯ä»¥å¨ä¸èµ·ç»åå°é常好ï¼å¯ä»¥éè¿åªåé常ç彿°å°±è¡¨è¾¾æ§å¶ç»æ(if/else)ãHaskell代ç ç纯粹æ§ä½¿å¾å®å¯ä»¥è½»æ¾å°å½æ°é¾å¼ç
441»åï¼æä½èµ·æ¥é常æ¹ä¾¿ã</li> 442<li><strong>å </strong>(Packages)ãä½ å¯ä»¥å¨public packages server 䏿¾å°é常å¤çæ´»è·ç弿ºHaskell packagesã</li> 443</ul> 444</blockquote> 445<p></p><h2>2. How to use Haskell?</h2><br> ä½ å¯ä»¥ä¸è½½HaskellçGHCç¼è¯å¨,该ç¼è¯å¨å¯ä»¥è§£éä¹å¯ä»¥ç¼è¯Haskellç¨åºãGHCè¿æä¸ä¸ªå¾æç¨çäº¤äºæ¨¡å¼ï¼å¨ç»ç«¯è¾å ¥ghciå³å¯è¿å ¥äº¤äºæ¨¡å¼ãç¶åè¿è¡å½ä»¤<code>:l demo.hs</code>å°±å¯ä»¥å è½½demo.hsä¸ç彿°(Haskellç¨åºæä»¶ä»¥hsç»å°¾)ãå¦æä½ å¯¹demo.hsåäºä¿®æ¹ï¼å¯ä»¥éæ°è¿è¡å½ä»¤<code>:l demo.hs</code>以鿰å è½½å ¶ä¸ç彿°ãè¿æ¯æä»¬ä»¥åå®éªå¦ä¹ Haskellçåºæ¬æµç¨ã<p></p> 446<p></p><h2> 3. Basic Operations</h2><p></p> 447<p></p><h3> 3.1 åºæ¬ç±»å</h3><br> å¨ç»ç«¯è¾å ¥ghciè¿è¡å ¥äº¤äºæ¨¡å¼ãå¦ä¸æ¯ä¸äºåºæ¬çè¿ç®ï¼å ä¹ä¸ç¨è§£éå°±å¯ä»¥çæã<br><figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> <span class="number">2</span>+<span class="number">15</span></span><br><span class="line"><span class="number">17</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="number">45</span>*<span class="number">90</span></span><br><span class="line"><span class="number">4050</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="number">568</span><span class="number">-23</span></span><br><span class="line"><span class="number">545</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="number">3</span>/<span class="number">2</span></span><br><span class="line"><span class="number">1.5</span></span><br><span class="line"><span class="type">Prelude</span>> (<span class="number">90</span><span class="number">-23</span>)*<span class="number">8</span></span><br><span class="line"><span class="number">536</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="number">50</span>*(<span class="number">100</span><span class="number">-9028</span>)</span><br><span class="line"><span class="number">-446400</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="type">True</span> && <span class="type">False</span></span><br><span class="line"><span class="type">False</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="type">True</span> && <span class="type">True</span></span><br><span class="line"><span class="type">True</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="type">False</span> || <span class="type">True</span></span><br><span class="line"><span class="type">True</span></span><br><span class="line"><span class="type">Prelude</span>> not <span class="type">False</span></span><br><span class="line"><span class="type">True</span></span><br><span class="line"><span class="type">Prelude</span>> not (<span class="type">True</span> && <span class="type">True</span>)</span><br><span class="line"><span class="type">False</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="number">5</span> == <span class="number">4</span></span><br><span class="line"><span class="type">False</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="number">5</span> == <span class="number">5</span></span><br><span class="line"><span class="type">True</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="string">"Hello"</span> == <span class="string">"Hello"</span></span><br><span class="line"><span class="type">True</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="number">5</span> /= <span class="number">4</span></span><br><span class="line"><span class="type">True</span></span><br><span class="line"><span class="type">Prelude</span>> <span class="number">5</span> /= <span class="number">5</span></span><br><span class="line"><span class="type">False</span></span><br></pre></td></tr></table></figure><p></p> 448<p></p><h3> 3.2 åºç¡å½æ° </h3> <p></p> 449<h4 id="3-2-1-Haskell-常ç¨å ç½®å½æ°"><a href="#3-2-1-Haskell-常ç¨å ç½®å½æ°" class="headerlink" title="3.2.1 Haskell 常ç¨å ç½®å½æ°"></a>3.2.1 Haskell 常ç¨å ç½®å½æ°</h4><ul> 450<li><strong>succ</strong>ãsucc 彿°è¿åä¸ä¸ªæ°çåç»§ãæ¯å¦:<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> succ <span class="number">10</span></span><br><span class="line"><span class="number">11</span></span><br></pre></td></tr></table></figure> 451</li> 452</ul> 453<p>注æHaskellä¸å½æ°çè°ç¨åæ°æ¯ä½¿ç¨ç©ºæ ¼çï¼è¿ä¸ç¹åä¼ ç»çç¼è¯åè¯è¨æå¾å¤§çä¸åã</p> 454<ul> 455<li><p><strong>
455pred</strong>ãpred彿°åsucc彿°ç¸åï¼å®è¿åä¸ä¸ªæ°åçåé©±ãæ¯å¦:</p> 456<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> pred <span class="number">10</span></span><br><span class="line"><span class="number">9</span></span><br></pre></td></tr></table></figure> 457</li> 458<li><p><strong>min</strong>ãmin彿°æ¥æ¶ä¸¤ä¸ªæ°ååæ°ï¼è¿åè¿ä¸¤ä¸ªæ°åçæå°å¼ãæ¯å¦:</p> 459<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> min <span class="number">10</span> <span class="number">3.4</span></span><br><span class="line"><span class="number">3.4</span></span><br></pre></td></tr></table></figure> 460</li> 461</ul> 462<p>å¦æè¦æ¯è¾å¤ä¸ªæ°åçæå°å¼ï¼ç´æ¥ä¼ éå¤ä¸ªæ°åä½ä¸ºåæ°ä¼æ¥éï¼æ¯å¦:<br><figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> min <span class="number">1</span> <span class="number">19</span> <span class="number">23</span></span><br><span class="line"><interactive>:<span class="number">21</span>:<span class="number">1</span>:</span><br><span class="line"> <span class="type">Non</span> <span class="class"><span class="keyword">type</span>-variable argument in the constraint: <span class="type">Num</span> (<span class="title">a</span> -> <span class="title">t</span>)</span></span><br><span class="line"> (<span class="type">Use</span> <span class="type">FlexibleContexts</span> to permit this)</span><br><span class="line"> <span class="type">When</span> checking that âitâ has the inferred <span class="class"><span class="keyword">type</span></span></span><br><span class="line"> it :: <span class="keyword">forall</span> a t. (<span class="type">Num</span> a, <span class="type">Num</span> (a -> t), <span class="type">Ord</span> (a -> t)) => t</span><br></pre></td></tr></table></figure></p> 463<p>æä»¬å¯ä»¥éè¿å¤æ¬¡è°ç¨min彿°(注æéè¦å æ¬å·)æ¥è§£å³:<br><figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> min <span class="number">1</span> (min <span class="number">9</span> <span class="number">23</span>)</span><br><span class="line"><span class="number">1</span></span><br></pre></td></tr></table></figure></p> 464<ul> 465<li><p><strong>max</strong>ãmax彿°è¿å两个æ°åçæå¤§å¼ãæ¯å¦:</p> 466<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> max <span class="number">9.9</span> <span class="number">9.0</span></span><br><span class="line"><span class="number">9.9</span></span><br></pre></td></tr></table></figure> 467</li> 468<li><p>Haskellä¸<strong>彿°</strong>æ¥ææé«çä¼å 级ãä¸é¢ä¸¤å¥æ¯çæç:</p> 469<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> succ <span class="number">10</span> + max <span class="number">10</span> <span class="number">20</span> * <span class="number">3</span></span><br><span class="line"><span class="number">71</span></span><br><span class="line"><span class="type">Prelude</span>> (succ <span class="number">10</span>) +(max <span class="number">10</span> <span class="number">20</span>
469)*<span class="number">3</span></span><br><span class="line"><span class="number">71</span></span><br></pre></td></tr></table></figure> 470</li> 471</ul> 472<p>注æ<code>succ 9*10</code>ç弿¯100è䏿¯91ï¼è¿æ¯å 为计ç®çé¡ºåºæ¯å 计ç®<code>succ 9</code>å¾å°10,ç¶åå计ç®<code>10*10=100</code>,妿æä»¬è¦è®¡ç®9<em>10çåç»§ï¼éè¦åæ`succ (9</em>10)`çå½¢å¼ã</p> 473<ul> 474<li><strong>div</strong>ãdiv彿°è®¡ç®ä¸ä¸ªæ´æ°é¤ä»¥å¦å¤ä¸ä¸ªæ´æ°çç»æï¼æ¯å¦:<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> div <span class="number">10</span> <span class="number">3</span></span><br><span class="line"><span class="number">3</span></span><br><span class="line"><span class="type">Prelude</span>> div <span class="number">10</span> <span class="number">5</span></span><br><span class="line"><span class="number">2</span></span><br></pre></td></tr></table></figure> 475</li> 476</ul> 477<p>éè¦æ³¨æçæ¯ï¼div彿°æ¥æ¶çä¸¤ä¸ªåæ°å¿ é¡»æ¯æ´æ°ï¼ç¬¬ä¸ä¸ªæ¯è¢«é¤æ°ï¼ç¬¬äºä¸ªæ¯é¤æ°ï¼å¦æé¤ä¸å°½åè¿ååï¼èå¼ä½æ°ãä¼ å ¥æ°åä¸è½æ¯æµ®ç¹æ°ï¼æ¯å¦ä¸é¢çå½¢å¼ä¼æ¥é:<br><figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> div <span class="number">1.2</span> <span class="number">3</span></span><br><span class="line"><interactive>:<span class="number">31</span>:<span class="number">1</span>:</span><br><span class="line"> <span class="type">No</span> <span class="keyword">instance</span> for (<span class="type">Fractional</span> a0) arising from a use <span class="keyword">of</span> âitâ</span><br><span class="line"> <span class="type">The</span> <span class="class"><span class="keyword">type</span> variable âa0â is ambiguous</span></span><br><span class="line"> <span class="type">Note</span>: there are several potential instances:</span><br><span class="line"><span class="class"> <span class="keyword">instance</span> <span class="type">Integral</span> a => <span class="type">Fractional</span> (<span class="type">GHC</span>.<span class="type">Real</span>.<span class="type">Ratio</span> <span class="title">a</span>)</span></span><br><span class="line"><span class="class"> <span class="comment">-- Defined in âGHC.Realâ</span></span></span><br><span class="line"><span class="class"> <span class="keyword">instance</span> <span class="type">Fractional</span> <span class="type">Double</span> <span class="comment">-- Defined in âGHC.Floatâ</span></span></span><br><span class="line"><span class="class"> <span class="keyword">instance</span> <span class="type">Fractional</span> <span class="type">Float</span> <span class="comment">-- Defined in âGHC.Floatâ</span></span></span><br><span class="line"><span class="class"> <span class="type">In</span> the first argument of âprintâ, namely âitâ</span></span><br><span class="line"><span class="class"> <span class="type">In</span> a stmt of an interactive <span class="type">GHCi</span> command: print it</span></span><br></pre></td></tr></table></figure></p> 478<h4 id="3-2-2-æå»ºèªå·±ç彿°"><a href="#3-2-2-æå»ºèªå·±ç彿°" class="headerlink" title="3.2.2 æå»ºèªå·±ç彿°"></a>3.2.2 æå»ºèªå·±ç彿°</h4><ul> 479<li>doubleMeãdoubleMe彿°çå®ä¹å¦ä¸:<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title">doubleMe</span> x = x + x <span class="comment">-- å°æ°åå为两å</span></span><br></pre></td></tr></table></figure> 480</li> 481</ul> 482<p>è¿ä¸ªå½æ°é常ç®åï¼å°±æ¯è¿åä¸ä¸ªæ°åç两åãæ³¨æä¸é¢å½æ°çå®ä¹æ¹å¼:é¦å æ¯å½æ°ååï¼ç¶åæ¯ç©ºæ ¼åéçåæ°ï¼æ¥çæ¯çäºå
482·ï¼çäºå·åé¢çæ¯å½æ°çå®ç°ãè¦è¿è¡è¿ä¸ªå½æ°ï¼éè¦æå®åå¨ä¸ä¸ªæä»¶éï¼æ¯å¦add.hs,ç¶åè¾å ¥ghciè¿å ¥å½ä»¤è¡æ¨¡å¼ï¼è¾å ¥<code>:l add.hs</code>å°±å¯ä»¥å è½½å½æ°äºãä¸é¢æ¯å®çè°ç¨è®¡ç®ç»æ:<br><figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Prelude</span>> :l add.hs </span><br><span class="line">[<span class="number">1</span> <span class="keyword">of</span> <span class="number">1</span>] <span class="type">Compiling</span> <span class="type">Main</span> ( add.hs, interpreted )</span><br><span class="line"><span class="type">Ok</span>, modules loaded: <span class="type">Main</span>.</span><br><span class="line">*<span class="type">Main</span>> doubleMe <span class="number">2</span></span><br><span class="line"><span class="number">4</span></span><br><span class="line">*<span class="type">Main</span>> doubleMe <span class="number">3</span></span><br><span class="line"><span class="number">6</span></span><br></pre></td></tr></table></figure></p> 483<ul> 484<li><strong>doubleUs</strong>ãè¯¥å½æ°æ¥æ¶x,yä¸¤ä¸ªåæ°ï¼ç¶åè¿åè¿ä¸¤ä¸ªåæ°ä¹åç两åãå®ä¹å¦ä¸:<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title">doubleUs</span> x y = x*<span class="number">2</span> + y*<span class="number">2</span> <span class="comment">-- 两个æ°åå为两åç¶åç¸å </span></span><br></pre></td></tr></table></figure> 485</li> 486</ul> 487<p>è°ç¨è®¡ç®ç»æä¸º:<br><figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">*<span class="type">Main</span>> doubleUs <span class="number">1</span> <span class="number">3</span></span><br><span class="line"><span class="number">8</span></span><br><span class="line">*<span class="type">Main</span>> doubleUs <span class="number">0</span> <span class="number">2</span></span><br><span class="line"><span class="number">4</span></span><br></pre></td></tr></table></figure></p> 488<ul> 489<li><strong>useDoubleMe</strong>ãè¯¥å½æ°åè½å<code>doubleUs</code>䏿 ·ï¼åªä¸è¿å ¶è°ç¨äº<code>doubleMe</code>两次ï¼ä»£ç å¦ä¸:<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title">useDoubleMe</span> x y = doubleMe x + doubleMe y <span class="comment">-- è°ç¨ç®å彿°</span></span><br></pre></td></tr></table></figure> 490</li> 491</ul> 492<p>对äºï¼å¿äºè¯´äº,haskell䏿³¨éæ¯<code>--</code>ã</p> 493<ul> 494<li><strong>doubleSmallNumber</strong>ãè¯¥å½æ°ä½¿ç¨<code>if else</code>è¯å¥å®ç°çåè½æ¯:妿xå°äº100åè¿åx;å¦åè¿åxç两åã代ç å¦ä¸:<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title">doubleSmallNumber</span> x = <span class="keyword">if</span> x < <span class="number">100</span> <span class="keyword">then</span> x <span class="keyword">else</span> <span class="number">2</span>*x <span class="comment">--妿xå°äº100è¿åx,å¦åè¿å2*x</span></span><br></pre></td></tr></table></figure> 495</li> 496</ul> 497<p>è°ç¨ç»æä¸º:<br><figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">*<span class="type">Main</span>> doubleSmallNumber <span class="number">20</span></span><br><span class="line"><span class="number">20</span></span><br><span class="line">*<span class="type">Main</span>> doubleSmallNumber <span class="number">200</span></span><br><span class="line"><span class="number">400</span></span><br></pre></td></tr></table></figure></p> 498<p>éè¦æ³¨æçæ¯Haskellä¸ifåelseä¸å®æ¯ä¸èµ·åºç°çï¼elseä¸å¯ä»¥çç¥ï¼è䏿¬è´¨ä¸ifåelse齿¯éè¦è¿åä¸ä¸ªå¼ãHaskell䏿æç彿°å表达å¼é½éè¦è¿åä¸ä¸ªç»æï¼ifè¯å¥å°±æ¯ä¸ä¸ªè¡¨è¾¾å¼ï¼æä»¥å®ä¸å®ä¼è¿åä¸ä¸ªç»æã</p> 499<ul> 500<li><strong>doubleSmallNumberâ</strong>ãdoubleSmallNumberâ彿°(注æå½æ°æåæä¸ä¸ª<code>'</code>)è¿åçç»ææ¯doubleSmallNumberè¿åå¼å 1,å®ä¹ä¸º:<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title">doubleSmallNumber'</span> x = (<span class="keyword">if</span> x < <span class="number">100</span> <span class="keyword">then</span> x <span class="keyword">else</span> <span class="number">2</span>*x) + <span class="number">1</span> <span class="comment">-- doubleSmallNumberè¿åå¼å 1</span></span><br></pre></td></tr></table></figure> 501</li> 502</ul> 503<p>æä»¬é常å¨Haskellä¸å¨å½æ°ååæåå ä¸ä¸ª<code>'</code>æ¥è¡¨ç¤ºå¯¹æä¸ªå½æ°ç¨å¾®ä¿®æ¹ä¹åå¾å°çæ°å½æ°ãä¸é¢ç彿°å¦æææ¬å·å»æï¼é£ä¹åªä¼å¨<code>x>=100</code>
503çæ¶åå 1äºãå¦å¤éè¦æ³¨æçæ¯ï¼Haskellç彿°ååå¼å¤´ä¸è½æ¯å¤§å忝ã</p> 504<ul> 505<li><strong>conanOâBrien</strong>ãconanOâBrienæ¯ä¸ä¸ªæ²¡æåæ°ç彿°ï¼è¿æ ·ç彿°ä¹è¢«ç§°ä¸ºâå®ä¹âæè âååâãconanOâBrienå®ä¹å¦ä¸:<figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title">conanO'Brien</span> = <span class="string">"It's a-me, Conan O'Brien!"</span> <span class="comment">-- 没æåæ°ç彿°</span></span><br></pre></td></tr></table></figure> 506</li> 507</ul> 508<p>ä¸é¢çconanOâBrien彿°å®ä¹å¥½äºä¹åï¼<code>conanO'Brien</code>å°±ä¸å符串<code>"It's a-me, Conan O'Brien!"</code>çä»·äºï¼èä¸å符串ç弿¯ä¸å¯ä»¥ä¿®æ¹çã</p> 509 510 511 512 513 </div> 514 <div class="article-info article-info-index"> 515 516 517 <div class="article-tag tagcloud"> 518 <i class="icon-price-tags icon"></i> 519 <ul class="article-tag-list"> 520 521 <li class="article-tag-list-item"> 522 <a href="javascript:void(0)" class="js-tag article-tag-list-link color3">haskell</a> 523 </li> 524 525 </ul> 526 </div> 527 528 529 530 531 <p class="article-more-link"> 532 <a class="article-more-a" href="/2018/05/27/haskellç®æå ¥é¨-ä¸/">å±å¼å ¨æ >></a> 533 </p> 534 535 536 537 <div class="clearfix"></div> 538 </div> 539 </div> 540</article> 541 542<aside class="wrap-side-operation"> 543 <div class="mod-side-operation"> 544 545 <div class="jump-container" id="js-jump-container" style="display:none;"> 546 <a href="javascript:void(0)" class="mod-side-operation__jump-to-top"> 547 <i class="icon-font icon-back"></i> 548 </a> 549 <div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;"> 550 <i class="icon-font icon-plane jump-plane"></i> 551 </div> 552 </div> 553 554 555 </div> 556</aside> 557 558 559 560 561 562 563 <nav id="page-nav"> 564 <a class="extend prev" rel="prev" href="/">« Prev</a><a class="page-number" href="/">1</a><span class="page-number current">2</span> 565 </nav> 566 567 568 569 </div> 570 </div> 571 </div> 572 <footer id="footer"> 573 <div class="outer"> 574 <div id="footer-info"> 575 <div class="footer-left"> 576 © 2018 lyrichu 577 </div> 578 <div class="footer-right"> 579 <a href="http://hexo.io/" target="_blank">Hexo</a> Theme <a href="https://github.com/litten/hexo-theme-yilia" target="_blank">Yilia</a> by Litten 580 </div> 581 </div> 582 </div> 583</footer> 584 </div> 585
585<script> 586 var yiliaConfig = { 587 mathjax: true, 588 isHome: true, 589 isPost: false, 590 isArchive: false, 591 isTag: false, 592 isCategory: false, 593 open_in_new: true, 594 toc_hide_index: true, 595 root: "/", 596 innerArchive: true, 597 showTags: true 598 } 599</script>
599 600
601<script>!function(t){function n(e){if(r[e])return r[e].exports;var i=r[e]={exports:{},id:e,loaded:!1};return t[e].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}var r={};n.m=t,n.c=r,n.p="./",n(0)}([function(t,n,r){r(195),t.exports=r(191)},function(t,n,r){var e=r(3),i=r(52),o=r(27),u=r(28),c=r(53),f="prototype",a=function(t,n,r){var s,l,h,v,p=t&a.F,d=t&a.G,y=t&a.S,g=t&a.P,b=t&a.B,m=d?e:y?e[n]||(e[n]={}):(e[n]||{})[f],x=d?i:i[n]||(i[n]={}),w=x[f]||(x[f]={});d&&(r=n);for(s in r)l=!p&&m&&void 0!==m[s],h=(l?m:r)[s],v=b&&l?c(h,e):g&&"function"==typeof h?c(Function.call,h):h,m&&u(m,s,h,t&a.U),x[s]!=h&&o(x,s,v),g&&w[s]!=h&&(w[s]=h)};e.core=i,a.F=1,a.G=2,a.S=4,a.P=8,a.B=16,a.W=32,a.U=64,a.R=128,t.exports=a},function(t,n,r){var e=r(6);t.exports=function(t){if(!e(t))throw TypeError(t+" is not an object!");return t}},function(t,n){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n,r){var e=r(126)("wks"),i=r(76),o=r(3).Symbol,u="function"==typeof o;(t.exports=function(t){return e[t]||(e[t]=u&&o[t]||(u?o:i)("Symbol."+t))}).store=e},function(t,n){var r={}.hasOwnProperty;t.exports=function(t,n){return r.call(t,n)}},function(t,n,r){var e=r(94),i=r(33);t.exports=function(t){return e(i(t))}},function(t,n,r){t.exports=!r(4)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,n,r){var e=r(2),i=r(167),o=r(50),u=Object.defineProperty;n.f=r(10)?Object.defineProperty:function(t,n,r){if(e(t),n=o(n,!0),e(r),i)try{return u(t,n,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(t[n]=r.value),t}},function(t,n,r){t.exports=!r(18)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,n,r){var e=r(14),i=r(22);t.exports=r(12)?function(t,n,r){return e.f(t,n,i(1,r))}:function(t,n,r){return t[n]=r,t}},function(t,n,r){var e=r(20),i=r(58),o=r(42),u=Object.defineProperty;n.f=r(12)?Object.defineProperty:function(t,n,r){if(e(t),n=o(n,!0),e(r),i)try{return u(t,n,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(t[n]=r.value),t}},function(t,n,r){var e=r(40)("wks"),i=r(23),o=r(5).Symbol,u="function"==typeof o;(t.exports=function(t){return e[t]||(e[t]=u&&o[t]||(u?o:i)("Symbol."+t))}).store=e},function(t,n,r){var e=r(67),i=Math.min;t.exports=function(t){return t>0?i(e(t),9007199254740991):0}},function(t,n,r){var e=r(46);t.exports=function(t){return Object(e(t))}},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,r){var e=r(63),i=r(34);t.exports=Object.keys||function(t){return e(t,i)}},function(t,n,r){var e=r(21);t.exports=function(t){if(!e(t))throw TypeError(t+" is not an object!");return t}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var r=0,e=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+e).toString(36))}},function(t,n){var r={}.hasOwnProperty;t.exports=function(t,n){return r.call(t,n)}},function(t,n){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,n,r){var e=r(11),i=r(66);t.exports=r(10)?function(t,n,r){return e.f(t,n,i(1,r))}:function(t,n,r){return t[n]=r,t}},function(t,n,r){var e=r(3),i=r(27),o=r(24),u=r(76)("src"),c="toString",f=Function[c],a=(""+f).split(c);r(52).inspectSource=function(t){return f.call(t)},(t.exports=function(t,n,r,c){var f="function"==typeof r;f&&(o(r,"name")||i(r,"name",n)),t[n]!==r&&(f&&(o(r,u)||i(r,u,t[n]?""+t[n]:a.join(String(n)))),t===e?t[n]=r:c?t[n]?t[n]=r:i(t,n,r):(delete t[n],i(t,n,r)))})(Function.prototype,c,function(){return"function"==typeof this&&this[u]||f.call(this)})}
601,function(t,n,r){var e=r(1),i=r(4),o=r(46),u=function(t,n,r,e){var i=String(o(t)),u="<"+n;return""!==r&&(u+=" "+r+'="'+String(e).replace(/"/g,""")+'"'),u+">"+i+"</"+n+">"};t.exports=function(t,n){var r={};r[t]=n(u),e(e.P+e.F*i(function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3}),"String",r)}},function(t,n,r){var e=r(115),i=r(46);t.exports=function(t){return e(i(t))}},function(t,n,r){var e=r(116),i=r(66),o=r(30),u=r(50),c=r(24),f=r(167),a=Object.getOwnPropertyDescriptor;n.f=r(10)?a:function(t,n){if(t=o(t),n=u(n,!0),f)try{return a(t,n)}catch(t){}if(c(t,n))return i(!e.f.call(t,n),t[n])}},function(t,n,r){var e=r(24),i=r(17),o=r(145)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),e(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,n){t.exports={}},function(t,n){t.exports=!0},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,r){var e=r(14).f,i=r(8),o=r(15)("toStringTag");t.exports=function(t,n,r){t&&!i(t=r?t:t.prototype,o)&&e(t,o,{configurable:!0,value:n})}},function(t,n,r){var e=r(40)("keys"),i=r(23);t.exports=function(t){return e[t]||(e[t]=i(t))}},function(t,n,r){var e=r(5),i="__core-js_shared__",o=e[i]||(e[i]={});t.exports=function(t){return o[t]||(o[t]={})}},function(t,n){var r=Math.ceil,e=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?e:r)(t)}},function(t,n,r){var e=r(21);t.exports=function(t,n){if(!e(t))return t;var r,i;if(n&&"function"==typeof(r=t.toString)&&!e(i=r.call(t)))return i;if("function"==typeof(r=t.valueOf)&&!e(i=r.call(t)))return i;if(!n&&"function"==typeof(r=t.toString)&&!e(i=r.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,n,r){var e=r(5),i=r(25),o=r(36),u=r(44),c=r(14).f;t.exports=function(t){var n=i.Symbol||(i.Symbol=o?{}:e.Symbol||{});"_"==t.charAt(0)||t in n||c(n,t,{value:u.f(t)})}},function(t,n,r){n.f=r(15)},function(t,n){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,n){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,n,r){var e=r(4);t.exports=function(t,n){return!!t&&e(function(){n?t.call(null,function(){},1):t.call(null)})}},function(t,n,r){var e=r(53),i=r(115),o=r(17),u=r(16),c=r(203);t.exports=function(t,n){var r=1==t,f=2==t,a=3==t,s=4==t,l=6==t,h=5==t||l,v=n||c;return function(n,c,p){for(var d,y,g=o(n),b=i(g),m=e(c,p,3),x=u(b.length),w=0,S=r?v(n,x):f?v(n,0):void 0;x>w;w++)if((h||w in b)&&(d=b[w],y=m(d,w,g),t))if(r)S[w]=y;else if(y)switch(t){case 3:return!0;case 5:return d;case 6:return w;case 2:S.push(d)}else if(s)return!1;return l?-1:a||s?s:S}}},function(t,n,r){var e=r(1),i=r(52),o=r(4);t.exports=function(t,n){var r=(i.Object||{})[t]||Object[t],u={};u[t]=n(r),e(e.S+e.F*o(function(){r(1)}),"Object",u)}},function(t,n,r){var e=r(6);t.exports=function(t,n){if(!e(t))return t;var r,i;if(n&&"function"==typeof(r=t.toString)&&!e(i=r.call(t)))return i;if("function"==typeof(r=t.valueOf)&&!e(i=r.call(t)))return i;if(!n&&"function"==typeof(r=t.toString)&&!e(i=r.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,n,r){var e=r(5),i=r(25),o=r(91),u=r(13),c="prototype",f=function(t,n,r){var a,s,l,h=t&f.F,v=t&f.G,p=t&f.S,d=t&f.P,y=t&f.B,g=t&f.W,b=v?i:i[n]||(i[n]={}),m=b[c],x=v?e:p?e[n]:(e[n]||{})[c];v&&(r=n);for(a in r)(s=!h&&x&&void 0!==x[a])&&a in b||(l=s?x[a]:r[a],b[a]=v&&"function"!=typeof x[a]?r[a]:y&&s?o(l,e):g&&x[a]==l?function(t){var n=function(n,r,e){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,r)}return new t(n,r,e)}return t.apply(this,arguments)};return n[c]=t[c],n}(l):d&&"function"==typeof l?o(Function.call,l):l,d&&((b.virtual||(b.virtual={}))[a]=l,t&f.R&&m&&!m[a]&&u(m,a,l)))};f.F=1,f.G=2,f.S=4,f.P=8,f.B=16,f.W=32,f.U=64,f.R=128,t.exports=f},function(t,n){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},function(t,n,r){var e=r(26);t.exports=function(t,n,r){if(e(t),void 0===n)return t;switch(r){case 1:return function(r){return t.call(n,r)};case 2:return function(r,e){return t.call(n,r,e)};case 3:return function(r,e,i){return t.call(n,r,e,i)}}return function(){return t.apply(n,arguments)}}},function(t,n,r){var e=r(183),i=r(1),o=r(126)("metadata"),u=o.store||(o.store=new(r(186))),c=function(t,n,r){var i=u.get(t);if(!i){if(!r)return;u.set(t,i=new e)}var o=i.get(n);if(!o){if(!r)return;i.set(n,o=new e)}return o},f=function(t,n,r){var e=c(n,r,!1);return void 0!==e&&e.has(t)},a=function(t,n,r){var e=c(n,r,!1);return void 0===e?void 0:e.get(t)},s=function(t,n,r,e){c(r,e,!0).set(t,n)},l=function(t,n){var r=c(t,n,!1),e=[];return r&&r.forEach(function(t,n){e.push(n)}),e},h=function(t){return void 0===t||"symbol"==typeof t?t:String(t)},v=function(t){i(i.S,"Reflect",t)};t.exports={store:u,map:c,has:f,get:a,set:s,keys:l,key:h,exp:v}},function(t,n,r){"use strict";if(r(10)){var e=r(69),i=r(3),o=r(4),u=r(1),c=r(127),f=r(152),a=r
vendor: 4,325 bytes, line 601
601(53),s=r(68),l=r(66),h=r(27),v=r(73),p=r(67),d=r(16),y=r(75),g=r(50),b=r(24),m=r(180),x=r(114),w=r(6),S=r(17),_=r(137),O=r(70),E=r(32),P=r(71).f,j=r(154),F=r(76),M=r(7),A=r(48),N=r(117),T=r(146),I=r(155),k=r(80),L=r(123),R=r(74),C=r(130),D=r(160),U=r(11),W=r(31),G=U.f,B=W.f,V=i.RangeError,z=i.TypeError,q=i.Uint8Array,K="ArrayBuffer",J="Shared"+K,Y="BYTES_PER_ELEMENT",H="prototype",$=Array[H],X=f.ArrayBuffer,Q=f.DataView,Z=A(0),tt=A(2),nt=A(3),rt=A(4),et=A(5),it=A(6),ot=N(!0),ut=N(!1),ct=I.values,ft=I.keys,at=I.entries,st=$.lastIndexOf,lt=$.reduce,ht=$.reduceRight,vt=$.join,pt=$.sort,dt=$.slice,yt=$.toString,gt=$.toLocaleString,bt=M("iterator"),mt=M("toStringTag"),xt=F("typed_constructor"),wt=F("def_constructor"),St=c.CONSTR,_t=c.TYPED,Ot=c.VIEW,Et="Wrong length!",Pt=A(1,function(t,n){return Tt(T(t,t[wt]),n)}),jt=o(function(){return 1===new q(new Uint16Array([1]).buffer)[0]}),Ft=!!q&&!!q[H].set&&o(function(){new q(1).set({})}),Mt=function(t,n){if(void 0===t)throw z(Et);var r=+t,e=d(t);if(n&&!m(r,e))throw V(Et);return e},At=function(t,n){var r=p(t);if(r<0||r%n)throw V("Wrong offset!");return r},Nt=function(t){if(w(t)&&_t in t)return t;throw z(t+" is not a typed array!")},Tt=function(t,n){if(!(w(t)&&xt in t))throw z("It is not a typed array constructor!");return new t(n)},It=function(t,n){return kt(T(t,t[wt]),n)},kt=function(t,n){for(var r=0,e=n.length,i=Tt(t,e);e>r;)i[r]=n[r++];return i},Lt=function(t,n,r){G(t,n,{get:function(){return this._d[r]}})},Rt=function(t){var n,r,e,i,o,u,c=S(t),f=arguments.length,s=f>1?arguments[1]:void 0,l=void 0!==s,h=j(c);if(void 0!=h&&!_(h)){for(u=h.call(c),e=[],n=0;!(o=u.next()).done;n++)e.push(o.value);c=e}for(l&&f>2&&(s=a(s,arguments[2],2)),n=0,r=d(c.length),i=Tt(this,r);r>n;n++)i[n]=l?s(c[n],n):c[n];return i},Ct=function(){for(var t=0,n=arguments.length,r=Tt(this,n);n>t;)r[t]=arguments[t++];return r},Dt=!!q&&o(function(){gt.call(new q(1))}),Ut=function(){return gt.apply(Dt?dt.call(Nt(this)):Nt(this),arguments)},Wt={copyWithin:function(t,n){return D.call(Nt(this),t,n,arguments.length>2?arguments[2]:void 0)},every:function(t){return rt(Nt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return C.apply(Nt(this),arguments)},filter:function(t){return It(this,tt(Nt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return et(Nt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return it(Nt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){Z(Nt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return ut(Nt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return ot(Nt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return vt.apply(Nt(this),arguments)},lastIndexOf:function(t){return st.apply(Nt(this),arguments)},map:function(t){return Pt(Nt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return lt.apply(Nt(this),arguments)},reduceRight:function(t){return ht.apply(Nt(this),arguments)},reverse:function(){for(var t,n=this,r=Nt(n).length,e=Math.floor(r/2),i=0;i<e;)t=n[i],n[i++]=n[--r],n[r]=t;return n},some:function(t){return nt(Nt(this),t,arguments.length>1?arguments[1]:void 0)},sort:function(t){return pt.call(Nt(this),t)},subarray:function(t,n){var r=Nt(this),e=r.length,i=y(t,e);return new(T(r,r[wt]))(r.buffer,r.byteOffset+i*r.BYTES_PER_ELEMENT,d((void 0===n?e:y(n,e))-i))}},Gt=function(t,n){return It(this,dt.call(Nt(this),t,n))},Bt=function(t){Nt(this);var n=At(arguments[1],1),r=this.length,e=S(t),i=d(e.length),o=0;if(i+n>r)throw V(Et);for(;o<i;)this[n+o]=e[o++]},Vt={entries:function(){return at.call(Nt(this))},keys:function(){return ft.call(Nt(this))},values:function(){return ct.call(Nt(this))}},zt=function(t,n){return w(t)&&t[_t]&&"symbol"!=typeof n&&n in t&&String(+n)==String(n)},qt=function(t,n){return zt(t,n=g(n,!0))?l(2,t[n]):B(t,n)},Kt=function(t,n,r){return!(zt(t,n=g(n,!0))&&w(r)&&b(r,"value"))||b(r,"get")||b(r,"set")||r.configurable||b(r,"writable")&&!r.writable||b(r,"enumerable")&&!r.enumerable?G(t,n,r):(t[n]=r.value,t)};St||(W.f=qt,U.f=Kt),u(u.S+u.F*!St,"Object",{getOwnPropertyDescriptor:qt,defineProperty:Kt}),o(function(){yt.call({})})&&(yt=gt=function(){return vt.call(this)});var Jt=v({},Wt);v(Jt,Vt),h(Jt,bt,Vt.values),v(Jt,{slice:Gt,set:Bt,constructor:function(){}
601,toString:yt,toLocaleString:Ut}),Lt(Jt,"buffer","b"),Lt(Jt,"byteOffset","o"),Lt(Jt,"byteLength","l"),Lt(Jt,"length","e"),G(Jt,mt,{get:function(){return this[_t]}}),t.exports=function(t,n,r,f){f=!!f;var a=t+(f?"Clamped":"")+"Array",l="Uint8Array"!=a,v="get"+t,p="set"+t,y=i[a],g=y||{},b=y&&E(y),m=!y||!c.ABV,S={},_=y&&y[H],j=function(t,r){var e=t._d;return e.v[v](r*n+e.o,jt)},F=function(t,r,e){var i=t._d;f&&(e=(e=Math.round(e))<0?0:e>255?255:255&e),i.v[p](r*n+i.o,e,jt)},M=function(t,n){G(t,n,{get:function(){return j(this,n)},set:function(t){return F(this,n,t)},enumerable:!0})};m?(y=r(function(t,r,e,i){s(t,y,a,"_d");var o,u,c,f,l=0,v=0;if(w(r)){if(!(r instanceof X||(f=x(r))==K||f==J))return _t in r?kt(y,r):Rt.call(y,r);o=r,v=At(e,n);var p=r.byteLength;if(void 0===i){if(p%n)throw V(Et);if((u=p-v)<0)throw V(Et)}else if((u=d(i)*n)+v>p)throw V(Et);c=u/n}else c=Mt(r,!0),u=c*n,o=new X(u);for(h(t,"_d",{b:o,o:v,l:u,e:c,v:new Q(o)});l<c;)M(t,l++)}),_=y[H]=O(Jt),h(_,"constructor",y)):L(function(t){new y(null),new y(t)},!0)||(y=r(function(t,r,e,i){s(t,y,a);var o;return w(r)?r instanceof X||(o=x(r))==K||o==J?void 0!==i?new g(r,At(e,n),i):void 0!==e?new g(r,At(e,n)):new g(r):_t in r?kt(y,r):Rt.call(y,r):new g(Mt(r,l))}),Z(b!==Function.prototype?P(g).concat(P(b)):P(g),function(t){t in y||h(y,t,g[t])}),y[H]=_,e||(_.constructor=y));var A=_[bt],N=!!A&&("values"==A.name||void 0==A.name),T=Vt.values;h(y,xt,!0),h(_,_t,a),h(_,Ot,!0),h(_,wt,y),(f?new y(1)[mt]==a:mt in _)||G(_,mt,{get:function(){return a}}),S[a]=y,u(u.G+u.W+u.F*(y!=g),S),u(u.S,a,{BYTES_PER_ELEMENT:n,from:Rt,of:Ct}),Y in _||h(_,Y,n),u(u.P,a,Wt),R(a),u(u.P+u.F*Ft,a,{set:Bt}),u(u.P+u.F*!N,a,Vt),u(u.P+u.F*(_.toString!=yt),a,{toString:yt}),u(u.P+u.F*o(function(){new y(1).slice()}),a,{slice:Gt}),u(u.P+u.F*(o(function(){return[1,2].toLocaleString()!=new y([1,2]).toLocaleString()})||!o(function(){_.toLocaleString.call([1,2])})),a,{toLocaleString:Ut}),k[a]=N?A:T,e||N||h(_,bt,T)}}else t.exports=function(){}},function(t,n){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,n,r){var e=r(21),i=r(5).document,o=e(i)&&e(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,r){t.exports=!r(12)&&!r(18)(function(){return 7!=Object.defineProperty(r(57)("div"),"a",{get:function(){return 7}}).a})},function(t,n,r){"use strict";var e=r(36),i=r(51),o=r(64),u=r(13),c=r(8),f=r(35),a=r(96),s=r(38),l=r(103),h=r(15)("iterator"),v=!([].keys&&"next"in[].keys()),p="keys",d="values",y=function(){return this};t.exports=function(t,n,r,g,b,m,x){a(r,n,g);var w,S,_,O=function(t){if(!v&&t in F)return F[t];switch(t){case p:case d:return function(){return new r(this,t)}}return function(){return new r(this,t)}},E=n+" Iterator",P=b==d,j=!1,F=t.prototype,M=F[h]||F["@@iterator"]||b&&F[b],A=M||O(b),N=b?P?O("entries"):A:void 0,T="Array"==n?F.entries||M:M;if(T&&(_=l(T.call(new t)))!==Object.prototype&&(s(_,E,!0),e||c(_,h)||u(_,h,y)),P&&M&&M.name!==d&&(j=!0,A=function(){return M.call(this)}),e&&!x||!v&&!j&&F[h]||u(F,h,A),f[n]=A,f[E]=y,b)if(w={values:P?A:O(d),keys:m?A:O(p),entries:N},x)for(S in w)S in F||o(F,S,w[S]);else i(i.P+i.F*(v||j),n,w);return w}},function(t,n,r){var e=r(20),i=r(100),o=r(34),u=r(39)("IE_PROTO"),c=function(){},f="prototype",a=function(){var t,n=r(57)("iframe"),e=o.length;for(n.style.display="none",r(93).appendChild(n),n.src="javascript:",t=n.contentWindow.document,t.open(),t.write("
601<script>document.F=Object<\/script>"),t.close(),a=t.F;e--;)delete a[f][o[e]];return a()};t.exports=Object.create||function(t,n){var r;return null!==t?(c[f]=e(t),r=new c,c[f]=null,r[u]=t):r=a(),void 0===n?r:i(r,n)}},function(t,n,r){var e=r(63),i=r(34).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return e(t,i)}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,r){var e=r(8),i=r(9),o=r(90)(!1),u=r(39)("IE_PROTO");t.exports=function(t,n){var r,c=i(t),f=0,a=[];for(r in c)r!=u&&e(c,r)&&a.push(r);for(;n.length>f;)e(c,r=n[f++])&&(~o(a,r)||a.push(r));return a}},function(t,n,r){t.exports=r(13)},function(t,n,r){var e=r(76)("meta"),i=r(6),o=r(24),u=r(11).f,c=0,f=Object.isExtensible||function(){return!0},a=!r(4)(function(){return f(Object.preventExtensions({}))}),s=function(t){u(t,e,{value:{i:"O"+ ++c,w:{}}})},l=function(t,n){if(!i(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!o(t,e)){if(!f(t))return"F";if(!n)return"E";s(t)}return t[e].i},h=function(t,n){if(!o(t,e)){if(!f(t))return!0;if(!n)return!1;s(t)}return t[e].w},v=function(t){return a&&p.NEED&&f(t)&&!o(t,e)&&s(t),t},p=t.exports={KEY:e,NEED:!1,fastKey:l,getWeak:h,onFreeze:v}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var r=Math.ceil,e=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?e:r)(t)}},function(t,n){t.exports=function(t,n,r,e){if(!(t instanceof n)||void 0!==e&&e in t)throw TypeError(r+": incorrect invocation!");return t}},function(t,n){t.exports=!1},function(t,n,r){var e=r(2),i=r(173),o=r(133),u=r(145)("IE_PROTO"),c=function(){},f="prototype",a=function(){var t,n=r(132)("iframe"),e=o.length;for(n.style.display="none",r(135).appendChild(n),n.src="javascript:",t=n.contentWindow.document,t.open(),t.write("
601<script>document.F=Object<\/script>"),t.close(),a=t.F;e--;)delete a[f][o[e]];return a()};t.exports=Object.create||function(t,n){var r;return null!==t?(c[f]=e(t),r=new c,c[f]=null,r[u]=t):r=a(),void 0===n?r:i(r,n)}},function(t,n,r){var e=r(175),i=r(133).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return e(t,i)}},function(t,n,r){var e=r(175),i=r(133);t.exports=Object.keys||function(t){return e(t,i)}},function(t,n,r){var e=r(28);t.exports=function(t,n,r){for(var i in n)e(t,i,n[i],r);return t}},function(t,n,r){"use strict";var e=r(3),i=r(11),o=r(10),u=r(7)("species");t.exports=function(t){var n=e[t];o&&n&&!n[u]&&i.f(n,u,{configurable:!0,get:function(){return this}})}},function(t,n,r){var e=r(67),i=Math.max,o=Math.min;t.exports=function(t,n){return t=e(t),t<0?i(t+n,0):o(t,n)}},function(t,n){var r=0,e=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+e).toString(36))}},function(t,n,r){var e=r(33);t.exports=function(t){return Object(e(t))}},function(t,n,r){var e=r(7)("unscopables"),i=Array.prototype;void 0==i[e]&&r(27)(i,e,{}),t.exports=function(t){i[e][t]=!0}},function(t,n,r){var e=r(53),i=r(169),o=r(137),u=r(2),c=r(16),f=r(154),a={},s={},n=t.exports=function(t,n,r,l,h){var v,p,d,y,g=h?function(){return t}:f(t),b=e(r,l,n?2:1),m=0;if("function"!=typeof g)throw TypeError(t+" is not iterable!");if(o(g)){for(v=c(t.length);v>m;m++)if((y=n?b(u(p=t[m])[0],p[1]):b(t[m]))===a||y===s)return y}else for(d=g.call(t);!(p=d.next()).done;)if((y=i(d,b,p.value,n))===a||y===s)return y};n.BREAK=a,n.RETURN=s},function(t,n){t.exports={}},function(t,n,r){var e=r(11).f,i=r(24),o=r(7)("toStringTag");t.exports=function(t,n,r){t&&!i(t=r?t:t.prototype,o)&&e(t,o,{configurable:!0,value:n})}},function(t,n,r){var e=r(1),i=r(46),o=r(4),u=r(150),c="["+u+"]",f="âÂ
",a=RegExp("^"+c+c+"*"),s=RegExp(c+c+"*$"),l=function(t,n,r){var i={},c=o(function(){return!!u[t]()||f[t]()!=f}),a=i[t]=c?n(h):u[t];r&&(i[r]=a),e(e.P+e.F*c,"String",i)},h=l.trim=function(t,n){return t=String(i(t)),1&n&&(t=t.replace(a,"")),2&n&&(t=t.replace(s,"")),t};t.exports=l},function(t,n,r){t.exports={default:r(86),__esModule:!0}},function(t,n,r){t.exports={default:r(87),__esModule:!0}},function(t,n,r){"use strict";function e(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var i=r(84),o=e(i),u=r(83),c=e(u),f="function"==typeof c.default&&"symbol"==typeof o.default?function(t){return typeof t}:function(t){return t&&"function"==typeof c.default&&t.constructor===c.default&&t!==c.default.prototype?"symbol":typeof t};n.default="function"==typeof c.default&&"symbol"===f(o.default)?function(t){return void 0===t?"undefined":f(t)}:function(t){return t&&"function"==typeof c.default&&t.constructor===c.default&&t!==c.default.prototype?"symbol":void 0===t?"undefined":f(t)}},function(t,n,r){r(110),r(108),r(111),r(112),t.exports=r(25).Symbol},function(t,n,r){r(109),r(113),t.exports=r(44).f("iterator")},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,n){t.exports=function(){}},function(t,n,r){var e=r(9),i=r(106),o=r(105);t.exports=function(t){return function(n,r,u){var c,f=e(n),a=i(f.length),s=o(u,a);if(t&&r!=r){for(;a>s;)if((c=f[s++])!=c)return!0}else for(;a>s;s++)if((t||s in f)&&f[s]===r)return t||s||0;return!t&&-1}}},function(t,n,r){var e=r(88);t.exports=function(t,n,r){if(e(t),void 0===n)return t;switch(r){case 1:return function(r){return t.call(n,r)};case 2:return function(r,e){return t.call(n,r,e)};case 3:return function(r,e,i){return t.call(n,r,e,i)}}return function(){return t.apply(n,arguments)}}},function(t,n,r){var e=r(19),i=r(62),o=r(37);t.exports=function(t){var n=e(t),r=i.f;if(r)for(var u,c=r(t),f=o.f,a=0;c.length>a;)f.call(t,u=c[a++])&&n.push(u);return n}},function(t,n,r){t.exports=r(5).document&&document.documentElement},function(t,n,r){var e=r(56);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==e(t)?t.split(""):Object(t)}},function(t,n,r){var e=r(56);t.exports=Array.isArray||function(t){return"Array"==e(t)}},function(t,n,r){"use strict";var e=r(60),i=r(22),o=r(38),u={};r(13)(u,r(15)("iterator"),function(){return this}),t.exports=function(t,n,r){t.prototype=e(u,{next:i(1,r)}),o(t,n+" Iterator")}},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,r){var e=r(19),i=r(9);t.exports=function(t,n){for(var r,o=i(t),u=e(o),c=u.length,f=0;c>f;)if(o[r=u[f++]]===n)return r}},function(t,n,r){var e=r(23)("meta"),i=r(21),o=r(8),u=r(14).f,c=0,f=Object.isExtensible||function(){return!0},a=!r(18)(function(){return f(Object.preventExtensions({}))}),s=function(t){u(t,e,{value:{i:"O"+ ++c,w:{}}
vendor: 7,167 bytes, line 601
601})},l=function(t,n){if(!i(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!o(t,e)){if(!f(t))return"F";if(!n)return"E";s(t)}return t[e].i},h=function(t,n){if(!o(t,e)){if(!f(t))return!0;if(!n)return!1;s(t)}return t[e].w},v=function(t){return a&&p.NEED&&f(t)&&!o(t,e)&&s(t),t},p=t.exports={KEY:e,NEED:!1,fastKey:l,getWeak:h,onFreeze:v}},function(t,n,r){var e=r(14),i=r(20),o=r(19);t.exports=r(12)?Object.defineProperties:function(t,n){i(t);for(var r,u=o(n),c=u.length,f=0;c>f;)e.f(t,r=u[f++],n[r]);return t}},function(t,n,r){var e=r(37),i=r(22),o=r(9),u=r(42),c=r(8),f=r(58),a=Object.getOwnPropertyDescriptor;n.f=r(12)?a:function(t,n){if(t=o(t),n=u(n,!0),f)try{return a(t,n)}catch(t){}if(c(t,n))return i(!e.f.call(t,n),t[n])}},function(t,n,r){var e=r(9),i=r(61).f,o={}.toString,u="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],c=function(t){try{return i(t)}catch(t){return u.slice()}};t.exports.f=function(t){return u&&"[object Window]"==o.call(t)?c(t):i(e(t))}},function(t,n,r){var e=r(8),i=r(77),o=r(39)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),e(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,r){var e=r(41),i=r(33);t.exports=function(t){return function(n,r){var o,u,c=String(i(n)),f=e(r),a=c.length;return f<0||f>=a?t?"":void 0:(o=c.charCodeAt(f),o<55296||o>56319||f+1===a||(u=c.charCodeAt(f+1))<56320||u>57343?t?c.charAt(f):o:t?c.slice(f,f+2):u-56320+(o-55296<<10)+65536)}}},function(t,n,r){var e=r(41),i=Math.max,o=Math.min;t.exports=function(t,n){return t=e(t),t<0?i(t+n,0):o(t,n)}},function(t,n,r){var e=r(41),i=Math.min;t.exports=function(t){return t>0?i(e(t),9007199254740991):0}},function(t,n,r){"use strict";var e=r(89),i=r(97),o=r(35),u=r(9);t.exports=r(59)(Array,"Array",function(t,n){this._t=u(t),this._i=0,this._k=n},function(){var t=this._t,n=this._k,r=this._i++;return!t||r>=t.length?(this._t=void 0,i(1)):"keys"==n?i(0,r):"values"==n?i(0,t[r]):i(0,[r,t[r]])},"values"),o.Arguments=o.Array,e("keys"),e("values"),e("entries")},function(t,n){},function(t,n,r){"use strict";var e=r(104)(!0);r(59)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,n=this._t,r=this._i;return r>=n.length?{value:void 0,done:!0}:(t=e(n,r),this._i+=t.length,{value:t,done:!1})})},function(t,n,r){"use strict";var e=r(5),i=r(8),o=r(12),u=r(51),c=r(64),f=r(99).KEY,a=r(18),s=r(40),l=r(38),h=r(23),v=r(15),p=r(44),d=r(43),y=r(98),g=r(92),b=r(95),m=r(20),x=r(9),w=r(42),S=r(22),_=r(60),O=r(102),E=r(101),P=r(14),j=r(19),F=E.f,M=P.f,A=O.f,N=e.Symbol,T=e.JSON,I=T&&T.stringify,k="prototype",L=v("_hidden"),R=v("toPrimitive"),C={}.propertyIsEnumerable,D=s("symbol-registry"),U=s("symbols"),W=s("op-symbols"),G=Object[k],B="function"==typeof N,V=e.QObject,z=!V||!V[k]||!V[k].findChild,q=o&&a(function(){return 7!=_(M({},"a",{get:function(){return M(this,"a",{value:7}).a}})).a})?function(t,n,r){var e=F(G,n);e&&delete G[n],M(t,n,r),e&&t!==G&&M(G,n,e)}:M,K=function(t){var n=U[t]=_(N[k]);return n._k=t,n},J=B&&"symbol"==typeof N.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof N},Y=function(t,n,r){return t===G&&Y(W,n,r),m(t),n=w(n,!0),m(r),i(U,n)?(r.enumerable?(i(t,L)&&t[L][n]&&(t[L][n]=!1),r=_(r,{enumerable:S(0,!1)})):(i(t,L)||M(t,L,S(1,{})),t[L][n]=!0),q(t,n,r)):M(t,n,r)},H=function(t,n){m(t);for(var r,e=g(n=x(n)),i=0,o=e.length;o>i;)Y(t,r=e[i++],n[r]);return t},$=function(t,n){return void 0===n?_(t):H(_(t),n)},X=function(t){var n=C.call(this,t=w(t,!0));return!(this===G&&i(U,t)&&!i(W,t))&&(!(n||!i(this,t)||!i(U,t)||i(this,L)&&this[L][t])||n)},Q=function(t,n){if(t=x(t),n=w(n,!0),t!==G||!i(U,n)||i(W,n)){var r=F(t,n);return!r||!i(U,n)||i(t,L)&&t[L][n]||(r.enumerable=!0),r}},Z=function(t){for(var n,r=A(x(t)),e=[],o=0;r.length>o;)i(U,n=r[o++])||n==L||n==f||e.push(n);return e},tt=function(t){for(var n,r=t===G,e=A(r?W:x(t)),o=[],u=0;e.length>u;)!i(U,n=e[u++])||r&&!i(G,n)||o.push(U[n]);return o};B||(N=function(){if(this instanceof N)throw TypeError("Symbol is not a constructor!");var t=h(arguments.length>0?arguments[0]:void 0),n=function(r){this===G&&n.call(W,r),i(this,L)&&i(this[L],t)&&(this[L][t]=!1),q(this,t,S(1,r))};return o&&z&&q(G,t,{configurable:!0,set:n}),K(t)},c(N[k],"toString",function(){return this._k}),E.f=Q,P.f=Y,r(61).f=O.f=Z,r(37).f=X,r(62).f=tt,o&&!r(36)&&c(G,"propertyIsEnumerable",X,!0),p.f=function(t){return K(v(t))}),u(u.G+u.W+u.F*!B,{Symbol:N});for(var nt="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),rt=0;nt.length>rt;)v(nt[rt++]);for(var nt=j(v.store),rt=0;nt.length>rt;)d(nt[rt++]);u(u.S+u.F*!B,"Symbol",{for:function(t){return i(D,t+="")?D[t]:D[t]=N(t)},keyFor:function(t){if(J(t))return y(D,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){z=!0},useSimple:function(){z=!1}}),u(u.S+u.F*!B,"Object",{create:$,defineProperty:Y,defineProperties:H,getOwnPropertyDescriptor:Q,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),T&&u(u.S+u.F*(!B||a(function(){var t=N();return"[null]"!=I([t])||"{}"!=I({a:t})||"{}"!=I(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!J(t)){for(var n,r,e=[t],i=1;arguments.length>i;)e.push(arguments[i++]);return n=e[1],"function"==typeof n&&(r=n),!r&&b(n)||(n=function(t,n){if(r&&(n=r.call(this,t,n)),!J(n))return n}),e[1]=n,I.apply(T,e)}}}),N[k][R]||r(13)(N[k],R,N[k].valueOf),l(N,"Symbol"),l(Math,"Math",!0),l(e.JSON,"JSON",!0)},function(t,n,r){r(43)("asyncIterator")},function(t,n,r){r(43)("observable")},function(t,n,r){r(107);for(var e=r(5),i=r(13),o=r(35),u=r(15)("toStringTag"),c=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],f=0;f<5;f++){var a=c[f],s=e[a],l=s&&s.prototype;l&&!l[u]&&i(l,u,a),o[a]=o.Array}},function(t,n,r){var e=r(45),i=r(7)("toStringTag"),o="Arguments"==e(function(){return arguments}()),u=function(t,n){try{return t[n]}catch(t){}};t.exports=function(t){var n,r,c;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=u(n=Object(t),i))?r:o?e(n):"Object"==(c=e(n))&&"function"==typeof n.callee?"Arguments":c}},function(t,n,r){var e=r(45);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==e(t)?t.split(""):Object(t)}},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,r){var e=r(30),i=r(16),o=r(75);t.exports=function(t){return function(n,r,u){var c,f=e(n),a=i(f.length),s=o(u,a);if(t&&r!=r){for(;a>s;)if((c=f[s++])!=c)return!0}else for(;a>s;s++)if((t||s in f)&&f[s]===r)return t||s||0;return!t&&-1}}},function(t,n,r){"use strict";var e=r(3),i=r(1),o=r(28),u=r(73),c=r(65),f=r(79),a=r(68),s=r(6),l=r(4),h=r(123),v=r(81),p=r(136);t.exports=function(t,n,r,d,y,g){var b=e[t],m=b,x=y?"set":"add",w=m&&m.prototype,S={},_=function(t){var n=w[t];o(w,t,"delete"==t?function(t){return!(g&&!s(t))&&n.call(this,0===t?0:t)}:"has"==t?function(t){return!(g&&!s(t))&&n.call(this,0===t?0:t)}:"get"==t?function(t){return g&&!s(t)?void 0:n.call(this,0===t?0:t)}:"add"==t?function(t){return n.call(this,0===t?0:t),this}:function(t,r){return n.call(this,0===t?0:t,r),this})};
601if("function"==typeof m&&(g||w.forEach&&!l(function(){(new m).entries().next()}))){var O=new m,E=O[x](g?{}:-0,1)!=O,P=l(function(){O.has(1)}),j=h(function(t){new m(t)}),F=!g&&l(function(){for(var t=new m,n=5;n--;)t[x](n,n);return!t.has(-0)});j||(m=n(function(n,r){a(n,m,t);var e=p(new b,n,m);return void 0!=r&&f(r,y,e[x],e),e}),m.prototype=w,w.constructor=m),(P||F)&&(_("delete"),_("has"),y&&_("get")),(F||E)&&_(x),g&&w.clear&&delete w.clear}else m=d.getConstructor(n,t,y,x),u(m.prototype,r),c.NEED=!0;return v(m,t),S[t]=m,i(i.G+i.W+i.F*(m!=b),S),g||d.setStrong(m,t,y),m}},function(t,n,r){"use strict";var e=r(27),i=r(28),o=r(4),u=r(46),c=r(7);t.exports=function(t,n,r){var f=c(t),a=r(u,f,""[t]),s=a[0],l=a[1];o(function(){var n={};return n[f]=function(){return 7},7!=""[t](n)})&&(i(String.prototype,t,s),e(RegExp.prototype,f,2==n?function(t,n){return l.call(t,this,n)}:function(t){return l.call(t,this)}))} 602},function(t,n,r){"use strict";var e=r(2);t.exports=function(){var t=e(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},function(t,n){t.exports=function(t,n,r){var e=void 0===r;switch(n.length){case 0:return e?t():t.call(r);case 1:return e?t(n[0]):t.call(r,n[0]);case 2:return e?t(n[0],n[1]):t.call(r,n[0],n[1]);case 3:return e?t(n[0],n[1],n[2]):t.call(r,n[0],n[1],n[2]);case 4:return e?t(n[0],n[1],n[2],n[3]):t.call(r,n[0],n[1],n[2],n[3])}return t.apply(r,n)}},function(t,n,r){var e=r(6),i=r(45),o=r(7)("match");t.exports=function(t){var n;return e(t)&&(void 0!==(n=t[o])?!!n:"RegExp"==i(t))}},function(t,n,r){var e=r(7)("iterator"),i=!1;try{var o=[7][e]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(t){}t.exports=function(t,n){if(!n&&!i)return!1;var r=!1;try{var o=[7],u=o[e]();u.next=function(){return{done:r=!0}},o[e]=function(){return u},t(o)}catch(t){}return r}},function(t,n,r){t.exports=r(69)||!r(4)(function(){var t=Math.random();__defineSetter__.call(null,t,function(){}),delete r(3)[t]})},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,r){var e=r(3),i="__core-js_shared__",o=e[i]||(e[i]={});t.exports=function(t){return o[t]||(o[t]={})}},function(t,n,r){for(var e,i=r(3),o=r(27),u=r(76),c=u("typed_array"),f=u("view"),a=!(!i.ArrayBuffer||!i.DataView),s=a,l=0,h="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");l<9;)(e=i[h[l++]])?(o(e.prototype,c,!0),o(e.prototype,f,!0)):s=!1;t.exports={ABV:a,CONSTR:s,TYPED:c,VIEW:f}},function(t,n){"use strict";var r={versions:function(){var t=window.navigator.userAgent;return{trident:t.indexOf("Trident")>-1,presto:t.indexOf("Presto")>-1,webKit:t.indexOf("AppleWebKit")>-1,gecko:t.indexOf("Gecko")>-1&&-1==t.indexOf("KHTML"),mobile:!!t.match(/AppleWebKit.*Mobile.*/),ios:!!t.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),android:t.indexOf("Android")>-1||t.indexOf("Linux")>-1,iPhone:t.indexOf("iPhone")>-1||t.indexOf("Mac")>-1,iPad:t.indexOf("iPad")>-1,webApp:-1==t.indexOf("Safari"),weixin:-1==t.indexOf("MicroMessenger")}}()};t.exports=r},function(t,n,r){"use strict";var e=r(85),i=function(t){return t&&t.__esModule?t:{default:t}}(e),o=function(){function t(t,n,e){return n||e?String.fromCharCode(n||e):r[t]||t}function n(t){return e[t]}var r={""":'"',"<":"<",">":">","&":"&"," ":" "},e={};for(var u in r)e[r[u]]=u;return r["'"]="'",e["'"]="'",{encode:function(t){return t?(""+t).replace(/['<> "&]/g,n).replace(/\r?\n/g,"<br/>").replace(/\s/g," "):""},decode:function(n){return n?(""+n).replace(/<br\s*\/?>/gi,"\n").replace(/"|<|>|&| |'|&#(\d+);|&#(\d+)/g,t).replace(/\u00a0/g," "):""},encodeBase16:function(t){if(!t)return t;t+="";for(var n=[],r=0,e=t.length;e>r;r++)n.push(t.charCodeAt(r).toString(16).toUpperCase());return n.join("")},encodeBase16forJSON:function(t){if(!t)return t;t=t.replace(/[\u4E00-\u9FBF]/gi,function(t){return escape(t).replace("%u","\\u")});for(var n=[],r=0,e=t.length;e>r;r++)n.push(t.charCodeAt(r).toString(16).toUpperCase());return n.join("")},decodeBase16:function(t){if(!t)return t;t+="";for(var n=[],r=0,e=t.length;e>r;r+=2)n.push(String.fromCharCode("0x"+t.slice(r,r+2)));return n.join("")},encodeObject:function(t){if(t instanceof Array)for(var n=0,r=t.length;r>n;n++)t[n]=o.encodeObject(t[n]);else if("object"==(void 0===t?"undefined":(0,i.default)(t)))for(var e in t)t[e]=o.encodeObject(t[e]);else if("string"==typeof t)return o.encode(t);return t},loadScript:function(t){var n=document.createElement("script");document.getElementsByTagName("body")[0].appendChild(n),n.setAttribute("src",t)},addLoadEvent:function(t){var n=window.onload;"function"!=typeof window.onload?window.onload=t:window.onload=function(){n(),t()}}}}();t.exports=o},function(t,n,r){"use strict";var e=r(17),i=r(75),o=r(16);t.exports=function(t){for(var n=e(this),r=o(n.length),u=arguments.length,c=i(u>1?arguments[1]:void 0,r),f=u>2?arguments[2]:void 0,a=void 0===f?r:i(f,r);a>c;)n[c++]=t;return n}},function(t,n,r){"use strict";var e=r(11),i=r(66);t.exports=function(t,n,r){n in t?e.f(t,n,i(0,r)):t[n]=r}},function(t,n,r){var e=r(6),i=r(3).document,o=e(i)&&e(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleStr
602ing,toString,valueOf".split(",")},function(t,n,r){var e=r(7)("match");t.exports=function(t){var n=/./;try{"/./"[t](n)}catch(r){try{return n[e]=!1,!"/./"[t](n)}catch(t){}}return!0}},function(t,n,r){t.exports=r(3).document&&document.documentElement},function(t,n,r){var e=r(6),i=r(144).set;t.exports=function(t,n,r){var o,u=n.constructor;return u!==r&&"function"==typeof u&&(o=u.prototype)!==r.prototype&&e(o)&&i&&i(t,o),t}},function(t,n,r){var e=r(80),i=r(7)("iterator"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(e.Array===t||o[i]===t)}},function(t,n,r){var e=r(45);t.exports=Array.isArray||function(t){return"Array"==e(t)}},function(t,n,r){"use strict";var e=r(70),i=r(66),o=r(81),u={};r(27)(u,r(7)("iterator"),function(){return this}),t.exports=function(t,n,r){t.prototype=e(u,{next:i(1,r)}),o(t,n+" Iterator")}},function(t,n,r){"use strict";var e=r(69),i=r(1),o=r(28),u=r(27),c=r(24),f=r(80),a=r(139),s=r(81),l=r(32),h=r(7)("iterator"),v=!([].keys&&"next"in[].keys()),p="keys",d="values",y=function(){return this};t.exports=function(t,n,r,g,b,m,x){a(r,n,g);var w,S,_,O=function(t){if(!v&&t in F)return F[t];switch(t){case p:case d:return function(){return new r(this,t)}}return function(){return new r(this,t)}},E=n+" Iterator",P=b==d,j=!1,F=t.prototype,M=F[h]||F["@@iterator"]||b&&F[b],A=M||O(b),N=b?P?O("entries"):A:void 0,T="Array"==n?F.entries||M:M;if(T&&(_=l(T.call(new t)))!==Object.prototype&&(s(_,E,!0),e||c(_,h)||u(_,h,y)),P&&M&&M.name!==d&&(j=!0,A=function(){return M.call(this)}),e&&!x||!v&&!j&&F[h]||u(F,h,A),f[n]=A,f[E]=y,b)if(w={values:P?A:O(d),keys:m?A:O(p),entries:N},x)for(S in w)S in F||o(F,S,w[S]);else i(i.P+i.F*(v||j),n,w);return w}},function(t,n){var r=Math.expm1;t.exports=!r||r(10)>22025.465794806718||r(10)<22025.465794806718||-2e-17!=r(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:r},function(t,n){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,n,r){var e=r(3),i=r(151).set,o=e.MutationObserver||e.WebKitMutationObserver,u=e.process,c=e.Promise,f="process"==r(45)(u);t.exports=function(){var t,n,r,a=function(){var e,i;for(f&&(e=u.domain)&&e.exit();t;){i=t.fn,t=t.next;try{i()}catch(e){throw t?r():n=void 0,e}}n=void 0,e&&e.enter()};if(f)r=function(){u.nextTick(a)};else if(o){var s=!0,l=document.createTextNode("");new o(a).observe(l,{characterData:!0}),r=function(){l.data=s=!s}}else if(c&&c.resolve){var h=c.resolve();r=function(){h.then(a)}}else r=function(){i.call(e,a)};return function(e){var i={fn:e,next:void 0};n&&(n.next=i),t||(t=i,r()),n=i}}},function(t,n,r){var e=r(6),i=r(2),o=function(t,n){if(i(t),!e(n)&&null!==n)throw TypeError(n+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,n,e){try{e=r(53)(Function.call,r(31).f(Object.prototype,"__proto__").set,2),e(t,[]),n=!(t instanceof Array)}catch(t){n=!0}return function(t,r){return o(t,r),n?t.__proto__=r:e(t,r),t}}({},!1):void 0),check:o}},function(t,n,r){var e=r(126)("keys"),i=r(76);t.exports=function(t){return e[t]||(e[t]=i(t))}},function(t,n,r){var e=r(2),i=r(26),o=r(7)("species");t.exports=function(t,n){var r,u=e(t).constructor;return void 0===u||void 0==(r=e(u)[o])?n:i(r)}},function(t,n,r){var e=r(67),i=r(46);t.exports=function(t){return function(n,r){var o,u,c=String(i(n)),f=e(r),a=c.length;return f<0||f>=a?t?"":void 0:(o=c.charCodeAt(f),o<55296||o>56319||f+1===a||(u=c.charCodeAt(f+1))<56320||u>57343?t?c.charAt(f):o:t?c.slice(f,f+2):u-56320+(o-55296<<10)+65536)}}},function(t,n,r){var e=r(122),i=r(46);t.exports=function(t,n,r){if(e(n))throw TypeError("String#"+r+" doesn't accept regex!");return String(i(t))}},function(t,n,r){"use strict";var e=r(67),i=r(46);t.exports=function(t){var n=String(i(this)),r="",o=e(t);if(o<0||o==1/0)throw RangeError("Count can't be negative");for(;o>0;(o>>>=1)&&(n+=n))1&o&&(r+=n);return r}},function(t,n){t.exports="\t\n\v\f\r  áá ââââââ
ââââââ¯âã\u2028\u2029\ufeff"},function(t,n,r){var e,i,o,u=r(53),c=r(121),f=r(135),a=r(132),s=r(3),l=s.process,h=s.setImmediate,v=s.clearImmediate,p=s.MessageChannel,d=0,y={},g="onreadystatechange",b=function(){var t=+this;if(y.hasOwnProperty(t)){var n=y[t];delete y[t],n()}},m=function(t){b.call(t.data)};h&&v||(h=function(t){for(var n=[],r=1;arguments.length>r;)n.push(arguments[r++]);return y[++d]=function(){c("function"==typeof t?t:Function(t),n)},e(d),d},v=function(t){delete y[t]},"process"==r(45)(l)?e=function(t){l.nextTick(u(b,t,1))}:p?(i=new p,o=i.port2,i.port1.onmessage=m,e=u(o.postMessage,o,1)):s.addEventListener&&"function"==typeof postMessage&&!s.importScripts?(e=function(t){s.postMessage(t+"","*")},s.addEventListener("message",m,!1)):e=g in a("script")?function(t){f.appendChild(a("script"))[g]=function(){f.removeChild(this),b.call(t)}}:function(t){setTimeout(u(b,t,1),0)}),t.exports={set:h,clear:v}},function(t,n,r){"use strict";var e=r(3),i=r(10),o=r(69),u=r(127),c=r(27),f=r(73),a=r(4),s=r(68),l=r(67),h=r(16),v=r(71).f,p=r(11).f,d=r(130),y=r(81),g="ArrayBuffer",b="DataView",m="prototype",x="Wrong length!",w="Wrong index!",S=e[g],_=e[b],O=e.Math,E=e.RangeError,P=e.Infinity,j=S,F=O.abs,M=O.pow,A=O.floor,N=O.log,T=O.LN2,I="buffer",k="byteLength",L="byteOffset",R=i?"_b":I,C=i?"_l":k,D=i?"_o":L,U=function(t,n,r){var e,i,o,u=Array(r),c=8*r-n-1,f=(1<<c)-1,a=f>>1,s=23===n?M(2,-24)-M(2,-77):0,l=0,h=t<0||0===t&&1/t<0?1:0;for(t=F(t),t!=t||t===P?(i=t!=t?1:0,e=f):(e=A(N(t)/T),t*(o=M(2,-e))<1&&(e--,o*=2),t+=e+a>=1?s/o:s*M(2,1-a),t*o>=2&&(e++,o/=2),e+a>=f?(i=0,e=f):e+a>=1?(i=(t*o-1)*M(2,n),e+=a):(i=t*M(2,a-1)*M(2,n),e=0));n>=8;u[l++]=255&i,i/=256,n-=8);for(e=e<<n|i,c+=n;c>0;
602u[l++]=255&e,e/=256,c-=8);return u[--l]|=128*h,u},W=function(t,n,r){var e,i=8*r-n-1,o=(1<<i)-1,u=o>>1,c=i-7,f=r-1,a=t[f--],s=127&a;for(a>>=7;c>0;s=256*s+t[f],f--,c-=8);for(e=s&(1<<-c)-1,s>>=-c,c+=n;c>0;e=256*e+t[f],f--,c-=8);if(0===s)s=1-u;else{if(s===o)return e?NaN:a?-P:P;e+=M(2,n),s-=u}return(a?-1:1)*e*M(2,s-n)},G=function(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]},B=function(t){return[255&t]},V=function(t){return[255&t,t>>8&255]},z=function(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]},q=function(t){return U(t,52,8)},K=function(t){return U(t,23,4)},J=function(t,n,r){p(t[m],n,{get:function(){return this[r]}})},Y=function(t,n,r,e){var i=+r,o=l(i);if(i!=o||o<0||o+n>t[C])throw E(w);var u=t[R]._b,c=o+t[D],f=u.slice(c,c+n);return e?f:f.reverse()},H=function(t,n,r,e,i,o){var u=+r,c=l(u);if(u!=c||c<0||c+n>t[C])throw E(w);for(var f=t[R]._b,a=c+t[D],s=e(+i),h=0;h<n;h++)f[a+h]=s[o?h:n-h-1]},$=function(t,n){s(t,S,g);var r=+n,e=h(r);if(r!=e)throw E(x);return e};if(u.ABV){if(!a(function(){new S})||!a(function(){new S(.5)})){S=function(t){return new j($(this,t))};for(var X,Q=S[m]=j[m],Z=v(j),tt=0;Z.length>tt;)(X=Z[tt++])in S||c(S,X,j[X]);o||(Q.constructor=S)}var nt=new _(new S(2)),rt=_[m].setInt8;nt.setInt8(0,2147483648),nt.setInt8(1,2147483649),!nt.getInt8(0)&&nt.getInt8(1)||f(_[m],{setInt8:function(t,n){rt.call(this,t,n<<24>>24)},setUint8:function(t,n){rt.call(this,t,n<<24>>24)}},!0)}else S=function(t){var n=$(this,t);this._b=d.call(Array(n),0),this[C]=n},_=function(t,n,r){s(this,_,b),s(t,S,b);var e=t[C],i=l(n);if(i<0||i>e)throw E("Wrong offset!");if(r=void 0===r?e-i:h(r),i+r>e)throw E(x);this[R]=t,this[D]=i,this[C]=r},i&&(J(S,k,"_l"),J(_,I,"_b"),J(_,k,"_l"),J(_,L,"_o")),f(_[m],{getInt8:function(t){return Y(this,1,t)[0]<<24>>24},getUint8:function(t){return Y(this,1,t)[0]},getInt16:function(t){var n=Y(this,2,t,arguments[1]);return(n[1]<<8|n[0])<<16>>16},getUint16:function(t){var n=Y(this,2,t,arguments[1]);return n[1]<<8|n[0]},getInt32:function(t){return G(Y(this,4,t,arguments[1]))},getUint32:function(t){return G(Y(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return W(Y(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return W(Y(this,8,t,arguments[1]),52,8)},setInt8:function(t,n){H(this,1,t,B,n)},setUint8:function(t,n){H(this,1,t,B,n)},setInt16:function(t,n){H(this,2,t,V,n,arguments[2])},setUint16:function(t,n){H(this,2,t,V,n,arguments[2])},setInt32:function(t,n){H(this,4,t,z,n,arguments[2])},setUint32:function(t,n){H(this,4,t,z,n,arguments[2])},setFloat32:function(t,n){H(this,4,t,K,n,arguments[2])},setFloat64:function(t,n){H(this,8,t,q,n,arguments[2])}});y(S,g),y(_,b),c(_[m],u.VIEW,!0),n[g]=S,n[b]=_},function(t,n,r){var e=r(3),i=r(52),o=r(69),u=r(182),c=r(11).f;t.exports=function(t){var n=i.Symbol||(i.Symbol=o?{}:e.Symbol||{});"_"==t.charAt(0)||t in n||c(n,t,{value:u.f(t)})}},function(t,n,r){var e=r(114),i=r(7)("iterator"),o=r(80);t.exports=r(52).getIteratorMethod=function(t){if(void 0!=t)return t[i]||t["@@iterator"]||o[e(t)]}},function(t,n,r){"use strict";var e=r(78),i=r(170),o=r(80),u=r(30);t.exports=r(140)(Array,"Array",function(t,n){this._t=u(t),this._i=0,this._k=n},function(){var t=this._t,n=this._k,r=this._i++;return!t||r>=t.length?(this._t=void 0,i(1)):"keys"==n?i(0,r):"values"==n?i(0,t[r]):i(0,[r,t[r]])},"values"),o.Arguments=o.Array,e("keys"),e("values"),e("entries")},function(t,n){function r(t,n){t.classList?t.classList.add(n):t.className+=" "+n}t.exports=r},function(t,n){function r(t,n){if(t.classList)t.classList.remove(n);else{var r=new RegExp("(^|\\b)"+n.split(" ").join("|")+"(\\b|$)","gi");t.className=t.className.replace(r," ")}}t.exports=r},function(t,n){function r(){throw new Error("setTimeout has not been defined")}function e(){throw new Error("clearTimeout has not been defined")}function i(t){if(s===setTimeout)return setTimeout(t,0);if((s===r||!s)&&setTimeout)return s=setTimeout,setTimeout(t,0);try{return s(t,0)}catch(n){try{return s.call(null,t,0)}catch(n){return s.call(this,t,0)}}}function o(t){if(l===clearTimeout)return clearTimeout(t);if((l===e||!l)&&clearTimeout)return l=clearTimeout,clearTimeout(t);try{return l(t)}catch(n){try{return l.call(null,t)}catch(n){return l.call(this,t)}}}function u(){d&&v&&(d=!1,v.length?p=v.concat(p):y=-1,p.length&&c())}function c(){if(!d){var t=i(u);d=!0;for(var n=p.length;n;){for(v=p,p=[];++y<n;)v&&v[y].run();y=-1,n=p.length}v=null,d=!1,o(t)}}function f(t,n){this.fun=t,this.array=n}function a(){}var s,l,h=t.exports={};
602!function(){try{s="function"==typeof setTimeout?setTimeout:r}catch(t){s=r}try{l="function"==typeof clearTimeout?clearTimeout:e}catch(t){l=e}}();var v,p=[],d=!1,y=-1;h.nextTick=function(t){var n=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)n[r-1]=arguments[r];p.push(new f(t,n)),1!==p.length||d||i(c)},f.prototype.run=function(){this.fun.apply(null,this.array)},h.title="browser",h.browser=!0,h.env={},h.argv=[],h.version="",h.versions={},h.on=a,h.addListener=a,h.once=a,h.off=a,h.removeListener=a,h.removeAllListeners=a,h.emit=a,h.prependListener=a,h.prependOnceListener=a,h.listeners=function(t){return[]},h.binding=function(t){throw new Error("process.binding is not supported")},h.cwd=function(){return"/"},h.chdir=function(t){throw new Error("process.chdir is not supported")},h.umask=function(){return 0}},function(t,n,r){var e=r(45);t.exports=function(t,n){if("number"!=typeof t&&"Number"!=e(t))throw TypeError(n);return+t}},function(t,n,r){"use strict";var e=r(17),i=r(75),o=r(16);t.exports=[].copyWithin||function(t,n){var r=e(this),u=o(r.length),c=i(t,u),f=i(n,u),a=arguments.length>2?arguments[2]:void 0,s=Math.min((void 0===a?u:i(a,u))-f,u-c),l=1;for(f<c&&c<f+s&&(l=-1,f+=s-1,c+=s-1);s-- >0;)f in r?r[c]=r[f]:delete r[c],c+=l,f+=l;return r}},function(t,n,r){var e=r(79);t.exports=function(t,n){var r=[];return e(t,!1,r.push,r,n),r}},function(t,n,r){var e=r(26),i=r(17),o=r(115),u=r(16);t.exports=function(t,n,r,c,f){e(n);var a=i(t),s=o(a),l=u(a.length),h=f?l-1:0,v=f?-1:1;if(r<2)for(;;){if(h in s){c=s[h],h+=v;break}if(h+=v,f?h<0:l<=h)throw TypeError("Reduce of empty array with no initial value")}for(;f?h>=0:l>h;h+=v)h in s&&(c=n(c,s[h],h,a));return c}},function(t,n,r){"use strict";var e=r(26),i=r(6),o=r(121),u=[].slice,c={},f=function(t,n,r){if(!(n in c)){for(var e=[],i=0;i<n;i++)e[i]="a["+i+"]";c[n]=Function("F,a","return new F("+e.join(",")+")")}return c[n](t,r)};t.exports=Function.bind||function(t){var n=e(this),r=u.call(arguments,1),c=function(){var e=r.concat(u.call(arguments));return this instanceof c?f(n,e.length,e):o(n,e,t)};return i(n.prototype)&&(c.prototype=n.prototype),c}},function(t,n,r){"use strict";var e=r(11).f,i=r(70),o=r(73),u=r(53),c=r(68),f=r(46),a=r(79),s=r(140),l=r(170),h=r(74),v=r(10),p=r(65).fastKey,d=v?"_s":"size",y=function(t,n){var r,e=p(n);if("F"!==e)return t._i[e];for(r=t._f;r;r=r.n)if(r.k==n)return r};t.exports={getConstructor:function(t,n,r,s){var l=t(function(t,e){c(t,l,n,"_i"),t._i=i(null),t._f=void 0,t._l=void 0,t[d]=0,void 0!=e&&a(e,r,t[s],t)});return o(l.prototype,{clear:function(){for(var t=this,n=t._i,r=t._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete n[r.i];t._f=t._l=void 0,t[d]=0},delete:function(t){var n=this,r=y(n,t);if(r){var e=r.n,i=r.p;delete n._i[r.i],r.r=!0,i&&(i.n=e),e&&(e.p=i),n._f==r&&(n._f=e),n._l==r&&(n._l=i),n[d]--}return!!r},forEach:function(t){c(this,l,"forEach");for(var n,r=u(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(r(n.v,n.k,this);n&&n.r;)n=n.p},has:function(t){return!!y(this,t)}}),v&&e(l.prototype,"size",{get:function(){return f(this[d])}}),l},def:function(t,n,r){var e,i,o=y(t,n);return o?o.v=r:(t._l=o={i:i=p(n,!0),k:n,v:r,p:e=t._l,n:void 0,r:!1},t._f||(t._f=o),e&&(e.n=o),t[d]++,"F"!==i&&(t._i[i]=o)),t},getEntry:y,setStrong:function(t,n,r){s(t,n,function(t,n){this._t=t,this._k=n,this._l=void 0},function(){for(var t=this,n=t._k,r=t._l;r&&r.r;)r=r.p;return t._t&&(t._l=r=r?r.n:t._t._f)?"keys"==n?l(0,r.k):"values"==n?l(0,r.v):l(0,[r.k,r.v]):(t._t=void 0,l(1))},r?"entries":"values",!r,!0),h(n)}}},function(t,n,r){var e=r(114),i=r(161);t.exports=function(t){return function(){if(e(this)!=t)throw TypeError(t+"#toJSON isn't generic");return i(this)}}},function(t,n,r){"use strict";var e=r(73),i=r(65).getWeak,o=r(2),u=r(6),c=r(68),f=r(79),a=r(48),s=r(24),l=a(5),h=a(6),v=0,p=function(t){return t._l||(t._l=new d)},d=function(){this.a=[]},y=function(t,n){return l(t.a,function(t){return t[0]===n})};d.prototype={get:function(t){var n=y(this,t);if(n)return n[1]},has:function(t){return!!y(this,t)},set:function(t,n){var r=y(this,t);r?r[1]=n:this.a.push([t,n])},delete:function(t){var n=h(this.a,function(n){return n[0]===t});return~n&&this.a.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,r,o){var a=t(function(t,e){c(t,a,n,"_i"),t._i=v++,t._l=void 0,void 0!=e&&f(e,r,t[o],t)}
vendor: 4,224 bytes, line 602
602);return e(a.prototype,{delete:function(t){if(!u(t))return!1;var n=i(t);return!0===n?p(this).delete(t):n&&s(n,this._i)&&delete n[this._i]},has:function(t){if(!u(t))return!1;var n=i(t);return!0===n?p(this).has(t):n&&s(n,this._i)}}),a},def:function(t,n,r){var e=i(o(n),!0);return!0===e?p(t).set(n,r):e[t._i]=r,t},ufstore:p}},function(t,n,r){t.exports=!r(10)&&!r(4)(function(){return 7!=Object.defineProperty(r(132)("div"),"a",{get:function(){return 7}}).a})},function(t,n,r){var e=r(6),i=Math.floor;t.exports=function(t){return!e(t)&&isFinite(t)&&i(t)===t}},function(t,n,r){var e=r(2);t.exports=function(t,n,r,i){try{return i?n(e(r)[0],r[1]):n(r)}catch(n){var o=t.return;throw void 0!==o&&e(o.call(t)),n}}},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n){t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,n,r){"use strict";var e=r(72),i=r(125),o=r(116),u=r(17),c=r(115),f=Object.assign;t.exports=!f||r(4)(function(){var t={},n={},r=Symbol(),e="abcdefghijklmnopqrst";return t[r]=7,e.split("").forEach(function(t){n[t]=t}),7!=f({},t)[r]||Object.keys(f({},n)).join("")!=e})?function(t,n){for(var r=u(t),f=arguments.length,a=1,s=i.f,l=o.f;f>a;)for(var h,v=c(arguments[a++]),p=s?e(v).concat(s(v)):e(v),d=p.length,y=0;d>y;)l.call(v,h=p[y++])&&(r[h]=v[h]);return r}:f},function(t,n,r){var e=r(11),i=r(2),o=r(72);t.exports=r(10)?Object.defineProperties:function(t,n){i(t);for(var r,u=o(n),c=u.length,f=0;c>f;)e.f(t,r=u[f++],n[r]);return t}},function(t,n,r){var e=r(30),i=r(71).f,o={}.toString,u="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],c=function(t){try{return i(t)}catch(t){return u.slice()}};t.exports.f=function(t){return u&&"[object Window]"==o.call(t)?c(t):i(e(t))}},function(t,n,r){var e=r(24),i=r(30),o=r(117)(!1),u=r(145)("IE_PROTO");t.exports=function(t,n){var r,c=i(t),f=0,a=[];for(r in c)r!=u&&e(c,r)&&a.push(r);for(;n.length>f;)e(c,r=n[f++])&&(~o(a,r)||a.push(r));return a}},function(t,n,r){var e=r(72),i=r(30),o=r(116).f;t.exports=function(t){return function(n){for(var r,u=i(n),c=e(u),f=c.length,a=0,s=[];f>a;)o.call(u,r=c[a++])&&s.push(t?[r,u[r]]:u[r]);return s}}},function(t,n,r){var e=r(71),i=r(125),o=r(2),u=r(3).Reflect;t.exports=u&&u.ownKeys||function(t){var n=e.f(o(t)),r=i.f;return r?n.concat(r(t)):n}},function(t,n,r){var e=r(3).parseFloat,i=r(82).trim;t.exports=1/e(r(150)+"-0")!=-1/0?function(t){var n=i(String(t),3),r=e(n);return 0===r&&"-"==n.charAt(0)?-0:r}:e},function(t,n,r){var e=r(3).parseInt,i=r(82).trim,o=r(150),u=/^[\-+]?0[xX]/;t.exports=8!==e(o+"08")||22!==e(o+"0x16")?function(t,n){var r=i(String(t),3);return e(r,n>>>0||(u.test(r)?16:10))}:e},function(t,n){t.exports=Object.is||function(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,r){var e=r(16),i=r(149),o=r(46);t.exports=function(t,n,r,u){var c=String(o(t)),f=c.length,a=void 0===r?" ":String(r),s=e(n);if(s<=f||""==a)return c;var l=s-f,h=i.call(a,Math.ceil(l/a.length));return h.length>l&&(h=h.slice(0,l)),u?h+c:c+h}},function(t,n,r){n.f=r(7)},function(t,n,r){"use strict";var e=r(164);t.exports=r(118)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var n=e.getEntry(this,t);return n&&n.v},set:function(t,n){return e.def(this,0===t?0:t,n)}},e,!0)},function(t,n,r){r(10)&&"g"!=/./g.flags&&r(11).f(RegExp.prototype,"flags",{configurable:!0,get:r(120)})},function(t,n,r){"use strict";var e=r(164);t.exports=r(118)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return e.def(this,t=0===t?0:t,t)}},e)},function(t,n,r){"use strict";var e,i=r(48)(0),o=r(28),u=r(65),c=r(172),f=r(166),a=r(6),s=u.getWeak,l=Object.isExtensible,h=f.ufstore,v={},p=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},d={get:function(t){if(a(t)){var n=s(t);return!0===n?h(this).get(t):n?n[this._i]:void 0}},set:function(t,n){return f.def(this,t,n)}},y=t.exports=r(118)("WeakMap",p,d,f,!0,!0);7!=(new y).set((Object.freeze||Object)(v),7).get(v)&&(e=f.getConstructor(p),c(e.prototype,d),u.NEED=!0,i(["delete","has","get","set"],function(t){var n=y.prototype,r=n[t];
602o(n,t,function(n,i){if(a(n)&&!l(n)){this._f||(this._f=new e);var o=this._f[t](n,i);return"set"==t?this:o}return r.call(this,n,i)})}))},,,,function(t,n){"use strict";function r(){var t=document.querySelector("#page-nav");if(t&&!document.querySelector("#page-nav .extend.prev")&&(t.innerHTML='<a class="extend prev disabled" rel="prev">« Prev</a>'+t.innerHTML),t&&!document.querySelector("#page-nav .extend.next")&&(t.innerHTML=t.innerHTML+'<a class="extend next disabled" rel="next">Next »</a>'),yiliaConfig&&yiliaConfig.open_in_new){document.querySelectorAll(".article-entry a:not(.article-more-a)").forEach(function(t){var n=t.getAttribute("target");n&&""!==n||t.setAttribute("target","_blank")})}if(yiliaConfig&&yiliaConfig.toc_hide_index){document.querySelectorAll(".toc-number").forEach(function(t){t.style.display="none"})}var n=document.querySelector("#js-aboutme");n&&0!==n.length&&(n.innerHTML=n.innerText)}t.exports={init:r}},function(t,n,r){"use strict";function e(t){return t&&t.__esModule?t:{default:t}}function i(t,n){var r=/\/|index.html/g;return t.replace(r,"")===n.replace(r,"")}function o(){for(var t=document.querySelectorAll(".js-header-menu li a"),n=window.location.pathname,r=0,e=t.length;r<e;r++){var o=t[r];i(n,o.getAttribute("href"))&&(0,h.default)(o,"active")}}function u(t){for(var n=t.offsetLeft,r=t.offsetParent;null!==r;)n+=r.offsetLeft,r=r.offsetParent;return n}function c(t){for(var n=t.offsetTop,r=t.offsetParent;null!==r;)n+=r.offsetTop,r=r.offsetParent;return n}function f(t,n,r,e,i){var o=u(t),f=c(t)-n;if(f-r<=i){var a=t.$newDom;a||(a=t.cloneNode(!0),(0,d.default)(t,a),t.$newDom=a,a.style.position="fixed",a.style.top=(r||f)+"px",a.style.left=o+"px",a.style.zIndex=e||2,a.style.width="100%",a.style.color="#fff"),a.style.visibility="visible",t.style.visibility="hidden"}else{t.style.visibility="visible";var s=t.$newDom;s&&(s.style.visibility="hidden")}}function a(){var t=document.querySelector(".js-overlay"),n=document.querySelector(".js-header-menu");f(t,document.body.scrollTop,-63,2,0),f(n,document.body.scrollTop,1,3,0)}function s(){document.querySelector("#container").addEventListener("scroll",function(t){a()}),window.addEventListener("scroll",function(t){a()}),a()}var l=r(156),h=e(l),v=r(157),p=(e(v),r(382)),d=e(p),y=r(128),g=e(y),b=r(190),m=e(b),x=r(129);(function(){g.default.versions.mobile&&window.screen.width<800&&(o(),s())})(),(0,x.addLoadEvent)(function(){m.default.init()}),t.exports={}},,,,function(t,n,r){(function(t){"use strict";function n(t,n,r){t[n]||Object[e](t,n,{writable:!0,configurable:!0,value:r})}if(r(381),r(391),r(198),t._babelPolyfill)throw new Error("only one instance of babel-polyfill is allowed");t._babelPolyfill=!0;var e="defineProperty";n(String.prototype,"padLeft","".padStart),n(String.prototype,"padRight","".padEnd),"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach(function(t){[][t]&&n(Array,t,Function.call.bind([][t]))})}).call(n,function(){return this}())},,,function(t,n,r){r(210),t.exports=r(52).RegExp.escape},,,,function(t,n,r){var e=r(6),i=r(138),o=r(7)("species");t.exports=function(t){var n;return i(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!i(n.prototype)||(n=void 0),e(n)&&null===(n=n[o])&&(n=void 0)),void 0===n?Array:n}},function(t,n,r){var e=r(202);t.exports=function(t,n){return new(e(t))(n)}},function(t,n,r){"use strict";var e=r(2),i=r(50),o="number";t.exports=function(t){if("string"!==t&&t!==o&&"default"!==t)throw TypeError("Incorrect hint");return i(e(this),t!=o)}},function(t,n,r){var e=r(72),i=r(125),o=r(116);t.exports=function(t){var n=e(t),r=i.f;if(r)for(var u,c=r(t),f=o.f,a=0;c.length>a;)f.call(t,u=c[a++])&&n.push(u);return n}},function(t,n,r){var e=r(72),i=r(30);t.exports=function(t,n){for(var r,o=i(t),u=e(o),c=u.length,f=0;c>f;)if(o[r=u[f++]]===n)return r}},function(t,n,r){"use strict";var e=r(208),i=r(121),o=r(26);t.exports=function(){for(var t=o(this),n=arguments.length,r=Array(n),u=0,c=e._,f=!1;n>u;)(r[u]=arguments[u++])===c&&(f=!0);return function(){var e,o=this,u=arguments.length,a=0,s=0;if(!f&&!u)return i(t,r,o);if(e=r.slice(),f)for(;n>a;a++)e[a]===c&&(e[a]=arguments[s++]);for(;u>s;)e.push(arguments[s++]);return i(t,e,o)}}},function(t,n,r){t.exports=r(3)},function(t,n){t.exports=function(t,n){var r=n===Object(n)?function(t){return n[t]}:n;return function(n){return String(n).replace(t,r)}}},function(t,n,r){var e=r(1),i=r(209)(/[\\^$*+?.()|[\]{}]/g,"\\$&");e(e.S,"RegExp",{escape:function(t){return i(t)}})},function(t,n,r){var e=r(1);e(e.P,"Array",{copyWithin:r(160)}),r(78)("copyWithin")},function(t,n,r){"use strict";var e=r(1),i=r(48)(4);e(e.P+e.F*!r(47)([].every,!0),"Array",{every:function(t){return i(this,t,arguments[1])}})},function(t,n,r){var e=r(1);e(e.P,"Array",{fill:r(130)}),r(78)("fill")},function(t,n,r){"use strict";var e=r(1),i=r(48)(2);e(e.P+e.F*!r(47)([].filter,!0),"Array",{filter:function(t){return i(this,t,arguments[1])}})},function(t,n,r){"use strict";var e=r(1),i=r(48)(6),o="findIndex",u=!0;o in[]&&Array(1)[o](function(){u=!1}),e(e.P+e.F*u,"Array",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),r(78)(o)},function(t,n,r){"use strict";var e=r(1),i=r(48)(5),o="find",u=!0;o in[]&&Array(1)[o](function(){u=!1}),e(e.P+e.F*u,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),r(78)(o)},function(t,n,r){"use strict";var e=r(1),i=r(48)(0),o=r(47)([].forEach,!0);
602e(e.P+e.F*!o,"Array",{forEach:function(t){return i(this,t,arguments[1])}})},function(t,n,r){"use strict";var e=r(53),i=r(1),o=r(17),u=r(169),c=r(137),f=r(16),a=r(131),s=r(154);i(i.S+i.F*!r(123)(function(t){Array.from(t)}),"Array",{from:function(t){var n,r,i,l,h=o(t),v="function"==typeof this?this:Array,p=arguments.length,d=p>1?arguments[1]:void 0,y=void 0!==d,g=0,b=s(h);if(y&&(d=e(d,p>2?arguments[2]:void 0,2)),void 0==b||v==Array&&c(b))for(n=f(h.length),r=new v(n);n>g;g++)a(r,g,y?d(h[g],g):h[g]);else for(l=b.call(h),r=new v;!(i=l.next()).done;g++)a(r,g,y?u(l,d,[i.value,g],!0):i.value);return r.length=g,r}})},function(t,n,r){"use strict";var e=r(1),i=r(117)(!1),o=[].indexOf,u=!!o&&1/[1].indexOf(1,-0)<0;e(e.P+e.F*(u||!r(47)(o)),"Array",{indexOf:function(t){return u?o.apply(this,arguments)||0:i(this,t,arguments[1])}})},function(t,n,r){var e=r(1);e(e.S,"Array",{isArray:r(138)})},function(t,n,r){"use strict";var e=r(1),i=r(30),o=[].join;e(e.P+e.F*(r(115)!=Object||!r(47)(o)),"Array",{join:function(t){return o.call(i(this),void 0===t?",":t)}})},function(t,n,r){"use strict";var e=r(1),i=r(30),o=r(67),u=r(16),c=[].lastIndexOf,f=!!c&&1/[1].lastIndexOf(1,-0)<0;e(e.P+e.F*(f||!r(47)(c)),"Array",{lastIndexOf:function(t){if(f)return c.apply(this,arguments)||0;var n=i(this),r=u(n.length),e=r-1;for(arguments.length>1&&(e=Math.min(e,o(arguments[1]))),e<0&&(e=r+e);e>=0;e--)if(e in n&&n[e]===t)return e||0;return-1}})},function(t,n,r){"use strict";var e=r(1),i=r(48)(1);e(e.P+e.F*!r(47)([].map,!0),"Array",{map:function(t){return i(this,t,arguments[1])}})},function(t,n,r){"use strict";var e=r(1),i=r(131);e(e.S+e.F*r(4)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,n=arguments.length,r=new("function"==typeof this?this:Array)(n);n>t;)i(r,t,arguments[t++]);return r.length=n,r}})},function(t,n,r){"use strict";var e=r(1),i=r(162);e(e.P+e.F*!r(47)([].reduceRight,!0),"Array",{reduceRight:function(t){return i(this,t,arguments.length,arguments[1],!0)}})},function(t,n,r){"use strict";var e=r(1),i=r(162);e(e.P+e.F*!r(47)([].reduce,!0),"Array",{reduce:function(t){return i(this,t,arguments.length,arguments[1],!1)}})},function(t,n,r){"use strict";var e=r(1),i=r(135),o=r(45),u=r(75),c=r(16),f=[].slice;e(e.P+e.F*r(4)(function(){i&&f.call(i)}),"Array",{slice:function(t,n){var r=c(this.length),e=o(this);if(n=void 0===n?r:n,"Array"==e)return f.call(this,t,n);for(var i=u(t,r),a=u(n,r),s=c(a-i),l=Array(s),h=0;h<s;h++)l[h]="String"==e?this.charAt(i+h):this[i+h];return l}})},function(t,n,r){"use strict";var e=r(1),i=r(48)(3);e(e.P+e.F*!r(47)([].some,!0),"Array",{some:function(t){return i(this,t,arguments[1])}})},function(t,n,r){"use strict";var e=r(1),i=r(26),o=r(17),u=r(4),c=[].sort,f=[1,2,3];e(e.P+e.F*(u(function(){f.sort(void 0)})||!u(function(){f.sort(null)})||!r(47)(c)),"Array",{sort:function(t){return void 0===t?c.call(o(this)):c.call(o(this),i(t))}})},function(t,n,r){r(74)("Array")},function(t,n,r){var e=r(1);e(e.S,"Date",{now:function(){return(new Date).getTime()}})},function(t,n,r){"use strict";var e=r(1),i=r(4),o=Date.prototype.getTime,u=function(t){return t>9?t:"0"+t};e(e.P+e.F*(i(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!i(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){ 603if(!isFinite(o.call(this)))throw RangeError("Invalid time value");var t=this,n=t.getUTCFullYear(),r=t.getUTCMilliseconds(),e=n<0?"-":n>9999?"+":"";return e+("00000"+Math.abs(n)).slice(e?-6:-4)+"-"+u(t.getUTCMonth()+1)+"-"+u(t.getUTCDate())+"T"+u(t.getUTCHours())+":"+u(t.getUTCMinutes())+":"+u(t.getUTCSeconds())+"."+(r>99?r:"0"+u(r))+"Z"}})},function(t,n,r){"use strict";var e=r(1),i=r(17),o=r(50);e(e.P+e.F*r(4)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(t){var n=i(this),r=o(n);return"number"!=typeof r||isFinite(r)?n.toISOString():null}})},function(t,n,r){var e=r(7)("toPrimitive"),i=Date.prototype;e in i||r(27)(i,e,r(204))},function(t,n,r){var e=Date.prototype,i="Invalid Date",o="toString",u=e[o],c=e.getTime;new Date(NaN)+""!=i&&r(28)(e,o,function(){var t=c.call(this);return t===t?u.call(this):i})},function(t,n,r){var e=r(1);e(e.P,"Function",{bind:r(163)})},function(t,n,r){"use strict";var e=r(6),i=r(32),o=r(7)("hasInstance"),u=Function.prototype;o in u||r(11).f(u,o,{value:function(t){if("function"!=typeof this||!e(t))return!1;if(!e(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},function(t,n,r){var e=r(11).f,i=r(66),o=r(24),u=Function.prototype,c="name",f=Object.isExtensible||function(){return!0};c in u||r(10)&&e(u,c,{configurable:!0,get:function(){try{var t=this,n=(""+t).match(/^\s*function ([^ (]*)/)[1];return o(t,c)||!f(t)||e(t,c,i(5,n)),n}catch(t){return""}}})},function(t,n,r){var e=r(1),i=r(171),o=Math.sqrt,u=Math.acosh;e(e.S+e.F*!(u&&710==Math.floor(u(Number.MAX_VALUE))&&u(1/0)==1/0),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+o(t-1)*o(t+1))}})},function(t,n,r){function e(t){return isFinite(t=+t)&&0!=t?t<0?-e(-t):Math.log(t+Math.sqrt(t*t+1)):t}var i=r(1),o=Math.asinh;i(i.S+i.F*!(o&&1/o(0)>0),"Math",{asinh:e})},function(t,n,r){var e=r(1),i=Math.atanh;e(e.S+e.F*!(i&&1/i(-0)<0),"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,n,r){var e=r(1),i=r(142);e(e.S,"Math",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,n,r){var e=r(1);e(e.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,n,r){var e=r(1),i=Math.exp;e(e.S,"Math",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},function(t,n,r){var e=r(1),i=r(141);e(e.S+e.F*(i!=Math.expm1),"Math",{expm1:i})},function(t,n,r){var e=r(1),i=r(142),o=Math.pow,u=o(2,-52),c=o(2,-23),f=o(2,127)*(2-c),a=o(2,-126),s=function(t){return t+1/u-1/u};e(e.S,"Math",{fround:function(t){var n,r,e=Math.abs(t),o=i(t);return e<a?o*s(e/a/c)*a*c:(n=(1+c/u)*e,r=n-(n-e),r>f||r!=r?o*(1/0):o*r)}})},function(t,n,r){var e=r(1),i=Math.abs;e(e.S,"Math",{hypot:function(t,n){for(var r,e,o=0,u=0,c=arguments.length,f=0;u<c;)r=i(arguments[u++]),f<r?(e=f/r,o=o*e*e+1,f=r):r>0?(e=r/f,o+=e*e):o+=r;return f===1/0?1/0:f*Math.sqrt(o)}})},function(t,n,r){var e=r(1),i=Math.imul;e(e.S+e.F*r(4)(function(){return-5!=i(4294967295,5)||2!=i.length}),"Math",{imul:function(t,n){var r=65535,e=+t,i=+n,o=r&e,u=r&i;return 0|o*u+((r&e>>>16)*u+o*(r&i>>>16)<<16>>>0)}})},function(t,n,r){var e=r(1);e(e.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},function(t,n,r){var e=r(1);e(e.S,"Math",{log1p:r(171)})},function(t,n,r){var e=r(1);e(e.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},function(t,n,r){var e=r(1);e(e.S,"Math",{sign:r(142)})},function(t,n,r){var e=r(1),i=r(141),o=Math.exp;e(e.S+e.F*r(4)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(o(t-1)-o(-t-1))*(Math.E/2)}})},function(t,n,r){var e=r(1),i=r(141),o=Math.exp;e(e.S,"Math",{tanh:function(t){var n=i(t=+t),r=i(-t);return n==1/0?1:r==1/0?-1:(n-r)/(o(t)+o(-t))}})},function(t,n,r){var e=r(1);e(e.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,n,r){"use strict";var e=r(3),i=r(24),o=r(45),u=r(136),c=r(50),f=r(4),a=r(71).f,s=r(31).f,l=r(11).f,h=r(82).trim,v="Number",p=e[v],d=p,y=p.prototype,g=o(r(70)(y))==v,b="trim"in String.prototype,m=function(t){var n=c(t,!1);if("string"==typeof n&&n.length>2){n=b?n.trim():h(n,3);var r,e,i,o=n.charCodeAt(0);if(43===o||45===o){if(88===(r=n.charCodeAt(2))||120===r)return NaN}else if(48===o){switch(n.charCodeAt(1)){case 66:case 98:e=2,i=49;break;case 79:case 111:e=8,i=55;break;default:return+n}for(var u,f=n.slice(2),a=0,s=f.length;a<s;a++)if((u=f.charCodeAt(a))<48||u>i)return NaN;return parseInt(f,e)}}return+n};if(!p(" 0o1")||!p("0b1")||p("+0x1")){p=function(t){var n=arguments.length<1?0:t,r=this;return r instanceof p&&(g?f(function(){y.valueOf.call(r)}):o(r)!=v)?u(new d(m(n)),r,p):m(n)};for(var x,w=r(10)?a(d):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),S=0;w.length>S;S++)i(d,x=w[S])&&!i(p,x)&&l(p,x,s(d,x));p.prototype=y,y.constructor=p,r(28)(e,v,p)}},function(t,n,r){var e=r(1);e(e.S,"Number",{EPSILON:Math.pow(2,-52)})},function(t,n,r){var e=r(1),i=r(3).isFinite;e(e.S,"Number",{isFinite:function(t){return"number"==typeof t&&i(t)}})},function(t,n,r){var e=r(1);e(e.S,"Number",{isInteger:r(168)})},function(t,n,r){var e=r(1);e(e.S,"Number",{isNaN:function(t){return t!=t}})},function(t,n,r){var e=r(1),i=r(168),o=Math.abs;e(e.S,"Number",{isSafeInteger:function(t){return i(t)&&o(t)<=9007199254740991}})},function(t,n,r){var e=r(1);e(e.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,r){var e=r(1);e(e.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,r){var e=r(1),i=r(178);e(e.S+e.F*(Number.parseFloat!=i),"Number",{parseFloat:i})},function(t,n,r){var e=r(1),i=r(179);
603e(e.S+e.F*(Number.parseInt!=i),"Number",{parseInt:i})},function(t,n,r){"use strict";var e=r(1),i=r(67),o=r(159),u=r(149),c=1..toFixed,f=Math.floor,a=[0,0,0,0,0,0],s="Number.toFixed: incorrect invocation!",l="0",h=function(t,n){for(var r=-1,e=n;++r<6;)e+=t*a[r],a[r]=e%1e7,e=f(e/1e7)},v=function(t){for(var n=6,r=0;--n>=0;)r+=a[n],a[n]=f(r/t),r=r%t*1e7},p=function(){for(var t=6,n="";--t>=0;)if(""!==n||0===t||0!==a[t]){var r=String(a[t]);n=""===n?r:n+u.call(l,7-r.length)+r}return n},d=function(t,n,r){return 0===n?r:n%2==1?d(t,n-1,r*t):d(t*t,n/2,r)},y=function(t){for(var n=0,r=t;r>=4096;)n+=12,r/=4096;for(;r>=2;)n+=1,r/=2;return n};e(e.P+e.F*(!!c&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!r(4)(function(){c.call({})})),"Number",{toFixed:function(t){var n,r,e,c,f=o(this,s),a=i(t),g="",b=l;if(a<0||a>20)throw RangeError(s);if(f!=f)return"NaN";if(f<=-1e21||f>=1e21)return String(f);if(f<0&&(g="-",f=-f),f>1e-21)if(n=y(f*d(2,69,1))-69,r=n<0?f*d(2,-n,1):f/d(2,n,1),r*=4503599627370496,(n=52-n)>0){for(h(0,r),e=a;e>=7;)h(1e7,0),e-=7;for(h(d(10,e,1),0),e=n-1;e>=23;)v(1<<23),e-=23;v(1<<e),h(1,1),v(2),b=p()}else h(0,r),h(1<<-n,0),b=p()+u.call(l,a);return a>0?(c=b.length,b=g+(c<=a?"0."+u.call(l,a-c)+b:b.slice(0,c-a)+"."+b.slice(c-a))):b=g+b,b}})},function(t,n,r){"use strict";var e=r(1),i=r(4),o=r(159),u=1..toPrecision;e(e.P+e.F*(i(function(){return"1"!==u.call(1,void 0)})||!i(function(){u.call({})})),"Number",{toPrecision:function(t){var n=o(this,"Number#toPrecision: incorrect invocation!");return void 0===t?u.call(n):u.call(n,t)}})},function(t,n,r){var e=r(1);e(e.S+e.F,"Object",{assign:r(172)})},function(t,n,r){var e=r(1);e(e.S,"Object",{create:r(70)})},function(t,n,r){var e=r(1);e(e.S+e.F*!r(10),"Object",{defineProperties:r(173)})},function(t,n,r){var e=r(1);e(e.S+e.F*!r(10),"Object",{defineProperty:r(11).f})},function(t,n,r){var e=r(6),i=r(65).onFreeze;r(49)("freeze",function(t){return function(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(30),i=r(31).f;r(49)("getOwnPropertyDescriptor",function(){return function(t,n){return i(e(t),n)}})},function(t,n,r){r(49)("getOwnPropertyNames",function(){return r(174).f})},function(t,n,r){var e=r(17),i=r(32);r(49)("getPrototypeOf",function(){return function(t){return i(e(t))}})},function(t,n,r){var e=r(6);r(49)("isExtensible",function(t){return function(n){return!!e(n)&&(!t||t(n))}})},function(t,n,r){var e=r(6);r(49)("isFrozen",function(t){return function(n){return!e(n)||!!t&&t(n)}})},function(t,n,r){var e=r(6);r(49)("isSealed",function(t){return function(n){return!e(n)||!!t&&t(n)}})},function(t,n,r){var e=r(1);e(e.S,"Object",{is:r(180)})},function(t,n,r){var e=r(17),i=r(72);r(49)("keys",function(){return function(t){return i(e(t))}})},function(t,n,r){var e=r(6),i=r(65).onFreeze;r(49)("preventExtensions",function(t){return function(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(6),i=r(65).onFreeze;r(49)("seal",function(t){return function(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(1);e(e.S,"Object",{setPrototypeOf:r(144).set})},function(t,n,r){"use strict";var e=r(114),i={};i[r(7)("toStringTag")]="z",i+""!="[object z]"&&r(28)(Object.prototype,"toString",function(){return"[object "+e(this)+"]"},!0)},function(t,n,r){var e=r(1),i=r(178);e(e.G+e.F*(parseFloat!=i),{parseFloat:i})},function(t,n,r){var e=r(1),i=r(179);e(e.G+e.F*(parseInt!=i),{parseInt:i})},function(t,n,r){"use strict";var e,i,o,u=r(69),c=r(3),f=r(53),a=r(114),s=r(1),l=r(6),h=r(26),v=r(68),p=r(79),d=r(146),y=r(151).set,g=r(143)(),b="Promise",m=c.TypeError,x=c.process,w=c[b],x=c.process,S="process"==a(x),_=function(){},O=!!function(){try{var t=w.resolve(1),n=(t.constructor={})[r(7)("species")]=function(t){t(_,_)};return(S||"function"==typeof PromiseRejectionEvent)&&t.then(_)instanceof n}catch(t){}}(),E=function(t,n){return t===n||t===w&&n===o},P=function(t){var n;return!(!l(t)||"function"!=typeof(n=t.then))&&n},j=function(t){return E(w,t)?new F(t):new i(t)},F=i=function(t){var n,r;this.promise=new t(function(t,e){if(void 0!==n||void 0!==r)throw m("Bad Promise constructor");n=t,r=e}),this.resolve=h(n),this.reject=h(r)},M=function(t){try{t()}catch(t){return{error:t}}},A=function(t,n){if(!t._n){t._n=!0;var r=t._c;g(function(){for(var e=t._v,i=1==t._s,o=0;r.length>
603o;)!function(n){var r,o,u=i?n.ok:n.fail,c=n.resolve,f=n.reject,a=n.domain;try{u?(i||(2==t._h&&I(t),t._h=1),!0===u?r=e:(a&&a.enter(),r=u(e),a&&a.exit()),r===n.promise?f(m("Promise-chain cycle")):(o=P(r))?o.call(r,c,f):c(r)):f(e)}catch(t){f(t)}}(r[o++]);t._c=[],t._n=!1,n&&!t._h&&N(t)})}},N=function(t){y.call(c,function(){var n,r,e,i=t._v;if(T(t)&&(n=M(function(){S?x.emit("unhandledRejection",i,t):(r=c.onunhandledrejection)?r({promise:t,reason:i}):(e=c.console)&&e.error&&e.error("Unhandled promise rejection",i)}),t._h=S||T(t)?2:1),t._a=void 0,n)throw n.error})},T=function(t){if(1==t._h)return!1;for(var n,r=t._a||t._c,e=0;r.length>e;)if(n=r[e++],n.fail||!T(n.promise))return!1;return!0},I=function(t){y.call(c,function(){var n;S?x.emit("rejectionHandled",t):(n=c.onrejectionhandled)&&n({promise:t,reason:t._v})})},k=function(t){var n=this;n._d||(n._d=!0,n=n._w||n,n._v=t,n._s=2,n._a||(n._a=n._c.slice()),A(n,!0))},L=function(t){var n,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===t)throw m("Promise can't be resolved itself");(n=P(t))?g(function(){var e={_w:r,_d:!1};try{n.call(t,f(L,e,1),f(k,e,1))}catch(t){k.call(e,t)}}):(r._v=t,r._s=1,A(r,!1))}catch(t){k.call({_w:r,_d:!1},t)}}};O||(w=function(t){v(this,w,b,"_h"),h(t),e.call(this);try{t(f(L,this,1),f(k,this,1))}catch(t){k.call(this,t)}},e=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},e.prototype=r(73)(w.prototype,{then:function(t,n){var r=j(d(this,w));return r.ok="function"!=typeof t||t,r.fail="function"==typeof n&&n,r.domain=S?x.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&A(this,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),F=function(){var t=new e;this.promise=t,this.resolve=f(L,t,1),this.reject=f(k,t,1)}),s(s.G+s.W+s.F*!O,{Promise:w}),r(81)(w,b),r(74)(b),o=r(52)[b],s(s.S+s.F*!O,b,{reject:function(t){var n=j(this);return(0,n.reject)(t),n.promise}}),s(s.S+s.F*(u||!O),b,{resolve:function(t){if(t instanceof w&&E(t.constructor,this))return t;var n=j(this);return(0,n.resolve)(t),n.promise}}),s(s.S+s.F*!(O&&r(123)(function(t){w.all(t).catch(_)})),b,{all:function(t){var n=this,r=j(n),e=r.resolve,i=r.reject,o=M(function(){var r=[],o=0,u=1;p(t,!1,function(t){var c=o++,f=!1;r.push(void 0),u++,n.resolve(t).then(function(t){f||(f=!0,r[c]=t,--u||e(r))},i)}),--u||e(r)});return o&&i(o.error),r.promise},race:function(t){var n=this,r=j(n),e=r.reject,i=M(function(){p(t,!1,function(t){n.resolve(t).then(r.resolve,e)})});return i&&e(i.error),r.promise}})},function(t,n,r){var e=r(1),i=r(26),o=r(2),u=(r(3).Reflect||{}).apply,c=Function.apply;e(e.S+e.F*!r(4)(function(){u(function(){})}),"Reflect",{apply:function(t,n,r){var e=i(t),f=o(r);return u?u(e,n,f):c.call(e,n,f)}})},function(t,n,r){var e=r(1),i=r(70),o=r(26),u=r(2),c=r(6),f=r(4),a=r(163),s=(r(3).Reflect||{}).construct,l=f(function(){function t(){}return!(s(function(){},[],t)instanceof t)}),h=!f(function(){s(function(){})});e(e.S+e.F*(l||h),"Reflect",{construct:function(t,n){o(t),u(n);var r=arguments.length<3?t:o(arguments[2]);if(h&&!l)return s(t,n,r);if(t==r){switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3])}var e=[null];return e.push.apply(e,n),new(a.apply(t,e))}var f=r.prototype,v=i(c(f)?f:Object.prototype),p=Function.apply.call(t,v,n);return c(p)?p:v}})},function(t,n,r){var e=r(11),i=r(1),o=r(2),u=r(50);i(i.S+i.F*r(4)(function(){Reflect.defineProperty(e.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,n,r){o(t),n=u(n,!0),o(r);try{return e.f(t,n,r),!0}catch(t){return!1}}})},function(t,n,r){var e=r(1),i=r(31).f,o=r(2);e(e.S,"Reflect",{deleteProperty:function(t,n){var r=i(o(t),n);return!(r&&!r.configurable)&&delete t[n]}})},function(t,n,r){"use strict";var e=r(1),i=r(2),o=function(t){this._t=i(t),this._i=0;var n,r=this._k=[];for(n in t)r.push(n)};r(139)(o,"Object",function(){var t,n=this,r=n._k;do{if(n._i>=r.length)return{value:void 0,done:!0}}while(!((t=r[n._i++])in n._t));return{value:t,done:!1}}),e(e.S,"Reflect",{enumerate:function(t){return new o(t)}})},function(t,n,r){var e=r(31),i=r(1),o=r(2);i(i.S,"Reflect",{getOwnPropertyDescriptor:function(t,n){return e.f(o(t),n)}})},function(t,n,r){var e=r(1),i=r(32),o=r(2);e(e.S,"Reflect",{getPrototypeOf:function(t){return i(o(t))}})},function(t,n,r){function e(t,n){var r,c,s=arguments.length<3?t:arguments[2];return a(t)===s?t[n]:(r=i.f(t,n))?u(r,"value")?r.value:void 0!==r.get?r.get.call(s):void 0:f(c=o(t))?e(c,n,s):void 0}var i=r(31),o=r(32),u=r(24),c=r(1),f=r(6),a=r(2);c(c.S,"Reflect",{get:e})},function(t,n,r){var e=r(1);e(e.S,"Reflect",{has:function(t,n){return n in t}})},function(t,n,r){var e=r(1),i=r(2),o=Object.isExtensible;e(e.S,"Reflect",{isExtensible:function(t){return i(t),!o||o(t)}})},function(t,n,r){var e=r(1);e(e.S,"Reflect",{ownKeys:r(177)})},function(t,n,r){var e=r(1),i=r(2),o=Object.preventExtensions;e(e.S,"Reflect",{preventExtensions:function(t){i(t);try{return o&&o(t),!0}catch(t){return!1}}})},function(t,n,r){var e=r(1),i=r(144);i&&e(e.S,"Reflect",{setPrototypeOf:function(t,n){i.check(t,n);try{return i.set(t,n),!0}catch(t){return!1}}})},function(t,n,r){function e(t,n,r){var f,h,v=arguments.length<4?t:
603arguments[3],p=o.f(s(t),n);if(!p){if(l(h=u(t)))return e(h,n,r,v);p=a(0)}return c(p,"value")?!(!1===p.writable||!l(v)||(f=o.f(v,n)||a(0),f.value=r,i.f(v,n,f),0)):void 0!==p.set&&(p.set.call(v,r),!0)}var i=r(11),o=r(31),u=r(32),c=r(24),f=r(1),a=r(66),s=r(2),l=r(6);f(f.S,"Reflect",{set:e})},function(t,n,r){var e=r(3),i=r(136),o=r(11).f,u=r(71).f,c=r(122),f=r(120),a=e.RegExp,s=a,l=a.prototype,h=/a/g,v=/a/g,p=new a(h)!==h;if(r(10)&&(!p||r(4)(function(){return v[r(7)("match")]=!1,a(h)!=h||a(v)==v||"/a/i"!=a(h,"i")}))){a=function(t,n){var r=this instanceof a,e=c(t),o=void 0===n;return!r&&e&&t.constructor===a&&o?t:i(p?new s(e&&!o?t.source:t,n):s((e=t instanceof a)?t.source:t,e&&o?f.call(t):n),r?this:l,a)};for(var d=u(s),y=0;d.length>y;)!function(t){t in a||o(a,t,{configurable:!0,get:function(){return s[t]},set:function(n){s[t]=n}})}(d[y++]);l.constructor=a,a.prototype=l,r(28)(e,"RegExp",a)}r(74)("RegExp")},function(t,n,r){r(119)("match",1,function(t,n,r){return[function(r){"use strict";var e=t(this),i=void 0==r?void 0:r[n];return void 0!==i?i.call(r,e):new RegExp(r)[n](String(e))},r]})},function(t,n,r){r(119)("replace",2,function(t,n,r){return[function(e,i){"use strict";var o=t(this),u=void 0==e?void 0:e[n];return void 0!==u?u.call(e,o,i):r.call(String(o),e,i)},r]})},function(t,n,r){r(119)("search",1,function(t,n,r){return[function(r){"use strict";var e=t(this),i=void 0==r?void 0:r[n];return void 0!==i?i.call(r,e):new RegExp(r)[n](String(e))},r]})},function(t,n,r){r(119)("split",2,function(t,n,e){"use strict";var i=r(122),o=e,u=[].push,c="split",f="length",a="lastIndex";if("c"=="abbc"[c](/(b)*/)[1]||4!="test"[c](/(?:)/,-1)[f]||2!="ab"[c](/(?:ab)*/)[f]||4!="."[c](/(.?)(.?)/)[f]||"."[c](/()()/)[f]>1||""[c](/.?/)[f]){var s=void 0===/()??/.exec("")[1];e=function(t,n){var r=String(this);if(void 0===t&&0===n)return[];if(!i(t))return o.call(r,t,n);var e,c,l,h,v,p=[],d=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),y=0,g=void 0===n?4294967295:n>>>0,b=new RegExp(t.source,d+"g");for(s||(e=new RegExp("^"+b.source+"$(?!\\s)",d));(c=b.exec(r))&&!((l=c.index+c[0][f])>y&&(p.push(r.slice(y,c.index)),!s&&c[f]>1&&c[0].replace(e,function(){for(v=1;v<arguments[f]-2;v++)void 0===arguments[v]&&(c[v]=void 0)}),c[f]>1&&c.index<r[f]&&u.apply(p,c.slice(1)),h=c[0][f],y=l,p[f]>=g));)b[a]===c.index&&b[a]++;return y===r[f]?!h&&b.test("")||p.push(""):p.push(r.slice(y)),p[f]>g?p.slice(0,g):p}}else"0"[c](void 0,0)[f]&&(e=function(t,n){return void 0===t&&0===n?[]:o.call(this,t,n)});return[function(r,i){var o=t(this),u=void 0==r?void 0:r[n];return void 0!==u?u.call(r,o,i):e.call(String(o),r,i)},e]})},function(t,n,r){"use strict";r(184);var e=r(2),i=r(120),o=r(10),u="toString",c=/./[u],f=function(t){r(28)(RegExp.prototype,u,t,!0)};r(4)(function(){return"/a/b"!=c.call({source:"a",flags:"b"})})?f(function(){var t=e(this);return"/".concat(t.source,"/","flags"in t?t.flags:!o&&t instanceof RegExp?i.call(t):void 0)}):c.name!=u&&f(function(){return c.call(this)})},function(t,n,r){"use strict";r(29)("anchor",function(t){return function(n){return t(this,"a","name",n)}})},function(t,n,r){"use strict";r(29)("big",function(t){return function(){return t(this,"big","","")}})},function(t,n,r){"use strict";r(29)("blink",function(t){return function(){return t(this,"blink","","")}})},function(t,n,r){"use strict";r(29)("bold",function(t){return function(){return t(this,"b","","")}})},function(t,n,r){"use strict";var e=r(1),i=r(147)(!1);e(e.P,"String",{codePointAt:function(t){return i(this,t)}})},function(t,n,r){"use strict";var e=r(1),i=r(16),o=r(148),u="endsWith",c=""[u];e(e.P+e.F*r(134)(u),"String",{endsWith:function(t){var n=o(this,t,u),r=arguments.length>1?arguments[1]:void 0,e=i(n.length),f=void 0===r?e:Math.min(i(r),e),a=String(t);return c?c.call(n,a,f):n.slice(f-a.length,f)===a}})},function(t,n,r){"use strict";r(29)("fixed",function(t){return function(){return t(this,"tt","","")}})},function(t,n,r){"use strict";r(29)("fontcolor",function(t){return function(n){return t(this,"font","color",n)}})},function(t,n,r){"use strict";r(29)("fontsize",function(t){return function(n){return t(this,"font","size",n)}})},function(t,n,r){var e=r(1),i=r(75),o=String.fromCharCode,u=String.fromCodePoint;e(e.S+e.F*(!!u&&1!=u.length),"String",{fromCodePoint:function(t){for(var n,r=[],e=arguments.length,u=0;e>u;){if(n=+arguments[u++],i(n,1114111)!==n)throw RangeError(n+" is not a valid code point");r.push(n<65536?o(n):o(55296+((n-=65536)>>10),n%1024+56320))}return r.join("")}})},function(t,n,r){"use strict";var e=r(1),i=r(148),o="includes";e(e.P+e.F*r(134)(o),"String",{includes:function(t){return!!~i(this,t,o).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,r){"use strict";r(29)("italics",function(t){return function(){return t(this,"i","","")}})},function(t,n,r){"use strict";var e=r(147)(!0);
vendor: 14,837 bytes, lines 603-604
603r(140)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,n=this._t,r=this._i;return r>=n.length?{value:void 0,done:!0}:(t=e(n,r),this._i+=t.length,{value:t,done:!1})})},function(t,n,r){"use strict";r(29)("link",function(t){return function(n){return t(this,"a","href",n)}})},function(t,n,r){var e=r(1),i=r(30),o=r(16);e(e.S,"String",{raw:function(t){for(var n=i(t.raw),r=o(n.length),e=arguments.length,u=[],c=0;r>c;)u.push(String(n[c++])),c<e&&u.push(String(arguments[c]));return u.join("")}})},function(t,n,r){var e=r(1);e(e.P,"String",{repeat:r(149)})},function(t,n,r){"use strict";r(29)("small",function(t){return function(){return t(this,"small","","")}})},function(t,n,r){"use strict";var e=r(1),i=r(16),o=r(148),u="startsWith",c=""[u];e(e.P+e.F*r(134)(u),"String",{startsWith:function(t){var n=o(this,t,u),r=i(Math.min(arguments.length>1?arguments[1]:void 0,n.length)),e=String(t);return c?c.call(n,e,r):n.slice(r,r+e.length)===e}})},function(t,n,r){"use strict";r(29)("strike",function(t){return function(){return t(this,"strike","","")}})},function(t,n,r){"use strict";r(29)("sub",function(t){return function(){return t(this,"sub","","")}})},function(t,n,r){"use strict";r(29)("sup",function(t){return function(){return t(this,"sup","","")}})},function(t,n,r){"use strict";r(82)("trim",function(t){return function(){return t(this,3)}})},function(t,n,r){"use strict";var e=r(3),i=r(24),o=r(10),u=r(1),c=r(28),f=r(65).KEY,a=r(4),s=r(126),l=r(81),h=r(76),v=r(7),p=r(182),d=r(153),y=r(206),g=r(205),b=r(138),m=r(2),x=r(30),w=r(50),S=r(66),_=r(70),O=r(174),E=r(31),P=r(11),j=r(72),F=E.f,M=P.f,A=O.f,N=e.Symbol,T=e.JSON,I=T&&T.stringify,k="prototype",L=v("_hidden"),R=v("toPrimitive"),C={}.propertyIsEnumerable,D=s("symbol-registry"),U=s("symbols"),W=s("op-symbols"),G=Object[k],B="function"==typeof N,V=e.QObject,z=!V||!V[k]||!V[k].findChild,q=o&&a(function(){return 7!=_(M({},"a",{get:function(){return M(this,"a",{value:7}).a}})).a})?function(t,n,r){var e=F(G,n);e&&delete G[n],M(t,n,r),e&&t!==G&&M(G,n,e)}:M,K=function(t){var n=U[t]=_(N[k]);return n._k=t,n},J=B&&"symbol"==typeof N.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof N},Y=function(t,n,r){return t===G&&Y(W,n,r),m(t),n=w(n,!0),m(r),i(U,n)?(r.enumerable?(i(t,L)&&t[L][n]&&(t[L][n]=!1),r=_(r,{enumerable:S(0,!1)})):(i(t,L)||M(t,L,S(1,{})),t[L][n]=!0),q(t,n,r)):M(t,n,r)},H=function(t,n){m(t);for(var r,e=g(n=x(n)),i=0,o=e.length;o>i;)Y(t,r=e[i++],n[r]);return t},$=function(t,n){return void 0===n?_(t):H(_(t),n)},X=function(t){var n=C.call(this,t=w(t,!0));return!(this===G&&i(U,t)&&!i(W,t))&&(!(n||!i(this,t)||!i(U,t)||i(this,L)&&this[L][t])||n)},Q=function(t,n){if(t=x(t),n=w(n,!0),t!==G||!i(U,n)||i(W,n)){var r=F(t,n);return!r||!i(U,n)||i(t,L)&&t[L][n]||(r.enumerable=!0),r}},Z=function(t){for(var n,r=A(x(t)),e=[],o=0;r.length>o;)i(U,n=r[o++])||n==L||n==f||e.push(n);return e},tt=function(t){for(var n,r=t===G,e=A(r?W:x(t)),o=[],u=0;e.length>u;)!i(U,n=e[u++])||r&&!i(G,n)||o.push(U[n]);return o};B||(N=function(){if(this instanceof N)throw TypeError("Symbol is not a constructor!");var t=h(arguments.length>0?arguments[0]:void 0),n=function(r){this===G&&n.call(W,r),i(this,L)&&i(this[L],t)&&(this[L][t]=!1),q(this,t,S(1,r))};return o&&z&&q(G,t,{configurable:!0,set:n}),K(t)},c(N[k],"toString",function(){return this._k}),E.f=Q,P.f=Y,r(71).f=O.f=Z,r(116).f=X,r(125).f=tt,o&&!r(69)&&c(G,"propertyIsEnumerable",X,!0),p.f=function(t){return K(v(t))}),u(u.G+u.W+u.F*!B,{Symbol:N});for(var nt="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),rt=0;nt.length>rt;)v(nt[rt++]);for(var nt=j(v.store),rt=0;nt.length>rt;)d(nt[rt++]);u(u.S+u.F*!B,"Symbol",{for:function(t){return i(D,t+="")?D[t]:D[t]=N(t)},keyFor:function(t){if(J(t))return y(D,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){z=!0},useSimple:function(){z=!1}}),u(u.S+u.F*!B,"Object",{create:$,defineProperty:Y,defineProperties:H,getOwnPropertyDescriptor:Q,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),T&&u(u.S+u.F*(!B||a(function(){var t=N();return"[null]"!=I([t])||"{}"!=I({a:t})||"{}"!=I(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!J(t)){for(var n,r,e=[t],i=1;arguments.length>i;)e.push(arguments[i++]);return n=e[1],"function"==typeof n&&(r=n),!r&&b(n)||(n=function(t,n){if(r&&(n=r.call(this,t,n)),!J(n))return n}),e[1]=n,I.apply(T,e)}}}),N[k][R]||r(27)(N[k],R,N[k].valueOf),l(N,"Symbol"),l(Math,"Math",!0),l(e.JSON,"JSON",!0)},function(t,n,r){"use strict";var e=r(1),i=r(127),o=r(152),u=r(2),c=r(75),f=r(16),a=r(6),s=r(3).ArrayBuffer,l=r(146),h=o.ArrayBuffer,v=o.DataView,p=i.ABV&&s.isView,d=h.prototype.slice,y=i.VIEW,g="ArrayBuffer";e(e.G+e.W+e.F*(s!==h),{ArrayBuffer:h}),e(e.S+e.F*!i.CONSTR,g,{isView:function(t){return p&&p(t)||a(t)&&y in t}}),e(e.P+e.U+e.F*r(4)(function(){return!new h(2).slice(1,void 0).byteLength}),g,{slice:function(t,n){if(void 0!==d&&void 0===n)return d.call(u(this),t);for(var r=u(this).byteLength,e=c(t,r),i=c(void 0===n?r:n,r),o=new(l(this,h))(f(i-e)),a=new v(this),s=new v(o),p=0;e<i;)s.setUint8(p++,a.getUint8(e++));return o}}),r(74)(g)},function(t,n,r){var e=r(1);e(e.G+e.W+e.F*!r(127).ABV,{DataView:r(152).DataView})},function(t,n,r){r(55)("Float32",4,function(t){return function(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(55)("Float64",8,function(t){return function(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(55)("Int16",2,function(t){return function(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(55)("Int32",4,function(t){return function(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(55)("Int8",1,function(t){return function(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(55)("Uint16",2,function(t){return function(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(55)("Uint32",4,function(t){return function(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(55)("Uint8",1,function(t){return function(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(55)("Uint8",1,function(t){return function(n,r,e){return t(this,n,r,e)}},!0)},function(t,n,r){"use strict";var e=r(166);r(118)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return e.def(this,t,!0)}},e,!1,!0)},function(t,n,r){"use strict";var e=r(1),i=r(117)(!0);e(e.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),r(78)("includes")},function(t,n,r){var e=r(1),i=r(143)(),o=r(3).process,u="process"==r(45)(o);e(e.G,{asap:function(t){var n=u&&o.domain;i(n?n.bind(t):t)}})},function(t,n,r){var e=r(1),i=r(45);e(e.S,"Error",{isError:function(t){return"Error"===i(t)}})},function(t,n,r){var e=r(1);e(e.P+e.R,"Map",{toJSON:r(165)("Map")})},function(t,n,r){var e=r(1);e(e.S,"Math",{iaddh:function(t,n,r,e){var i=t>>>0,o=n>>>0,u=r>>>0;return o+(e>>>0)+((i&u|(i|u)&~(i+u>>>0))>>>31)|0}})},function(t,n,r){var e=r(1);e(e.S,"Math",{imulh:function(t,n){var r=65535,e=+t,i=+n,o=e&r,u=i&r,c=e>>16,f=i>>16,a=(c*u>>>0)+(o*u>>>16);return c*f+(a>>16)+((o*f>>>0)+(a&r)>>16)}})},function(t,n,r){var e=r(1);e(e.S,"Math",{isubh:function(t,n,r,e){var i=t>>>0,o=n>>>0,u=r>>>0;return o-(e>>>0)-((~i&u|~(i^u)&i-u>>>0)>>>31)|0}})},function(t,n,r){var e=r(1);e(e.S,"Math",{umulh:function(t,n){var r=65535,e=+t,i=+n,o=e&r,u=i&r,c=e>>>16,f=i>>>16,a=(c*u>>>0)+(o*u>>>16);return c*f+(a>>>16)+((o*f>>>0)+(a&r)>>>16)}})},function(t,n,r){"use strict";var e=r(1),i=r(17),o=r(26),u=r(11);r(10)&&e(e.P+r(124),"Object",{__defineGetter__:function(t,n){u.f(i(this),t,{get:o(n),enumerable:!0,configurable:!0})}})},function(t,n,r){"use strict";var e=r(1),i=r(17),o=r(26),u=r(11);r(10)&&e(e.P+r(124),"Object",{__defineSetter__:function(t,n){u.f(i(this),t,{set:o(n),enumerable:!0,configurable:!0})}})},function(t,n,r){var e=r(1),i=r(176)(!0);e(e.S,"Object",{entries:function(t){return i(t)}})},function(t,n,r){var e=r(1),i=r(177),o=r(30),u=r(31),c=r(131);e(e.S,"Object",{getOwnPropertyDescriptors:function(t){for(var n,r=o(t),e=u.f,f=i(r),a={},s=0;f.length>s;)c(a,n=f[s++],e(r,n));return a}})},function(t,n,r){"use strict";var e=r(1),i=r(17),o=r(50),u=r(32),c=r(31).f;r(10)&&e(e.P+r(124),"Object",{__lookupGetter__:function(t){var n,r=i(this),e=o(t,!0);do{if(n=c(r,e))return n.get}while(r=u(r))}})},function(t,n,r){"use strict";var e=r(1),i=r(17),o=r(50),u=r(32),c=r(31).f;r(10)&&e(e.P+r(124),"Object",{__lookupSetter__:function(t){var n,r=i(this),e=o(t,!0);do{if(n=c(r,e))return n.set}while(r=u(r))}})},function(t,n,r){var e=r(1),i=r(176)(!1);e(e.S,"Object",{values:function(t){return i(t)}})},function(t,n,r){"use strict";var e=r(1),i=r(3),o=r(52),u=r(143)(),c=r(7)("observable"),f=r(26),a=r(2),s=r(68),l=r(73),h=r(27),v=r(79),p=v.RETURN,d=function(t){return null==t?void 0:f(t)},y=function(t){var n=t._c;n&&(t._c=void 0,n())},g=function(t){return void 0===t._o},b=function(t){g(t)||(t._o=void 0,y(t))},m=function(t,n){a(t),this._c=void 0,this._o=t,t=new x(this);try{var r=n(t),e=r;null!=r&&("function"==typeof r.unsubscribe?r=function(){e.unsubscribe()}:f(r),this._c=r)}catch(n){return void t.error(n)}g(this)&&y(this)};m.prototype=l({},{unsubscribe:function(){b(this)}});var x=function(t){this._s=t};x.prototype=l({},{next:function(t){var n=this._s;if(!g(n)){var r=n._o;try{var e=d(r.next);if(e)return e.call(r,t)}catch(t){try{b(n)}finally{throw t}}}},error:function(t){var n=this._s;if(g(n))throw t;var r=n._o;n._o=void 0;try{var e=d(r.error);if(!e)throw t;t=e.call(r,t)}catch(t){try{y(n)}finally{throw t}}return y(n),t},complete:function(t){var n=this._s;if(!g(n)){var r=n._o;n._o=void 0;try{var e=d(r.complete);t=e?e.call(r,t):void 0}catch(t){try{y(n)}finally{throw t}}return y(n),t}}});var w=function(t){s(this,w,"Observable","_f")._f=f(t)};l(w.prototype,{subscribe:function(t){return new m(t,this._f)},forEach:function(t){var n=this;return new(o.Promise||i.Promise)(function(r,e){f(t);var i=n.subscribe({next:function(n){try{return t(n)}catch(t){e(t),i.unsubscribe()}},error:e,complete:r})})}}),l(w,{from:function(t){var n="function"==typeof this?this:w,r=d(a(t)[c]);if(r){var e=a(r.call(t));return e.constructor===n?e:new n(function(t){return e.subscribe(t)})}return new n(function(n){var r=!1;return u(function(){if(!r){try{if(v(t,!1,function(t){if(n.next(t),r)return p})===p)return}catch(t){if(r)throw t;return void n.error(t)}n.complete()}}),function(){r=!0}})},of:function(){for(var t=0,n=arguments.length,r=Array(n);t<n;)r[t]=arguments[t++];return new("function"==typeof this?this:w)(function(t){var n=!1;return u(function(){if(!n){for(var e=0;e<r.length;++e)if(t.next(r[e]),n)return;t.complete()}}),function(){n=!0}})}}),h(w.prototype,c,function(){return this}),e(e.G,{Observable:w}),r(74)("Observable")},function(t,n,r){var e=r(54),i=r(2),o=e.key,u=e.set;e.exp({defineMetadata:function(t,n,r,e){u(t,n,i(r),o(e))}})},function(t,n,r){var e=r(54),i=r(2),o=e.key,u=e.map,c=e.store;e.exp({deleteMetadata:function(t,n){var r=arguments.length<3?void 0:o(arguments[2]),e=u(i(n),r,!1);if(void 0===e||!e.delete(t))return!1;if(e.size)return!0;var f=c.get(n);return f.delete(r),!!f.size||c.delete(n)}})},function(t,n,r){var e=r(185),i=r(161),o=r(54),u=r(2),c=r(32),f=o.keys,a=o.key,s=function(t,n){var r=f(t,n),o=c(t);if(null===o)return r;var u=s(o,n);return u.length?r.length?i(new e(r.concat(u))):u:r};o.exp({getMetadataKeys:function(t){return s(u(t),arguments.length<2?void 0:a(arguments[1]))}})},function(t,n,r){var e=r(54),i=r(2),o=r(32),u=e.has,c=e.get,f=e.key,a=function(t,n,r){if(u(t,n,r))return c(t,n,r);var e=o(n);return null!==e?a(t,e,r):void 0};e.exp({getMetadata:function(t,n){return a(t,i(n),arguments.length<3?void 0:f(arguments[2]))}})},function(t,n,r){var e=r(54),i=r(2),o=e.keys,u=e.key;e.exp({getOwnMetadataKeys:function(t){ 604return o(i(t),arguments.length<2?void 0:u(arguments[1]))}})},function(t,n,r){var e=r(54),i=r(2),o=e.get,u=e.key;e.exp({getOwnMetadata:function(t,n){return o(t,i(n),arguments.length<3?void 0:u(arguments[2]))}})},function(t,n,r){var e=r(54),i=r(2),o=r(32),u=e.has,c=e.key,f=function(t,n,r){if(u(t,n,r))return!0;var e=o(n);return null!==e&&f(t,e,r)};e.exp({hasMetadata:function(t,n){return f(t,i(n),arguments.length<3?void 0:c(arguments[2]))}})},function(t,n,r){var e=r(54),i=r(2),o=e.has,u=e.key;e.exp({hasOwnMetadata:function(t,n){return o(t,i(n),arguments.length<3?void 0:u(arguments[2]))}})},function(t,n,r){var e=r(54),i=r(2),o=r(26),u=e.key,c=e.set;e.exp({metadata:function(t,n){return function(r,e){c(t,n,(void 0!==e?i:o)(r),u(e))}}})},function(t,n,r){var e=r(1);e(e.P+e.R,"Set",{toJSON:r(165)("Set")})},function(t,n,r){"use strict";var e=r(1),i=r(147)(!0);e(e.P,"String",{at:function(t){return i(this,t)}})},function(t,n,r){"use strict";var e=r(1),i=r(46),o=r(16),u=r(122),c=r(120),f=RegExp.prototype,a=function(t,n){this._r=t,this._s=n};r(139)(a,"RegExp String",function(){var t=this._r.exec(this._s);return{value:t,done:null===t}}),e(e.P,"String",{matchAll:function(t){if(i(this),!u(t))throw TypeError(t+" is not a regexp!");var n=String(this),r="flags"in f?String(t.flags):c.call(t),e=new RegExp(t.source,~r.indexOf("g")?r:"g"+r);return e.lastIndex=o(t.lastIndex),new a(e,n)}})},function(t,n,r){"use strict";var e=r(1),i=r(181);e(e.P,"String",{padEnd:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},function(t,n,r){"use strict";var e=r(1),i=r(181);e(e.P,"String",{padStart:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},function(t,n,r){"use strict";r(82)("trimLeft",function(t){return function(){return t(this,1)}},"trimStart")},function(t,n,r){"use strict";r(82)("trimRight",function(t){return function(){return t(this,2)}},"trimEnd")},function(t,n,r){r(153)("asyncIterator")},function(t,n,r){r(153)("observable")},function(t,n,r){var e=r(1);e(e.S,"System",{global:r(3)})},function(t,n,r){for(var e=r(155),i=r(28),o=r(3),u=r(27),c=r(80),f=r(7),a=f("iterator"),s=f("toStringTag"),l=c.Array,h=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],v=0;v<5;v++){var p,d=h[v],y=o[d],g=y&&y.prototype;if(g){g[a]||u(g,a,l),g[s]||u(g,s,d),c[d]=l;for(p in e)g[p]||i(g,p,e[p],!0)}}},function(t,n,r){var e=r(1),i=r(151);e(e.G+e.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,n,r){var e=r(3),i=r(1),o=r(121),u=r(207),c=e.navigator,f=!!c&&/MSIE .\./.test(c.userAgent),a=function(t){return f?function(n,r){return t(o(u,[].slice.call(arguments,2),"function"==typeof n?n:Function(n)),r)}:t};i(i.G+i.B+i.F*f,{setTimeout:a(e.setTimeout),setInterval:a(e.setInterval)})},function(t,n,r){r(330),r(269),r(271),r(270),r(273),r(275),r(280),r(274),r(272),r(282),r(281),r(277),r(278),r(276),r(268),r(279),r(283),r(284),r(236),r(238),r(237),r(286),r(285),r(256),r(266),r(267),r(257),r(258),r(259),r(260),r(261),r(262),r(263),r(264),r(265),r(239),r(240),r(241),r(242),r(243),r(244),r(245),r(246),r(247),r(248),r(249),r(250),r(251),r(252),r(253),r(254),r(255
vendor: 7,469 bytes, line 604
604),r(317),r(322),r(329),r(320),r(312),r(313),r(318),r(323),r(325),r(308),r(309),r(310),r(311),r(314),r(315),r(316),r(319),r(321),r(324),r(326),r(327),r(328),r(231),r(233),r(232),r(235),r(234),r(220),r(218),r(224),r(221),r(227),r(229),r(217),r(223),r(214),r(228),r(212),r(226),r(225),r(219),r(222),r(211),r(213),r(216),r(215),r(230),r(155),r(302),r(307),r(184),r(303),r(304),r(305),r(306),r(287),r(183),r(185),r(186),r(342),r(331),r(332),r(337),r(340),r(341),r(335),r(338),r(336),r(339),r(333),r(334),r(288),r(289),r(290),r(291),r(292),r(295),r(293),r(294),r(296),r(297),r(298),r(299),r(301),r(300),r(343),r(369),r(372),r(371),r(373),r(374),r(370),r(375),r(376),r(354),r(357),r(353),r(351),r(352),r(355),r(356),r(346),r(368),r(377),r(345),r(347),r(349),r(348),r(350),r(359),r(360),r(362),r(361),r(364),r(363),r(365),r(366),r(367),r(344),r(358),r(380),r(379),r(378),t.exports=r(52)},function(t,n){function r(t,n){if("string"==typeof n)return t.insertAdjacentHTML("afterend",n);var r=t.nextSibling;return r?t.parentNode.insertBefore(n,r):t.parentNode.appendChild(n)}t.exports=r},,,,,,,,,function(t,n,r){(function(n,r){!function(n){"use strict";function e(t,n,r,e){var i=n&&n.prototype instanceof o?n:o,u=Object.create(i.prototype),c=new p(e||[]);return u._invoke=s(t,r,c),u}function i(t,n,r){try{return{type:"normal",arg:t.call(n,r)}}catch(t){return{type:"throw",arg:t}}}function o(){}function u(){}function c(){}function f(t){["next","throw","return"].forEach(function(n){t[n]=function(t){return this._invoke(n,t)}})}function a(t){function n(r,e,o,u){var c=i(t[r],t,e);if("throw"!==c.type){var f=c.arg,a=f.value;return a&&"object"==typeof a&&m.call(a,"__await")?Promise.resolve(a.__await).then(function(t){n("next",t,o,u)},function(t){n("throw",t,o,u)}):Promise.resolve(a).then(function(t){f.value=t,o(f)},u)}u(c.arg)}function e(t,r){function e(){return new Promise(function(e,i){n(t,r,e,i)})}return o=o?o.then(e,e):e()}"object"==typeof r&&r.domain&&(n=r.domain.bind(n));var o;this._invoke=e}function s(t,n,r){var e=P;return function(o,u){if(e===F)throw new Error("Generator is already running");if(e===M){if("throw"===o)throw u;return y()}for(r.method=o,r.arg=u;;){var c=r.delegate;if(c){var f=l(c,r);if(f){if(f===A)continue;return f}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(e===P)throw e=M,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);e=F;var a=i(t,n,r);if("normal"===a.type){if(e=r.done?M:j,a.arg===A)continue;return{value:a.arg,done:r.done}}"throw"===a.type&&(e=M,r.method="throw",r.arg=a.arg)}}}function l(t,n){var r=t.iterator[n.method];if(r===g){if(n.delegate=null,"throw"===n.method){if(t.iterator.return&&(n.method="return",n.arg=g,l(t,n),"throw"===n.method))return A;n.method="throw",n.arg=new TypeError("The iterator does not provide a 'throw' method")}return A}var e=i(r,t.iterator,n.arg);if("throw"===e.type)return n.method="throw",n.arg=e.arg,n.delegate=null,A;var o=e.arg;return o?o.done?(n[t.resultName]=o.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=g),n.delegate=null,A):o:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,A)}function h(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.finallyLoc=t[2],n.afterLoc=t[3]),this.tryEntries.push(n)}function v(t){var n=t.completion||{};n.type="normal",delete n.arg,t.completion=n}function p(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(h,this),this.reset(!0)}function d(t){if(t){var n=t[w];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,e=function n(){for(;++r<t.length;)if(m.call(t,r))return n.value=t[r],n.done=!1,n;return n.value=g,n.done=!0,n};return e.next=e}}return{next:y}}function y(){return{value:g,done:!0}}var g,b=Object.prototype,m=b.hasOwnProperty,x="function"==typeof Symbol?Symbol:{},w=x.iterator||"@@iterator",S=x.asyncIterator||"@@asyncIterator",_=x.toStringTag||"@@toStringTag",O="object"==typeof t,E=n.regeneratorRuntime;if(E)return void(O&&(t.exports=E));E=n.regeneratorRuntime=O?t.exports:{},E.wrap=e;var P="suspendedStart",j="suspendedYield",F="executing",M="completed",A={},N={};N[w]=function(){return this};var T=Object.getPrototypeOf,I=T&&T(T(d([])));I&&I!==b&&m.call(I,w)&&(N=I);var k=c.prototype=o.prototype=Object.create(N);u.prototype=k.constructor=c,c.constructor=u,c[_]=u.displayName="GeneratorFunction",E.isGeneratorFunction=function(t){var n="function"==typeof t&&t.constructor;return!!n&&(n===u||"GeneratorFunction"===(n.displayName||n.name))},E.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,c):(t.__proto__=c,_ in t||(t[_]="GeneratorFunction")),t.prototype=Object.create(k),t},E.awrap=function(t){return{__await:t}},f(a.prototype),a.prototype[S]=function(){return this},E.AsyncIterator=a,E.async=function(t,n,r,i){var o=new a(e(t,n,r,i));return E.isGeneratorFunction(n)?o:o.next().then(function(t){return t.done?t.value:o.next()})},f(k),k[_]="Generator",k.toString=function(){return"[object Generator]"},E.keys=function(t){var n=[];for(var r in t)n.push(r);return n.reverse(),function r(){for(;n.length;){var e=n.pop();if(e in t)return r.value=e,r.done=!1,r}return r.done=!0,r}},E.values=d,p.prototype={constructor:p,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=g,this.done=!1,this.delegate=null,this.method="next",this.arg=g,this.tryEntries.forEach(v),!t)for(var n in this)"t"===n.charAt(0)&&m.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=g)},stop:function(){this.done=!0;var t=this.tryEntries[0],n=t.completion;if("throw"===n.type)throw n.arg;return this.rval},dispatchException:function(t){function n(n,e){return o.type="throw",o.arg=t,r.next=n,e&&(r.method="next",r.arg=g),!!e}if(this.done)throw t;for(var r=this,e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e],o=i.completion;if("root"===i.tryLoc)return n("end");if(i.tryLoc<=this.prev){var u=m.call(i,"catchLoc"),c=m.call(i,"finallyLoc");if(u&&c){if(this.prev<i.catchLoc)return n(i.catchLoc,!0);if(this.prev<i.finallyLoc)return n(i.finallyLoc)}else if(u){if(this.prev<i.catchLoc)return n(i.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return n(i.finallyLoc)}}}},abrupt:function(t,n){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc<=this.prev&&m.call(e,"finallyLoc")&&this.prev<e.finallyLoc){var i=e;break}}i&&("break"===t||"continue"===t)&&i.tryLoc<=n&&n<=i.finallyLoc&&(i=null);var o=i?i.completion:{};return o.type=t,o.arg=n,i?(this.method="next",this.next=i.finallyLoc,A):this.complete(o)},complete:function(t,n){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&n&&(this.next=n),A},finish:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),v(r),A}},catch:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc===t){var e=r.completion;if("throw"===e.type){var i=e.arg;v(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:d(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=g),A}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(n,function(){return this}(),r(158))}])</script>
604<script src="/./main.0cf68a.js"></script>
604<script>!function(){!function(e){var t=document.createElement("script");document.getElementsByTagName("body")[0].appendChild(t),t.setAttribute("src",e)}("/slider.e37972.js")}()</script>
604 605 606
607<script type="text/x-mathjax-config"> 608MathJax.Hub.Config({ 609 tex2jax: { 610 inlineMath: [ ['$','$'], ["\\(","\\)"] ], 611 processEscapes: true, 612 skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'] 613 } 614}); 615 616MathJax.Hub.Queue(function() { 617 var all = MathJax.Hub.getAllJax(), i; 618 for(i=0; i < all.length; i += 1) { 619 all[i].SourceElement().parentNode.className += ' has-jax'; 620 } 621}); 622</script>
622 623
624<script src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"> 625</script>
625 626 627 628 629<div class="tools-col" q-class="show:isShow,hide:isShow|isFalse" q-on="click:stop(e)"> 630 <div class="tools-nav header-menu"> 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 <ul style="width: 70%"> 648 649 650 651 <li style="width: 33.333333333333336%" q-on="click: openSlider(e, 'innerArchive')"><a href="javascript:void(0)" q-class="active:innerArchive">æææç« </a></li> 652 653 654 655 <li style="width: 33.333333333333336%" q-on="click: openSlider(e, 'friends')"><a href="javascript:void(0)" q-class="active:friends">åæ é¾æ¥</a></li> 656 657 658 659 <li style="width: 33.333333333333336%" q-on="click: openSlider(e, 'aboutme')"><a href="javascript:void(0)" q-class="active:aboutme">å ³äºæ</a></li> 660 661 662 </ul> 663 </div> 664 <div class="tools-wrap"> 665 666 <section class="tools-section tools-section-all" q-show="innerArchive"> 667 <div class="search-wrap"> 668 <input class="search-ipt" q-model="search" type="text" placeholder="find somethingâ¦"> 669 <i class="icon-search icon" q-show="search|isEmptyStr"></i> 670 <i class="icon-close icon" q-show="search|isNotEmptyStr" q-on="click:clearChose(e)"></i> 671 </div> 672 <div class="widget tagcloud search-tag"> 673 <p class="search-tag-wording">tag:</p> 674 <label class="search-switch"> 675 <input type="checkbox" q-on="click:toggleTag(e)" q-attr="checked:showTags"> 676 </label>
677 <ul class="article-tag-list" q-show="showTags"> 678 679 <li class="article-tag-list-item"> 680 <a href="javascript:void(0)" class="js-tag color2">DeepFM</a> 681 </li> 682 683 <li class="article-tag-list-item"> 684 <a href="javascript:void(0)" class="js-tag color3">FM</a> 685 </li> 686 687 <li class="article-tag-list-item"> 688 <a href="javascript:void(0)" class="js-tag color4">CTR</a> 689 </li> 690 691 <li class="article-tag-list-item"> 692 <a href="javascript:void(0)" class="js-tag color2">Github</a> 693 </li> 694 695 <li class="article-tag-list-item"> 696 <a href="javascript:void(0)" class="js-tag color5">Microsoft</a> 697 </li> 698 699 <li class="article-tag-list-item"> 700 <a href="javascript:void(0)" class="js-tag color5">hexo</a> 701 </li> 702 703 <li class="article-tag-list-item"> 704 <a href="javascript:void(0)" class="js-tag color2">github</a> 705 </li> 706 707 <li class="article-tag-list-item"> 708 <a href="javascript:void(0)" class="js-tag color5">æå»ºå客</a> 709 </li> 710 711 <li class="article-tag-list-item"> 712 <a href="javascript:void(0)" class="js-tag color1">LatexTools</a> 713 </li> 714 715 <li class="article-tag-list-item"> 716 <a href="javascript:void(0)" class="js-tag color3">sublime</a> 717 </li> 718 719 <li class="article-tag-list-item"> 720 <a href="javascript:void(0)" class="js-tag color5">åèæç®</a> 721 </li> 722 723 <li class="article-tag-list-item"> 724 <a href="javascript:void(0)" class="js-tag color4">ocr</a> 725 </li> 726 727 <li class="article-tag-list-item"> 728 <a href="javascript:void(0)" class="js-tag color5">CTPN</a> 729 </li> 730 731 <li class="article-tag-list-item"> 732 <a href="javascript:void(0)" class="js-tag color2">å¾åææ¬æ£æµ</a> 733 </li> 734 735 <li class="article-tag-list-item"> 736 <a href="javascript:void(0)" class="js-tag color3">haskell</a> 737 </li> 738 739 <li class="article-tag-list-item"> 740 <a href="javascript:void(0)" class="js-tag color2">python</a> 741 </li> 742 743 <li class="article-tag-list-item"> 744 <a href="javascript:void(0)" class="js-tag color4">PIL</a> 745 </li> 746 747 <li class="article-tag-list-item"> 748 <a href="javascript:void(0)" class="js-tag color5">å¾åå¤ç</a> 749 </li> 750 751 <li class="article-tag-list-item"> 752 <a href="javascript:void(0)" class="js-tag color4">gif</a> 753 </li> 754 755 <li class="article-tag-list-item"> 756 <a href="javascript:void(0)" class="js-tag color1">shell</a> 757 </li> 758 759 <li class="article-tag-list-item"> 760 <a href="javascript:void(0)" class="js-tag color4">GAN</a> 761 </li> 762 763 <li class="article-tag-list-item"> 764 <a href="javascript:void(0)" class="js-tag color1">æ¡ä»¶GAN</a> 765 </li> 766 767 <li class="article-tag-list-item"> 768 <a href="javascript:void(0)" class="js-tag color2">çæå¯¹æç½ç»</a> 769 </li> 770 771 <li class="article-tag-list-item"> 772 <a href="javascript:void(0)" class="js-tag color5">论æè§£è¯»</a> 773 </li> 774 775 <li class="article-tag-list-item"> 776 <a href="javascript:void(0)" class="js-tag color5">sopt</a> 777 </li> 778 779 <li class="article-tag-list-item"> 780 <a href="javascript:void(0)" class="js-tag color4">æä¼å</a> 781 </li> 782 783 <li class="article-tag-list-item"> 784 <a href="javascript:void(0)" class="js-tag color3">optimization</a> 785 </li> 786 787 <li class="article-tag-list-item"> 788 <a href="javascript:void(0)" class="js-tag color1">DCGAN</a> 789 </li> 790 791 <li class="article-tag-list-item"> 792 <a href="javascript:void(0)" class="js-tag color5">代ç 解读</a> 793 </li> 794 795 <div class="clearfix"></div> 796 </ul> 797 </div> 798 <ul class="search-ul"> 799 <p q-show="jsonFail" style="padding: 20px; font-size: 12px;"> 800 缺失模åã<br/>1ã请确ä¿nodeçæ¬å¤§äº6.2<br/>2ãå¨åå®¢æ ¹ç®å½ï¼æ³¨æä¸æ¯yiliaæ ¹ç®å½ï¼æ§è¡ä»¥ä¸å½ä»¤ï¼<br/> npm i hexo-generator-json-content --save<br/><br/> 801 3ã卿 ¹ç®å½_config.ymléæ·»å é ç½®ï¼ 802<pre style="font-size: 12px;" q-show="jsonFail"> 803 jsonContent: 804 meta: false 805 pages: false 806 posts: 807 title: true 808 date: true 809 path: true 810 text: false
811 raw: false 812 content: false 813 slug: false 814 updated: false 815 comments: false 816 link: false 817 permalink: false 818 excerpt: false 819 categories: false 820 tags: true 821</pre> 822 </p> 823 <li class="search-li" q-repeat="items" q-show="isShow"> 824 <a q-attr="href:path|urlformat" class="search-title"><i class="icon-quo-left icon"></i><span q-text="title"></span></a> 825 <p class="search-time"> 826 <i class="icon-calendar icon"></i> 827 <span q-text="date|dateformat"></span> 828 </p> 829 <p class="search-tag"> 830 <i class="icon-price-tags icon"></i> 831 <span q-repeat="tags" q-on="click:choseTag(e, name)" q-text="name|tagformat"></span> 832 </p> 833 </li> 834 </ul> 835 </section> 836 837 838 839 <section class="tools-section tools-section-friends" q-show="friends"> 840 841 <ul class="search-ul"> 842 843 <li class="search-li"> 844 <a href="http://www.github.com/Lyrichu" target="_blank" class="search-title"><i class="icon-quo-left icon"></i>github</a> 845 </li> 846 847 <li class="search-li"> 848 <a href="http://www.movieb2b.com" target="_blank" class="search-title"><i class="icon-quo-left icon"></i>个人ç½é¡µ</a> 849 </li> 850 851 <li class="search-li"> 852 <a href="http://www.cnblogs.com/lyrichu/" target="_blank" class="search-title"><i class="icon-quo-left icon"></i>å客å</a> 853 </li> 854 855 </ul> 856 857 </section> 858 859 860 861 <section class="tools-section tools-section-me" q-show="aboutme"> 862 863 <div class="aboutme-wrap" id="js-aboutme"><h1>åä¸ä¸ªçç±çæ´»çç¨åºå!</h1></div> 864 865 </section> 866 867 </div> 868 869</div> 870 <!-- Root element of PhotoSwipe. Must have class pswp. --> 871<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true"> 872 873 <!-- Background of PhotoSwipe. 874 It's a separate element as animating opacity is faster than rgba(). --> 875 <div class="pswp__bg"></div> 876 877 <!-- Slides wrapper with overflow:hidden. --> 878 <div class="pswp__scroll-wrap"> 879 880 <!-- Container that holds slides. 881 PhotoSwipe keeps only 3 of them in the DOM to save memory. 882 Don't modify these 3 pswp__item elements, data is added later on. --> 883 <div class="pswp__container"> 884 <div class="pswp__item"></div> 885 <div class="pswp__item"></div> 886 <div class="pswp__item"></div> 887 </div> 888 889 <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. --> 890 <div class="pswp__ui pswp__ui--hidden"> 891 892 <div class="pswp__top-bar"> 893 894 <!-- Controls are self-explanatory. Order can be changed. --> 895 896 <div class="pswp__counter"></div> 897 898 <button class="pswp__button pswp__button--close" title="Close (Esc)"></button> 899 900 <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button> 901 902 <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button> 903 904 <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button> 905 906 <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR --> 907 <!-- element will get class pswp__preloader--active when preloader is running --> 908 <div class="pswp__preloader"> 909 <div class="pswp__preloader__icn"> 910 <div class="pswp__preloader__cut"> 911 <div class="pswp__preloader__donut"></div> 912 </div> 913 </div> 914 </div> 915 </div> 916 917 <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"> 918 <div class="pswp__share-tooltip"></div> 919 </div> 920 921 <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)"> 922 </button> 923 924 <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)"> 925 </button> 926 927 <div class="pswp__caption"> 928 <div class="pswp__caption__center"></div> 929 </div> 930 931 </div> 932 933 </div> 934 935</div> 936 </div> 937</body> 938</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.