<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Machine Learning on KbWen Blog</title>
    <link>https://www.kbwen.com/categories/machine-learning/</link>
    <description>KbWen 的個人技術部落格，分享 Python、機器學習、深度學習、資料工程與 AI 開發的學習筆記與實作心得。</description>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <image>
      <url>https://www.kbwen.com/images/og-default.png</url>
      <title>KbWen Blog</title>
      <link>https://www.kbwen.com/</link>
    </image>
    
    <lastBuildDate>Mon, 29 Nov 2021 22:31:27 +0800</lastBuildDate><atom:link href="https://www.kbwen.com/categories/machine-learning/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>推薦系統中的冷啟動問題</title>
      <link>https://www.kbwen.com/recommender-cold-start-problem/</link>
      <pubDate>Mon, 29 Nov 2021 22:31:27 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/recommender-cold-start-problem/</guid>
      <description>推薦系統冷啟動問題完整解析：介紹使用者冷啟動、物品冷啟動、系統冷啟動三類問題，以及排行榜推薦、社交平台授權、相似度計算、快速試探等常用解決策略。</description>
      <content:encoded><![CDATA[<h2 id="什麼是冷啟動">什麼是冷啟動?</h2>
<p>推薦系統主要是把物品推薦給喜歡的使用者，在使用的環境中，物品和使用者皆會持續的增長變化，也因此會持續面對有新物品和新使用者的情境；有新的物品和使用者使得無法做好的推薦就稱為冷啟動，我們要討論在這種情況下如何做合適的推薦。</p>
<p>基本的冷啟動可以分成三類：</p>
<ol>
<li>使用者冷啟動：新用戶產生時沒有有任何瀏覽購買紀錄，如何推薦用品的問題。</li>
<li>物品冷啟動：新物品如何推薦給合適的用戶。</li>
<li>系統冷啟動：新系統上線時，物品、使用者、資料皆不足的推薦問題。</li>
</ol>
<p><img
  src="https://www.researchgate.net/profile/Mehdi-Elahi-2/publication/332511384/figure/fig2/AS:749057106530306@1555600539374/Illustration-of-Cold-Start-problem-in-recommender-systems-New-user-problem-left-and.jpg"
  alt="2 Illustration of Cold Start problem in recommender systems: New user&hellip; |  Download Scientific Diagram"
  loading="lazy"
  fetchpriority="auto"
  decoding="async"
>
</p>
<p>圖片來源：<a href="https://www.researchgate.net/figure/Illustration-of-Cold-Start-problem-in-recommender-systems-New-user-problem-left-and_fig2_332511384">https://www.researchgate.net/figure/Illustration-of-Cold-Start-problem-in-recommender-systems-New-user-problem-left-and_fig2_332511384</a></p>
<p>接下來我們介紹幾個常見的解決方式</p>
<h2 id="排行榜推薦">排行榜推薦</h2>
<h3 id="新物品的推薦">新物品的推薦</h3>
<p>秉持著大家會喜新厭舊的心態，推薦新的物品給使用者；像是電影、影集等等就很適合，有新影片上線時，不管是新或舊的使用者都會想看。</p>
<h3 id="熱門物品的推薦">熱門物品的推薦</h3>
<p>推薦大家都喜歡的物品給使用者，這是非常常見的做法，簡單有效；也可以用作新演算法的AB test或benchmark，等到資料足夠後才做個性化推薦。</p>
<h3 id="常用物品必需品推薦">常用物品、必需品推薦</h3>
<p>推薦生活必需品、常用物品給新使用者；這種情況適合一些居家用品、常用家電、廚房用具等等的情境。</p>
<h3 id="標籤推薦">標籤推薦</h3>
<p>這種方式是針對前三項作更細微的推薦，像是ott 串流平台可以直接選擇喜劇、動作片、愛情片等等的推薦；但要注意標籤要先設計完整。</p>
<p><img
  src="https://images.deepai.org/converted-papers/2008.01437/x1.png"
  alt="冷啟動問題與視覺偏好建模示意圖（DeepAI 論文）"
  loading="lazy"
  fetchpriority="auto"
  decoding="async"
>
</p>
<p>圖片來源：<a href="https://deepai.org/publication/addressing-the-cold-start-problem-in-outfit-recommendation-using-visual-preference-modelling">https://deepai.org/publication/addressing-the-cold-start-problem-in-outfit-recommendation-using-visual-preference-modelling</a></p>
<h2 id="簡易的使用者推薦">簡易的使用者推薦</h2>
<h3 id="簡易的使用者推薦-1">簡易的使用者推薦</h3>
<p>根據使用者簡易的年齡、性別等等資料分出人群進行推薦。</p>
<h3 id="授權平台推薦">授權平台推薦</h3>
<p>導入第三方社交平台facebook、google等等，根據這些平台的歷史數據進行推薦。</p>
<h3 id="問答題推薦">問答題推薦</h3>
<p>目前有許多平台都是這種方式，註冊登入時會問幾個問題，了解你的喜好，根據你的反饋來推薦物品。</p>
<h2 id="新物品的相似度推薦">新物品的相似度推薦</h2>
<p>新物品推薦系統在不同的平台有不同的重要程度，在新聞媒體等等時效性強的平台就特別重要，必須要快速的推薦出去，不然時間過了這個資訊、消息也就不重要了。</p>
<h3 id="新物品跟用戶的相似度">新物品跟用戶的相似度</h3>
<p>計算新物品的特徵（標籤、cos相似度、TF-IDF、影像相似度等等）和使用者的行為特徵進行推薦。</p>
<h3 id="新物品和舊物品的相似度">新物品和舊物品的相似度</h3>
<p>新物品進入平台後，根據平台的標籤、屬性資訊等等，計算出相似的物品，再推薦給喜歡此物品的使用者。</p>
<h2 id="試探策略">試探策略</h2>
<p>這幾年短影片的流行，無論是純做短影片的網站，抑或是一般影音平台的短影片，皆是爆發性的成長；快速試探策略就很適合，快速、隨機推薦影片給使用者，再根據使用者觀看、點擊、滑動瀏覽網站、停留時間等等的行為，快速獲得使用者的資訊，再進行推薦。</p>
<h2 id="結尾">結尾</h2>
<p>上面是簡單介紹幾個常用的方式，還有許多做法可以解決遇到的冷啟動問題，主要必須先定義好問題，知道自己產品、平台的特徵、類型、使用者如何才會滿意等等的資訊，才能真正的對症下藥。</p>
<p>最後推薦幾篇論文，大家有興趣可以看看他們遇到的問題是什麼又是如何解決的。</p>
<p><a href="https://www.amazon.science/publications/behavior-based-popularity-ranking-on-amazon-video">Behavior-based popularity ranking on Amazon Video</a></p>
<p><a href="https://arxiv.org/pdf/1803.02349">Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba</a></p>
<p><a href="https://www.researchgate.net/publication/221141030_Performance_of_recommender_algorithms_on_top-N_recommendation_tasks">Performance of recommender algorithms on top-N recommendation tasks</a></p>
<p><a href="https://www.kdd.org/kdd2018/accepted-papers/view/real-time-personalization-using-embeddings-for-search-ranking-at-airbnb">Real-time Personalization using Embeddings for Search Ranking at Airbnb</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Deep Reinforcement learning</title>
      <link>https://www.kbwen.com/deep-reinforcement-learning/</link>
      <pubDate>Mon, 26 Oct 2020 16:42:30 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/deep-reinforcement-learning/</guid>
      <description>深度強化學習實作：使用 OpenAI Gym MountainCar 環境，結合 TensorFlow 2 建立 DQNetwork，實現 Q-learning 讓 AI 自主學習爬山車任務。</description>
      <content:encoded><![CDATA[<p>Reinforcement learning (RL) is a framework where agents learn to perform actions in an environment so as to maximize a reward. It&rsquo;s actually training an AI to learn through every mistake and find the correct path without any label. The two main components are the environment and the agent.</p>
<p>Deep Reinforcement learning (DRL) combined with deep learning technology is even more powerful. AlphaGo, is a typical application of deep reinforcement learning.</p>
<p>Source: <a href="http://incompleteideas.net/book/bookdraft2017nov5.pdf">Reinforcement Learning: An Introduction (Sutton &amp; Barto)</a></p>
<p>It is composed of agent/actions/(status/rewards)/environment.</p>
<p>Reinforcement learning builds the agent and environment continuously interact with each other. After each action, the agent will receive the reward Rt+1 and the next state St+1. The goal is to improve the policy so as to maximize the sum of rewards (return).</p>
<h3 id="deep-reinforcement-learning-drl-">Deep Reinforcement learning (DRL) ?</h3>
<p>In DRL. A table(Q-table) will be stored to record all actions executed in a specific state and the value generated. Through this table, you can find the best execution method. The design of Q-Table is transformed into a neural network for learning. Through neural network learning, with different layers, huge features can be extracted from the environment to learn.</p>
<h2 id="gym-mountaincar">Gym MountainCar</h2>
<p>There is the MountainCar game environment in the Gym environment library launched by OpenAI.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># show game</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">gym</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">gym</span> <span class="kn">import</span> <span class="n">wrappers</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">env</span> <span class="o">=</span> <span class="n">gym</span><span class="o">.</span><span class="n">make</span><span class="p">(</span><span class="s1">&#39;MountainCar-v0&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">env</span><span class="o">.</span><span class="n">action_space</span><span class="o">.</span><span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">env</span><span class="o">.</span><span class="n">observation_space</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">env</span><span class="o">.</span><span class="n">observation_space</span><span class="o">.</span><span class="n">high</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">env</span><span class="o">.</span><span class="n">observation_space</span><span class="o">.</span><span class="n">low</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">env</span> <span class="o">=</span> <span class="n">wrappers</span><span class="o">.</span><span class="n">Monitor</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="s2">&#34;./gym-results&#34;</span><span class="p">,</span> <span class="n">force</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">env</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1000</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">action</span> <span class="o">=</span> <span class="n">env</span><span class="o">.</span><span class="n">action_space</span><span class="o">.</span><span class="n">sample</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">observation</span><span class="p">,</span> <span class="n">reward</span><span class="p">,</span> <span class="n">done</span><span class="p">,</span> <span class="n">info</span> <span class="o">=</span> <span class="n">env</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">done</span><span class="p">:</span> <span class="k">break</span>
</span></span><span class="line"><span class="cl"><span class="n">env</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span></code></pre></div><p><img
  src="/images/2020/10/yhsc7-8l6yr.gif"
  alt="CartPole 環境 RL 代理訓練前的隨機行為動畫"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="600" height="400"
>
</p>
<p>Actions:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Type: Discrete(3)
</span></span><span class="line"><span class="cl">Num    Action
</span></span><span class="line"><span class="cl">0      Accelerate to the Left
</span></span><span class="line"><span class="cl">1      Don&#39;t accelerate
</span></span><span class="line"><span class="cl">2      Accelerate to the Right
</span></span></code></pre></div><p>Observation:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Type: Box(2)
</span></span><span class="line"><span class="cl">Num    Observation               Min            Max
</span></span><span class="line"><span class="cl">0      Car Position              -1.2           0.6
</span></span><span class="line"><span class="cl">1      Car Velocity              -0.07          0.07
</span></span></code></pre></div><p>we use a simpler fully connected neural network.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">DQNetwork</span><span class="p">(</span><span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dense1</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="n">units</span><span class="o">=</span><span class="mi">64</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="n">tf</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">relu</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dense2</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="n">units</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="n">tf</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">relu</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dense3</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="n">units</span><span class="o">=</span><span class="n">active_n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inputs</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense1</span><span class="p">(</span><span class="n">inputs</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense2</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense3</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">x</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">predict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inputs</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">q_values</span> <span class="o">=</span> <span class="bp">self</span><span class="p">(</span><span class="n">inputs</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">tf</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">q_values</span><span class="p">,</span> <span class="n">axis</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
</span></span></code></pre></div><p>implement Q learning</p>
<p><a href="https://www.cse.unsw.edu.au/~cs9417ml/RL1/images/qalg.gif">https://www.cse.unsw.edu.au/~cs9417ml/RL1/images/qalg.gif</a></p>
<p>source <a href="https://www.cse.unsw.edu.au/~cs9417ml/RL1/algorithms.html">https://www.cse.unsw.edu.au/~cs9417ml/RL1/algorithms.html</a></p>
<p>In this game, we set gamma in 1.0 which means there is no decrease.</p>
<p>After 20 mins&hellip;.</p>
<p><img
  src="/images/2020/10/jw118-dvteu.gif"
  alt="CartPole 代理訓練 20 分鐘後成功維持平衡的動畫"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="600" height="400"
>
</p>
<p>Done !!!!</p>
<p>code : <a href="https://github.com/KbWen/tf2test/blob/gym_MountainCar/gym_MountainCar-v0.ipynb">https://github.com/KbWen/tf2test/blob/gym_MountainCar/gym_MountainCar-v0.ipynb</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Tensorflow2 -- MNIST</title>
      <link>https://www.kbwen.com/tensorflow2-mnist/</link>
      <pubDate>Sat, 26 Sep 2020 15:46:49 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/tensorflow2-mnist/</guid>
      <description>TensorFlow 2.x 實作 MNIST 手寫數字辨識：比較繼承 tf.keras.Model 與 Sequential API 兩種建模方式，以及 GradientTape 自訂訓練迴圈的完整程式碼。</description>
      <content:encoded><![CDATA[<p>Tensorflow2.X和1.X有多了很多差別和使用方式，</p>
<p>今天用tf2來實作MNIST分類問題</p>
<h2 id="mnist">MNIST</h2>
<p>MNIST是一個很標準的手寫數字分類問題，</p>
<p>數據集下載有很多方式，這次直接使用tf API提供的</p>
<p><img
  src="/images/2020/09/image-3.png"
  alt="MNIST 手寫數字資料集樣本（28x28 灰階）"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="593" height="568"
>
</p>
<p>28 * 28 且只有黑白的數據</p>
<h2 id="開發">開發</h2>
<p>在local 起 jupyter lab</p>
<p>先看看GPU是否啟用</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">%</span><span class="n">matplotlib</span> <span class="n">widget</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">tensorflow</span> <span class="k">as</span> <span class="nn">tf</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># check gpu</span>
</span></span><span class="line"><span class="cl"><span class="n">tf</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">list_physical_devices</span><span class="p">(</span><span class="s1">&#39;GPU&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">tf</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">is_built_with_cuda</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="c1"># output True</span>
</span></span></code></pre></div><h3 id="方法一">方法一</h3>
<p>繼承 tf.keras.model</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">MLP</span><span class="p">(</span><span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Flatten</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dense1</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="n">units</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="n">tf</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">relu</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dense2</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="n">units</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="n">tf</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">leaky_relu</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dense3</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="n">units</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nd">@tf.function</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inputs</span><span class="p">):</span>  <span class="c1"># [batch_size, 28, 28, 1]</span>
</span></span><span class="line"><span class="cl">        <span class="n">flat1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span><span class="p">(</span><span class="n">inputs</span><span class="p">)</span>  <span class="c1"># [batch_size, 784]</span>
</span></span><span class="line"><span class="cl">        <span class="n">dens1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense1</span><span class="p">(</span><span class="n">flat1</span><span class="p">)</span>  <span class="c1"># [batch_size, 100]</span>
</span></span><span class="line"><span class="cl">        <span class="n">dens2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense2</span><span class="p">(</span><span class="n">dens1</span><span class="p">)</span>  <span class="c1"># [batch_size, 20]</span>
</span></span><span class="line"><span class="cl">        <span class="n">dens3</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense3</span><span class="p">(</span><span class="n">dens2</span><span class="p">)</span>  <span class="c1"># [batch_size, 10]</span>
</span></span><span class="line"><span class="cl">        <span class="n">output</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">softmax</span><span class="p">(</span><span class="n">dens3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">output</span>
</span></span></code></pre></div><p>使用tf.GradientTape訓練</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># @tf.function</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">one_batch_step</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="n">tf</span><span class="o">.</span><span class="n">GradientTape</span><span class="p">()</span> <span class="k">as</span> <span class="n">tape</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">y_pred</span> <span class="o">=</span> <span class="n">model</span><span class="p">(</span><span class="n">X</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">loss</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">losses</span><span class="o">.</span><span class="n">sparse_categorical_crossentropy</span><span class="p">(</span><span class="n">y_true</span><span class="o">=</span><span class="n">y</span><span class="p">,</span> <span class="n">y_pred</span><span class="o">=</span><span class="n">y_pred</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">loss</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">reduce_mean</span><span class="p">(</span><span class="n">loss</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">tf</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">batch_index</span><span class="si">}</span><span class="s2"> loss </span><span class="si">{</span><span class="n">loss</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="p">[</span><span class="n">loss</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        <span class="k">with</span> <span class="n">summary_writer</span><span class="o">.</span><span class="n">as_default</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">            <span class="n">tf</span><span class="o">.</span><span class="n">summary</span><span class="o">.</span><span class="n">scalar</span><span class="p">(</span><span class="s2">&#34;loss&#34;</span><span class="p">,</span> <span class="n">loss</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="n">batch_index</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">grads</span> <span class="o">=</span> <span class="n">tape</span><span class="o">.</span><span class="n">gradient</span><span class="p">(</span><span class="n">loss</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">optimizer</span><span class="o">.</span><span class="n">apply_gradients</span><span class="p">(</span><span class="n">grads_and_vars</span><span class="o">=</span><span class="nb">zip</span><span class="p">(</span><span class="n">grads</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">epoch_index</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num_epochs</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">batch_index</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num_batches</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">X</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">data_loader</span><span class="o">.</span><span class="n">get_batch</span><span class="p">(</span><span class="n">batch_size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">one_batch_step</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">batch_index</span><span class="o">=</span><span class="n">batch_index</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">summary_writer</span><span class="o">.</span><span class="n">as_default</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">tf</span><span class="o">.</span><span class="n">summary</span><span class="o">.</span><span class="n">trace_export</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&#34;model_trace&#34;</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">profiler_outdir</span><span class="o">=</span><span class="n">log_dir</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">tf</span><span class="o">.</span><span class="n">saved_model</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&#34;saved/</span><span class="si">{</span><span class="n">model_name</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span></code></pre></div><h3 id="方法二">方法二</h3>
<p>使用keras Pipeline來疊每一層要用的函數，彈性較低，但非常適合簡單的Model</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">model</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">models</span><span class="o">.</span><span class="n">Sequential</span><span class="p">([</span>
</span></span><span class="line"><span class="cl">    <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Flatten</span><span class="p">(),</span>
</span></span><span class="line"><span class="cl">    <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="n">tf</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">relu</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="n">units</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="n">tf</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">leaky_relu</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">layers</span><span class="o">.</span><span class="n">Softmax</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">model</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">optimizer</span><span class="o">=</span><span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">optimizers</span><span class="o">.</span><span class="n">Adam</span><span class="p">(</span><span class="n">learning_rate</span><span class="o">=</span><span class="n">learning_rate</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">loss</span><span class="o">=</span><span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">losses</span><span class="o">.</span><span class="n">sparse_categorical_crossentropy</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">metrics</span><span class="o">=</span><span class="p">[</span><span class="n">tf</span><span class="o">.</span><span class="n">keras</span><span class="o">.</span><span class="n">metrics</span><span class="o">.</span><span class="n">sparse_categorical_accuracy</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">model</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">data_loader</span><span class="o">.</span><span class="n">train_data</span><span class="p">,</span> <span class="n">data_loader</span><span class="o">.</span><span class="n">train_label</span><span class="p">,</span> <span class="n">epochs</span><span class="o">=</span><span class="n">num_epochs</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="n">batch_size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span><span class="n">data_loader</span><span class="o">.</span><span class="n">test_data</span><span class="p">,</span> <span class="n">data_loader</span><span class="o">.</span><span class="n">test_label</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">model_name</span> <span class="o">=</span> <span class="s2">&#34;mnist_model2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">tf</span><span class="o">.</span><span class="n">saved_model</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&#34;saved/</span><span class="si">{</span><span class="n">model_name</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span></code></pre></div><p>疊完model後，先compiler選擇優化和計算方式，再fit data進去就行了</p>
<p><img
  src="/images/2020/09/image-4.png"
  alt="Keras 訓練輸出的 loss 與 accuracy 記錄"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="1025" height="251"
>
</p>
<p>訓練狀況</p>
<p>需要點類神經網路的概念才看得懂程式碼，但這是個非常簡單的例子就不多介紹</p>
<p>可以去官網逛逛: <a href="https://www.tensorflow.org/tutorials">https://www.tensorflow.org/tutorials</a></p>
<p>來更了解tf2和相對應使用</p>
<p>相關程式碼：<a href="https://github.com/KbWen/tf2test/blob/master/MNIST_TF2.ipynb">github</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Google NLP API parsing</title>
      <link>https://www.kbwen.com/google-nlp-api-parsing/</link>
      <pubDate>Fri, 04 Sep 2020 21:26:15 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/google-nlp-api-parsing/</guid>
      <description>使用 Google Cloud Natural Language API 進行中英文語意分析：從 GCP API Key 設定、JSON 請求格式，到解讀 partOfSpeech、lemma 和 dependencyEdge 結果。</description>
      <content:encoded><![CDATA[<p>使用google 提供的API做語意分析。</p>
<p>語意分析(syntactic analysis)能夠提取語言的訊息，把文章拆成句子，句子在拆成更小的每個分詞，做更進一步的分析，Goole NLP API 會給予每個字詞的詞性以及彼此的關係。</p>
<h2 id="analyzing-syntax">Analyzing syntax</h2>
<p>進入GCP新增一個API Key 並確認NLP API狀態為enable；詳細的GCP申請操作步驟可以看官方文件。(或是以後有機會寫。)</p>
<p><img
  src="/images/2020/09/image.png"
  alt="GCP Console NLP API 啟用畫面"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="849" height="360"
>
</p>
<p>API Enabled</p>
<p>因為這次是介紹，所以使用google cloud shell；在平常使用下可以把某些步驟改成習慣的語言及IDE。</p>
<h3 id="新增環境變數">新增環境變數</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">API_KEY</span><span class="o">=</span>&lt;YOUR_KEY&gt;
</span></span></code></pre></div><p>確認輸入後，增加要丟進API的文字json檔 <code>text.json</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;document&#34;</span><span class="p">:{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;type&#34;</span><span class="p">:</span><span class="s2">&#34;PLAIN_TEXT&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Beirut rescuers search the site for possible survivor 30 days after the explosion.&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;encodingType&#34;</span><span class="p">:</span> <span class="s2">&#34;UTF8&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>標準的<code>json</code>檔輸入資訊：<a href="https://cloud.google.com/natural-language/docs">https://cloud.google.com/natural-language/docs</a></p>
<h3 id="使用curl-post資料">使用curl post資料</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl <span class="s2">&#34;https://language.googleapis.com/v1/documents:analyzeSyntax?key=</span><span class="si">${</span><span class="nv">API_KEY</span><span class="si">}</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s -X POST -H <span class="s2">&#34;Content-Type: application/json&#34;</span> --data-binary @text.json
</span></span></code></pre></div><p>會得到解析出來的資訊</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;sentences&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;text&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Beirut rescuers search the site for possible survivor 30 days after the explosion.&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;beginOffset&#34;</span><span class="p">:</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;tokens&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;text&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Beirut&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;beginOffset&#34;</span><span class="p">:</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;partOfSpeech&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;tag&#34;</span><span class="p">:</span> <span class="s2">&#34;NOUN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;aspect&#34;</span><span class="p">:</span> <span class="s2">&#34;ASPECT_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;case&#34;</span><span class="p">:</span> <span class="s2">&#34;CASE_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;form&#34;</span><span class="p">:</span> <span class="s2">&#34;FORM_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;gender&#34;</span><span class="p">:</span> <span class="s2">&#34;GENDER_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;mood&#34;</span><span class="p">:</span> <span class="s2">&#34;MOOD_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;number&#34;</span><span class="p">:</span> <span class="s2">&#34;SINGULAR&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;person&#34;</span><span class="p">:</span> <span class="s2">&#34;PERSON_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;proper&#34;</span><span class="p">:</span> <span class="s2">&#34;PROPER&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;reciprocity&#34;</span><span class="p">:</span> <span class="s2">&#34;RECIPROCITY_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;tense&#34;</span><span class="p">:</span> <span class="s2">&#34;TENSE_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;voice&#34;</span><span class="p">:</span> <span class="s2">&#34;VOICE_UNKNOWN&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;dependencyEdge&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;headTokenIndex&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;label&#34;</span><span class="p">:</span> <span class="s2">&#34;NN&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;lemma&#34;</span><span class="p">:</span> <span class="s2">&#34;Beirut&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;text&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;rescuers&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;beginOffset&#34;</span><span class="p">:</span> <span class="mi">7</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;partOfSpeech&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;tag&#34;</span><span class="p">:</span> <span class="s2">&#34;NOUN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;aspect&#34;</span><span class="p">:</span> <span class="s2">&#34;ASPECT_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;case&#34;</span><span class="p">:</span> <span class="s2">&#34;CASE_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;form&#34;</span><span class="p">:</span> <span class="s2">&#34;FORM_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;gender&#34;</span><span class="p">:</span> <span class="s2">&#34;GENDER_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;mood&#34;</span><span class="p">:</span> <span class="s2">&#34;MOOD_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;number&#34;</span><span class="p">:</span> <span class="s2">&#34;PLURAL&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;person&#34;</span><span class="p">:</span> <span class="s2">&#34;PERSON_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;proper&#34;</span><span class="p">:</span> <span class="s2">&#34;PROPER_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;reciprocity&#34;</span><span class="p">:</span> <span class="s2">&#34;RECIPROCITY_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;tense&#34;</span><span class="p">:</span> <span class="s2">&#34;TENSE_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;voice&#34;</span><span class="p">:</span> <span class="s2">&#34;VOICE_UNKNOWN&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;dependencyEdge&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;headTokenIndex&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;label&#34;</span><span class="p">:</span> <span class="s2">&#34;NSUBJ&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;lemma&#34;</span><span class="p">:</span> <span class="s2">&#34;rescuer&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;text&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;search&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;beginOffset&#34;</span><span class="p">:</span> <span class="mi">16</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;partOfSpeech&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;tag&#34;</span><span class="p">:</span> <span class="s2">&#34;VERB&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;aspect&#34;</span><span class="p">:</span> <span class="s2">&#34;ASPECT_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;case&#34;</span><span class="p">:</span> <span class="s2">&#34;CASE_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;form&#34;</span><span class="p">:</span> <span class="s2">&#34;FORM_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;gender&#34;</span><span class="p">:</span> <span class="s2">&#34;GENDER_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;mood&#34;</span><span class="p">:</span> <span class="s2">&#34;INDICATIVE&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;number&#34;</span><span class="p">:</span> <span class="s2">&#34;NUMBER_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;person&#34;</span><span class="p">:</span> <span class="s2">&#34;PERSON_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;proper&#34;</span><span class="p">:</span> <span class="s2">&#34;PROPER_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;reciprocity&#34;</span><span class="p">:</span> <span class="s2">&#34;RECIPROCITY_UNKNOWN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;tense&#34;</span><span class="p">:</span> <span class="s2">&#34;PRESENT&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;voice&#34;</span><span class="p">:</span> <span class="s2">&#34;VOICE_UNKNOWN&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="err">......</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;language&#34;</span><span class="p">:</span> <span class="s2">&#34;en&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>觀察一下上面的結果</p>
<ul>
<li>partOfSpeech: tag告訴你詞性rescuers是none，search是verb。</li>
<li>lemma: 詞的標準行事，例如 run, runs 和ran都會是run。</li>
<li>headTokenIndex: 代表他修改、修飾的是哪一個字。(index從零開始看起)</li>
<li>dependencyEdge: 本質上可以看成一幅圖，他會告訴你每個單詞間關聯。如下圖</li>
</ul>
<p><img
  src="/images/2020/09/image-1.png"
  alt="句子 dependency tree 視覺化範例"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="937" height="278"
>
</p>
<p>dependency tree</p>
<p>處理分類完這些文字後，接下來可以做更多使用。</p>
<p>更多詳細的介紹以及參數意義可以看官網的doc，裡面也有很多語言詳細的說明。</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>OPENCV 人臉辨識</title>
      <link>https://www.kbwen.com/opencv-face-recognition/</link>
      <pubDate>Wed, 12 Jul 2017 14:52:58 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/opencv-face-recognition/</guid>
      <description>OpenCV Haar Cascade 人臉偵測：解析 AdaBoost 弱分類器級聯架構，scaleFactor 與 MinNeighbors 參數調整技巧，以及 Haar cascade 的限制與改善方向。</description>
      <content:encoded><![CDATA[<p>人臉檢測 (Face Detection) 通常是人臉辨識流程的前置處理。這裡我們利用 <strong>Haar 特徵</strong> 來進行實作。</p>
<p><img
  src="/images/2017/07/opencv1.png"
  alt="opencv1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="493" height="342"
>
</p>
<p>在訓練過程中，該演算法使用 <strong>AdaBoost</strong>，即利用多個「弱分類器」級聯 (Cascade) 來判別。每一步都會提取一個特徵值來判斷是否為人臉：</p>
<ul>
<li>如果判斷為「是」，則進入下一個層級的強分類器。</li>
<li>如果判斷為「否」，則直接排除該區域。</li>
</ul>
<p>廣義來看，這就像是讓所有弱分類器進行投票，並根據各自的準確率加權集成。其組成的分類器架構稱為 <strong>Cascade</strong>，形式上類似於簡單的多層決策樹。</p>
<h3 id="實際應用與調整">實際應用與調整</h3>
<p>在實際使用中，Haar Cascade 的挑戰主要在於參數的調優，尤其是 <code>scaleFactor</code> 和 <code>minNeighbors</code>：</p>
<ul>
<li><strong><code>scaleFactor</code></strong>：控制影像縮放的比例。數值調大時，檢測的層數會變少，速度快但容易漏掉較小的目標。</li>
<li><strong><code>minNeighbors</code></strong>：決定一個目標區域被聲明為「人臉」前，周圍必須也被檢測到的人臉鄰居數量。</li>
</ul>
<p>由於不同圖片的解析度與場景差異，往往需要手動調整參數才能達到最佳效果，這在自動化處理上較為困難。未來我會嘗試使用深度學習等更強健的方式。</p>
<p><a href="https://realpython.com/blog/python/face-recognition-with-python/">參考來源：Face Recognition with Python</a></p>
<p>下圖是檢測人臉與眼睛的結果，圖片來源為 USA Volleyball National Team 合照：</p>
<p><img
  src="/images/2017/07/opencv2.webp"
  alt="opencv2"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="1500" height="608"
>
</p>
<p><a href="https://github.com/KbWen/Opencv/blob/master/opencv1_face.py">My Github</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Keras IMDb</title>
      <link>https://www.kbwen.com/keras-imdb/</link>
      <pubDate>Tue, 11 Jul 2017 17:58:33 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/keras-imdb/</guid>
      <description>Keras LSTM 情感分析：用 IMDb 電影評論資料訓練文字分類模型，使用 Tokenizer 編碼、Word Embedding 轉向量，搭配三層 LSTM 達到 0.8543 準確率。</description>
      <content:encoded><![CDATA[<p>IMDb 是一個電影相關的線上資料庫。這次要利用 IMDb 的影評文字，預測它屬於正面評價還是負面評價。</p>
<p>在深度學習模型中，輸入必須是數字。Keras 提供了 <code>Tokenizer</code> 模組，會依照英文單字出現頻率進行排序並編號：<a href="https://keras.io/preprocessing/text/">Keras Tokenizer 官方文件</a>。</p>
<p>接著利用 <strong>Word Embedding</strong> 將編號清單轉換為向量清單，最後丟進 <strong>LSTM</strong> 模型進行學習。</p>
<p><img
  src="/images/2017/07/imdb1.png"
  alt="IMDb1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="660" height="199"
>
</p>
<p>Keras 封裝了許多方便的功能，讓文字轉數字與模型建立變得非常簡單。</p>
<p><img
  src="/images/2017/07/imdb2.png"
  alt="IMDb2"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="426" height="327"
>
</p>
<p>這是我的 Model Summary。將數字序列轉換為 64 維的向量序列，並使用了三層隱藏層進行訓練。</p>
<p><strong>準確率：0.8543</strong></p>
<h3 id="實際測試">實際測試</h3>
<p>造訪 IMDb 網站，抓取《<a href="https://www.imdb.com/title/tt2250912/">蜘蛛人：返校日 (Spider-Man: Homecoming)</a>》的評論進行檢驗。輸入正面評論後，模型正確辨識為正面（1 為正面，0 為負面）。</p>
<p><a href="https://github.com/KbWen/Python_ML/blob/master/Keras-IMDb1.py">My Github</a></p>
<h2 id="相關文章">相關文章</h2>
<ul>
<li><a href="/keras-cifar-10/">Keras Cifar-10</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Keras Cifar-10</title>
      <link>https://www.kbwen.com/keras-cifar-10/</link>
      <pubDate>Thu, 06 Jul 2017 18:27:59 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/keras-cifar-10/</guid>
      <description>Keras 實作 CIFAR-10 圖像分類：兩層 CNN 卷積（3x3 kernel）加 Max Pooling，接全連接層（4096→1024→10），搭配 confusion matrix 分析各類別混淆情況，準確率 0.732。</description>
      <content:encoded><![CDATA[<p>這次使用 Keras 建立 CNN 疊代模型，來辨識 CIFAR-10 影像資料。</p>
<p>CIFAR-10 是 32*32 的 RGB 彩色圖形，包含飛機、狗、貓等 10 個類別，可以視為 MNIST 的進階挑戰版。</p>
<p>在數據預處理 (Preprocess) 階段，流程與 MNIST 類似，包括標準化與 One-hot encoding。</p>
<p><strong>模型架構：</strong></p>
<ul>
<li>卷積層 (Convolution)：兩層，選用 3*3 Kernel，Same padding。</li>
<li>池化層 (Max-pooling)：2*2 大小。</li>
<li>全連接層 (Dense)：由 4096 降至 1024，最後輸出 10 個類別。</li>
</ul>
<p>可以觀察 Keras 與 TensorFlow 在參數表現與語法上的些微差异。</p>
<p><img
  src="/images/2017/07/keras-cifar10-1.png"
  alt="keras-cifar10-1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="1920" height="436"
>
</p>
<p>利用 <code>pandas</code> 建立混淆矩陣 (Confusion Matrix)，分析模型是否在特定類別間產生混淆。</p>
<p><img
  src="/images/2017/07/keras-cifar10-0.png"
  alt="keras-cifar10-0"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="357" height="198"
>
</p>
<p>從矩陣中可以看出：</p>
<ul>
<li>第 3 類 (cat) 與第 5 類 (dog) 較容易混淆。</li>
<li>動物類與交通工具類之間區分得相當清楚。</li>
</ul>
<p><strong>兩層 CNN 準確率：0.732</strong></p>
<p><a href="https://github.com/KbWen/Python_ML/blob/master/Keras_Cifar10_0.py">My Github</a></p>
<h2 id="相關文章">相關文章</h2>
<ul>
<li><a href="/keras-imdb/">Keras IMDb</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>ML KNN</title>
      <link>https://www.kbwen.com/ml-knn/</link>
      <pubDate>Fri, 30 Jun 2017 20:29:26 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/ml-knn/</guid>
      <description>K-Nearest Neighbor (KNN) 演算法介紹：監督式學習中的 KNN 原理、用 Scipy 手刻距離計算，以及與 sklearn KNN 的準確率比較（0.9467 vs 0.9733）。</description>
      <content:encoded><![CDATA[<h3 id="k-th-nearest-neighbor-k-nn">k-th nearest neighbor (k-NN)</h3>
<p><strong>k-NN</strong> 是監督式學習 (<em>Supervised learning</em>) 的一種，名稱非常簡明扼要，就是尋找「K 個最相近的鄰居」。</p>
<p>這個演算法在實作時，會找到附近 K 個最近的點，根據鄰居的類別來判斷自己要歸在哪一類。雖然它是監督式學習，但其實並不需要訓練模型參數，而是將所有訓練資料儲存起來進行即時對比。</p>
<p><img
  src="/images/2017/06/279px-knnclassification-svg.png"
  alt="279px-KnnClassification.svg"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="279" height="252"
>
</p>
<p>我們可以藉由調整 K 的數值來增加演算法的 Noise Margin。然而，此演算法存在著儲存空間需求大（空間複雜度高）的問題，且容易受到數據不平衡的影響。</p>
<p>在實作上，核心在於計算點與點之間的距離。我使用了 <code>Scipy</code> 的函數來實作，為了方便觀察，先取 K=1，並將結果與 <code>sklearn</code> 的 KNN 進行比較。</p>
<p>實作思路是利用 <code>for</code> 迴圈計算每個測試資料與所有訓練資料的距離，並取最近者的類別作為預測結果。</p>
<p><img
  src="/images/2017/06/knn1.png"
  alt="knn1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="653" height="191"
>
</p>
<p><strong>準確率比較：</strong></p>
<ul>
<li><code>sklearn knn</code> : <strong>0.9733</strong></li>
<li>手刻 <code>knn</code> : <strong>0.9467</strong></li>
</ul>
<p><a href="https://github.com/KbWen/Python_ML/blob/master/KNN1(scipy).py">My Github</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>LSTM</title>
      <link>https://www.kbwen.com/lstm/</link>
      <pubDate>Thu, 29 Jun 2017 20:10:47 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/lstm/</guid>
      <description>LSTM 長短期記憶網路入門：解析 input gate、output gate、forget gate 的運作原理，如何解決 RNN 的長期依賴梯度消失問題，以及在 TensorFlow 中的實際應用。</description>
      <content:encoded><![CDATA[<p><a href="https://colah.github.io/posts/2015-08-Understanding-LSTMs/">原文網址：Understanding LSTMs</a></p>
<p>想像人在思考或閱讀文章時，並不是從零開始，而是會保留過去的記憶。RNN 就是為了解決這方面的問題而設計的。</p>
<p><img
  src="/images/2017/06/lstm1.jpg"
  alt="LSTM1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="458" height="711"
>
</p>
<p>每次訓練時，網路會保留過去的訊息並持續傳遞。而 <strong>LSTM</strong> 則是一種特殊的 RNN 形式。</p>
<h2 id="the-problem-of-long-term-dependencies">The Problem of Long-Term Dependencies</h2>
<p>在許多情況下，我們需要更多的上下文訊息，但這些關鍵資訊可能距離當前時間點非常遙遠。一般的 RNN 在處理這種長距離依賴時，容易產生梯度消失或梯度爆炸的問題。</p>
<p><img
  src="/images/2017/06/lstm2.png"
  alt="LSTM2"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="2523" height="869"
>
</p>
<h2 id="lstm">LSTM</h2>
<p>LSTM 稱為「長短期記憶網絡」(Long Short Term Memory networks)，是一種特殊的 RNN 架構。</p>
<p><img
  src="/images/2017/06/lstm4.png"
  alt="LSTM4"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="2233" height="839"
>
</p>
<p>不同於傳統 RNN 在每個 Cell 裡只包含一個 <code>tanh</code> 層，LSTM 增加了：</p>
<ul>
<li><strong>input gate</strong> (輸入門)</li>
<li><strong>output gate</strong> (輸出門)</li>
<li><strong>forget gate</strong> (遺忘門)</li>
</ul>
<p>這些閘門都是用來精準控制資料的操作。使用 <code>sigmoid</code> 激活函數可以看做是控制記憶與讀取資料量的多寡：<strong>0</strong> 代表不通過，<strong>1</strong> 代表全部通過。</p>
<p>詳細的數學推導可以參考原文。文中也介紹了 <strong>GRU</strong>——一種更為簡煉高效的 LSTM 變體。值得注意的是，現今我們從 RNN 領域獲得的優異成果，幾乎指的都是 LSTM 的應用。</p>
<p>在 TensorFlow 中，LSTM 已經封裝完善，呼叫即可使用。</p>
<p>下圖是用 LSTM (紅虛線) 去學習黑線 (<code>x*sin(x)</code>) 的擬合結果：</p>
<p><img
  src="/images/2017/06/figure_2.png"
  alt="figure_2"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="640" height="480"
>
</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Kaggle PM2.5 Prediction</title>
      <link>https://www.kbwen.com/kaggle-pm2-5-prediction/</link>
      <pubDate>Tue, 13 Jun 2017 20:00:46 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/kaggle-pm2-5-prediction/</guid>
      <description>Kaggle PM2.5 空氣品質預測：使用豐原站觀測資料，以 sklearn Linear Regression 為基礎，分析前九小時特徵預測第十小時 PM2.5 濃度，排名略高於 Baseline。</description>
      <content:encoded><![CDATA[<p>嘗試用 <code>sklearn</code> 進行分析。</p>
<p>使用豐原站的觀測記錄，將資料分為訓練集 (train set) 與測試集 (test set)：</p>
<ul>
<li><strong>train.csv</strong>：每個月前 20 天的所有觀測資料。</li>
<li><strong>test_X.csv</strong>：從每個月剩下的 10 天中取樣。每筆資料包含連續 10 小時，以前九小時的所有觀測數據作為 Feature，預測第十小時的 PM2.5 濃度。一共取出 240 筆不重複的測試資料。</li>
</ul>
<p><code>sklearn</code> 在使用上非常直接。目前的策略是採用最基礎的方式：取出所有前九小時的值作為 Feature，不進行額外的特徵工程或化簡，直接觀察結果。</p>
<p>在 Private 排名約在中間，略高於 Baseline。</p>
<p><img
  src="/images/2017/06/kagglepm25.png"
  alt="kagglepm25"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="936" height="350"
>
</p>
<p>因為使用的是 Linear Regression，對 Gradient Descent 而言：計算一次斜率，直接就能找到解。</p>
<p><a href="https://github.com/KbWen/Kaggle/blob/master/Kaggle_PM25.py">My Github</a></p>
<h2 id="相關文章">相關文章</h2>
<ul>
<li><a href="/kaggle-digit-recognizer/">Kaggle Digit Recognizer</a></li>
<li><a href="/kaggle-titanic/">Kaggle Titanic</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Kaggle Titanic</title>
      <link>https://www.kbwen.com/kaggle-titanic/</link>
      <pubDate>Fri, 09 Jun 2017 16:28:50 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/kaggle-titanic/</guid>
      <description>Kaggle Titanic 生存預測解題紀錄：使用 Logistic Regression（sigmoid &#43; cross entropy）進行二元分類，分析 overfitting 原因並提出 feature engineering 改善方向。</description>
      <content:encoded><![CDATA[<p><a href="https://www.kaggle.com/c/titanic">Kaggle</a></p>
<p>The sinking of the RMS Titanic is one of the most infamous shipwrecks in history. On April 15, 1912, during her maiden voyage, the Titanic sank after colliding with an iceberg, killing 1502 out of 2224 passengers and crew. This sensational tragedy shocked the international community and led to better safety regulations for ships. One of the reasons that the shipwreck led to such loss of life was that there were not enough lifeboats for the passengers and crew. Although there was some element of luck involved in surviving the sinking, some groups of people were more likely to survive than others, such as women, children, and the upper-class.</p>
<p>In this challenge, we ask you to complete the analysis of what sorts of people were likely to survive. In particular, we ask you to apply the tools of machine learning to predict which passengers survived the tragedy.</p>
<p>從題目可以知道，這是一個 binary classification，最初想到 SVM 和 perception。</p>
<p>從題目給的數據，選擇 Decision Tree 或 Random Forest 可能是比較合理的想法。不過這邊我想用 Logistic Regression 來試試 (sigmoid + cross entropy)。</p>
<p>把訓練資料的內容全部都變成 0-1 的數字，剩下的就交給 NN 去解決。因為我們最後一層的 active function 是 sigmoid，為了避免梯度消失，因此在做 cross entropy 時把最大最小值定為 0.00001 和 0.99999，做每次的訓練時才不會有 Nan 的問題。</p>
<h4 id="結果">結果</h4>
<p>Kaggle : <strong>0.76555</strong></p>
<p>分數只有這樣，大概有幾個地方需要檢討：</p>
<ol>
<li><strong>overfitting??</strong>：train 可以到 90% 但是 test 最高就是這數字。除了 overfitting，另外一個就是資料的考量，因為有故意捨去某些資料來做訓練，可能留下的在測試資料中反而是缺失的。</li>
<li><strong>解決 overfitting 的方式</strong>：選用 dropout 可能在這裡沒有比 regularization 還好，這需要調整。</li>
<li><strong>填補資料的方式</strong>：在空白資料上很多是填上零或者平均值，有些隱藏相關沒考慮到？</li>
<li><strong>feature</strong>：最可能就是 feature 的問題了，因為在類似的作法下，使用 XGB 試過也沒有好多少，因此應該要嘗試其他表現方式。</li>
</ol>
<p>原本想考慮好好用 Random Forest 和 XGB 認真做一次，想想應該真的是在 feature 上有問題；同樣用 Deep learning 來做的人，肯定也有做到非常高。</p>
<p>先邁入下個試題，希望回頭後有新想法。</p>
<p><a href="https://github.com/KbWen/Kaggle/blob/master/Kaggle_Titanic.py">My Github</a></p>
<h2 id="相關文章">相關文章</h2>
<ul>
<li><a href="/kaggle-digit-recognizer/">Kaggle Digit Recognizer</a></li>
<li><a href="/kaggle-pm2-5-prediction/">Kaggle PM2.5 Prediction</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Kaggle Digit Recognizer</title>
      <link>https://www.kbwen.com/kaggle-digit-recognizer/</link>
      <pubDate>Mon, 05 Jun 2017 18:17:19 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/kaggle-digit-recognizer/</guid>
      <description>Kaggle Digit Recognizer 解題紀錄：用 CNN 卷積神經網路辨識手寫 MNIST 數字，兩層卷積加一層隱藏層搭配 SGD，達成 0.98614 準確率。</description>
      <content:encoded><![CDATA[<p>這是進入 Kaggle 的第一個試題：<a href="https://www.kaggle.com/c/digit-recognizer/data">Kaggle digit recognizer</a>。</p>
<p>這是一個用 CSV 儲存的 MNIST 問題，因此選用 CNN 來解決。資料格式如下：</p>
<p>If we omit the &ldquo;pixel&rdquo; prefix, the pixels make up the image like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">000 001 002 003 ... 026 027
</span></span><span class="line"><span class="cl">028 029 030 031 ... 054 055
</span></span><span class="line"><span class="cl">056 057 058 059 ... 082 083
</span></span><span class="line"><span class="cl"> |   |   |   |  ...  |   |
</span></span><span class="line"><span class="cl">728 729 730 731 ... 754 755
</span></span><span class="line"><span class="cl">756 757 758 759 ... 782 783 
</span></span></code></pre></div><p>The test data set, (test.csv), is the same as the training set, except that it does not contain the &ldquo;label&rdquo; column. Your submission file should be in the following format:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-csv" data-lang="csv"><span class="line"><span class="cl"><span class="s">ImageId</span><span class="p">,</span><span class="s">Label</span><span class="p">
</span></span></span><span class="line"><span class="cl"><span class="s">1</span><span class="p">,</span><span class="s">3</span><span class="p">
</span></span></span><span class="line"><span class="cl"><span class="s">2</span><span class="p">,</span><span class="s">7</span><span class="p">
</span></span></span><span class="line"><span class="cl"><span class="s">3</span><span class="p">,</span><span class="s">8 </span><span class="p">
</span></span></span><span class="line"><span class="cl"><span class="s">(27997 more lines)</span><span class="p">
</span></span></span></code></pre></div><p>The evaluation metric for this contest is the categorization accuracy. For example, a categorization accuracy of 0.97 indicates that you have correctly classified all but 3% of the images.</p>
<p><img
  src="/images/2017/06/figure_1.png"
  alt="figure_1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="640" height="480"
>
</p>
<p>圖像化類似這個樣子；一個 28*28 黑白階的圖片。程式代碼和 MNIST 練習時代碼類似，額外加上了 CSV 的讀取與儲存邏輯。</p>
<p><strong>Kaggle 分數：0.98614</strong></p>
<p>使用了兩次卷積加上一層隱藏層，配上 SGD 優化，目前差不多就是這樣的結果。準備往下一個題目邁進。</p>
<p><a href="https://github.com/KbWen/Kaggle/blob/master/Kaggle_digitRecognizer.py">My Github</a></p>
<h2 id="相關文章">相關文章</h2>
<ul>
<li><a href="/kaggle-titanic/">Kaggle Titanic</a></li>
<li><a href="/kaggle-pm2-5-prediction/">Kaggle PM2.5 Prediction</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>TENSORFLOW 練習4: word2vec</title>
      <link>https://www.kbwen.com/tensorflow-exercise-4-word2vec/</link>
      <pubDate>Fri, 12 May 2017 12:12:33 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/tensorflow-exercise-4-word2vec/</guid>
      <description>TensorFlow 練習：用 Skip-gram 模型實作 Word2Vec 詞向量，學習詞語間語意關聯（king-queen=man-woman），搭配 NCE loss 和 t-SNE 降維視覺化相似詞。</description>
      <content:encoded><![CDATA[<h3 id="把字詞轉成-word-embedding">把字詞轉成 word embedding</h3>
<p>要在字詞中找到他們之間的某種關聯，而不只是分散無意義的符號代表。</p>
<p>做這個問題的核心概念是：
<strong>「假設兩個不同句子中的詞上下文相同，則代表兩個詞的語意相近。」</strong></p>
<p>今天要來使用 skip-gram 模型，一個類似二元分類的方式 (判斷像或是不像)。一開始也同之前的問題，先做數據處理。</p>
<ol>
<li><strong>計算出現數量</strong>：<code>[(most count word1, n1), (second word2, n2)]</code></li>
<li><strong>文字轉成向量</strong>：</li>
</ol>
<p>例如：<code>The actual code for this tutorial is very short</code></p>
<p>生成的 skip-gram pairs 示意：</p>
<ul>
<li><code>([the, code], actual)</code>, <code>([actual, for], code)</code>, &hellip;</li>
<li><code>(actual, the)</code>, <code>(actual, code)</code>, <code>(code, actual)</code>, &hellip;</li>
</ul>
<p>在這之間都會給他編號，轉化為 <code>(10, 20), (10, 30), (30, 10), (30, 40) ...</code> 的形式。</p>
<p>用到 <code>nce_loss</code>，目前我還不是非常熟練，概念上是讓目標詞的機率越高越好，並讓其餘 K 個負面樣本 (negative samples) 的機率降低。</p>
<p>經典案例：
<code>king - queen = man - woman</code>  ==&gt; <code>king - queen + woman = man</code></p>
<p>給 queen 加上負號，並取不要的值，我想是這種感覺吧？</p>
<h3 id="結果">結果</h3>
<p>會把相似的詞分的近一些：</p>
<p><img
  src="/images/2017/05/tf_word2vec.png"
  alt="tf_word2vec"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="640" height="480"
>
</p>
<p>原版 tensorflow 範例有用上 <code>sklearn</code> 的 <code>TSNE</code> 來做降維，在很多地方都比 PCA 效果好。</p>
<p><a href="https://github.com/KbWen/Python_ML/blob/master/Tensorflow_word2vec1.py">My Github</a></p>
<h2 id="系列文章">系列文章</h2>
<ul>
<li><a href="/tensorflow-exercise-1-polynomial-regression/">TensorFlow 練習1：Polynomial Regression</a></li>
<li><a href="/tensorflow-exercise-2-cnn/">TensorFlow 練習2：CNN</a></li>
<li><a href="/tensorflow-exercise-3-fizzbuzz/">TensorFlow 練習3：FizzBuzz</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Tensorflow 練習3: &#39;FizzBuzz&#39;</title>
      <link>https://www.kbwen.com/tensorflow-exercise-3-fizzbuzz/</link>
      <pubDate>Mon, 08 May 2017 21:48:54 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/tensorflow-exercise-3-fizzbuzz/</guid>
      <description>TensorFlow 練習：用神經網路解 FizzBuzz 問題，兩層隱藏層（512&#43;256）搭配 ReLU，分析 batch size 對 local minimum 的影響，加入 dropout 後訓練測試準確率同步達 1.0。</description>
      <content:encoded><![CDATA[<p><a href="https://joelgrus.com/2016/05/23/fizz-buzz-in-tensorflow/">Joel Grus — FizzBuzz in TensorFlow</a></p>
<p>從網路上看到的幽默問題，算是一個很有趣的使用，適合在做完 Classification 後練習。</p>
<p>輸入資料處理和原版程式碼一樣，因為還蠻直觀的：</p>
<ul>
<li>1 &ndash; 000000001 &ndash; <code>[0 0 0 0 0 0 0 0 1]</code></li>
<li>2 &ndash; 000000010 &ndash; <code>[0 0 0 0 0 0 0 1 0]</code></li>
<li>&hellip;&hellip;&hellip;</li>
</ul>
<p>輸出則是用 <code>[1 0 0 0]</code> <code>[0 1 0 0]</code> <code>[0 0 1 0]</code> <code>[0 0 0 1]</code> 來代表四個分類。</p>
<p>輸入輸出都是一個矩陣的形式。利用兩層 hidden layer 分別是 512 和 256，激勵函數選擇 relu，剩下的就交給 tensorflow 分類。</p>
<h3 id="結果">結果</h3>
<p>一開始一直分不出來，都會卡在把每個資料都判定成同一類 (0.533)。後來減低每次訓練丟進去的量就 OK 了 (忘記一開始做分類時也只丟一點點進去)。</p>
<p><img
  src="/images/2017/05/tf_fizz0.png"
  alt="tf_fizz0"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="498" height="590"
>
</p>
<p>卡在 0.533 代表他受非 5 非 3 倍數的值影響很大，畢竟是機率最高的地方。也看成是 local minimum，要跳出去就是使用 batch。</p>
<p>這是有加入 0.8 dropout 的結果，可以看到訓練跟測試差不多，而且很快就達到 1.0 的準確率。</p>
<p><a href="https://github.com/KbWen/Python_ML/blob/master/Tensorflow_fizzbuzz.py">My GitHub</a></p>
<h2 id="系列文章">系列文章</h2>
<ul>
<li><a href="/tensorflow-exercise-1-polynomial-regression/">TensorFlow 練習1：Polynomial Regression</a></li>
<li><a href="/tensorflow-exercise-2-cnn/">TensorFlow 練習2：CNN</a></li>
<li><a href="/tensorflow-exercise-4-word2vec/">TensorFlow 練習4：word2vec</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Tensorflow 練習2: CNN</title>
      <link>https://www.kbwen.com/tensorflow-exercise-2-cnn/</link>
      <pubDate>Sun, 07 May 2017 20:28:02 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/tensorflow-exercise-2-cnn/</guid>
      <description>TensorFlow 練習：用卷積神經網路 CNN 辨識 MNIST 手寫數字，實作兩層 convolution &#43; max pooling &#43; dropout 架構，準確率達 97%~99%。</description>
      <content:encoded><![CDATA[<h4 id="利用-cnn-來預測數字-mnist">利用 CNN 來預測數字 (MNIST)</h4>
<p>輸入圖形是一個 28<em>28 灰階 0~9 的數字。輸出是一個 1</em>10 的矩陣，代表預測 0~9 的機率分布。</p>
<p>流程如下：
<code>輸入</code> &ndash; <code>convolution</code> &ndash; <code>pooling</code> &ndash; <code>convolution</code> &ndash; <code>pooling</code> &ndash; <code>hidden layer</code> &ndash; <code>output</code></p>
<p>在代碼中用到 <code>[None, xx, xx]</code> 和 <code>[-1, XX, xx]</code>，代表我們忽略輸入的大小（batch size），它會跟隨著輸入自動改變。</p>
<p><code>max pooling</code> 表示我們選擇的是那個 kernel size 裡的最大值。結構中也加入了 <code>dropout</code> 來避免 overfitting。</p>
<h4 id="結果">結果</h4>
<p>上圖是沒有 dropout，下圖是有 dropout。就這個例子而言差別不大，但還是看得出來上面的訓練會比測試好。</p>
<p><img
  src="/images/2017/05/tf-cnn1.png"
  alt="tf.cnn1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="1533" height="877"
>
</p>
<p>準確率落在 <strong>97%~99%</strong> 之間 (1000 次訓練)。
（目前使用 <code>GradientDescent</code>，更換優化器應該會更好）。</p>
<p><a href="https://github.com/KbWen/Python_ML/blob/master/Tensorflow_CNNtest1.py">My GitHub</a></p>
<h2 id="系列文章">系列文章</h2>
<ul>
<li><a href="/tensorflow-exercise-1-polynomial-regression/">TensorFlow 練習1：Polynomial Regression</a></li>
<li><a href="/tensorflow-exercise-3-fizzbuzz/">TensorFlow 練習3：FizzBuzz</a></li>
<li><a href="/tensorflow-exercise-4-word2vec/">TensorFlow 練習4：word2vec</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>PYTHON 機器學習基石 LS-PLA</title>
      <link>https://www.kbwen.com/python-machine-learning-basics-ls-pla/</link>
      <pubDate>Tue, 18 Apr 2017 20:13:39 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/python-machine-learning-basics-ls-pla/</guid>
      <description>實作 Perceptron Learning Algorithm (PLA)：根據林軒田機器學習基石課程，從零實作 Naive PLA 與 Pocket PLA，解決 linear separable 二元分類問題。</description>
      <content:encoded><![CDATA[<h2 id="perceptron-learning-algorithm-pla">Perceptron Learning Algorithm (PLA)</h2>
<p>根據林軒田教授的機器學習基石課程，實作一下這個基礎的機器學習演算法。
我們探討的是監督式學習 (Supervised learning) 大架構下的二元分類 (YES/NO) 問題。</p>
<h3 id="perceptron--linear-binary-classifiers">Perceptron ⇔ linear (Binary) Classifiers</h3>
<p><img
  src="/images/2017/04/ep_pla1.png"
  alt="EP_PLA1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="959" height="711"
>
</p>
<p>我們有一組訓練資料 <strong>D</strong>，包含數據 <strong>Xn</strong> 和對應的 <strong>Yn</strong> (在這裡就是 1, -1)；Hypothesis set <strong>H</strong> 代表全部可能的解 (無限多條線)，經過演算法 <strong>A</strong>，從 <strong>H</strong> 找到一個可能的 <strong>g</strong> 與我們的目標函數 <strong>f</strong> 相近。</p>
<p><img
  src="/images/2017/04/ep_pla2.png"
  alt="EP_PLA2"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="959" height="711"
>
</p>
<p>這個演算法的主要兩大步驟：找到錯誤的點，進行向量修正。
詳細課程可以參考教授的講解！！其中 <code>naive cycle</code> 是常用的作法。</p>
<p>這方法只適用於 <strong>linear separable PLA</strong>。</p>
<p><img
  src="/images/2017/04/ep_pla3.png"
  alt="EP_PLA3"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="959" height="710"
>
</p>
<p>除此以外，當資料中有雜訊也無法使用這個方式，目前在線性問題上較好的解是用 <strong>Pocket PLA</strong>。</p>
<h2 id="linear-separable-pla">Linear separable PLA</h2>
<p>首先整理一下資料。把原始格式如 <code>['x0\ty0\tz0\nx1\ty1\tz1\nx2\ty2\tz2\n....']</code> 轉換為 <code>array([[(x0, y0), z0], [(x1, y1), z1], [(x2, y2), z2].....])</code> 的格式。</p>
<p><img
  src="/images/2017/04/ep_pla4.png"
  alt="EP_PLA4"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="752" height="624"
>
</p>
<p>NAIVE PLA 實作，畫線則是用 <code>ax + by = 0</code>。</p>
<p><img
  src="/images/2017/04/ep_pla5.png"
  alt="EP_PLA5"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="749" height="621"
>
</p>
<h2 id="最終結果">最終結果</h2>
<p><img
  src="/images/2017/04/ep_pla6.png"
  alt="EP_PLA6"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="640" height="544"
>
</p>
<h2 id="pocket-pla">Pocket PLA</h2>
<p>Pocket PLA 是一個貪婪演算法，把最好的權重握在手上繼續往下算，每次都會比較看有沒有比手上的好。停止方式則是讓它運行一定次數，或是多久沒有變更好等等。這裡暫不詳述。</p>
<p><a href="https://github.com/KbWen/Python_ML/tree/master">My GitHub</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Tensorflow 使用GPUs</title>
      <link>https://www.kbwen.com/tensorflow-using-gpus/</link>
      <pubDate>Fri, 14 Apr 2017 12:31:52 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/tensorflow-using-gpus/</guid>
      <description>TensorFlow 使用 GPU 加速運算：用 tf.device() 指定 CPU/GPU 設備，搭配 log_device_placement 和 allow_soft_placement 設定確保運算順利分配。</description>
      <content:encoded><![CDATA[<p>Tensorflow 支援使用 CPU 和 GPU 做運算：</p>
<ul>
<li><code>&quot;/cpu:0&quot;</code>: The CPU of your machine.</li>
<li><code>&quot;/gpu:0&quot;</code>: The GPU of your machine, if you have one.</li>
<li><code>&quot;/gpu:1&quot;</code>: The second GPU of your machine, etc.</li>
</ul>
<p>用 <code>with tf.device()</code> 來分配這個語句下使用的設備。</p>
<p><img
  src="/images/2017/04/tf_gpus1.png"
  alt="TF_GPUs1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="797" height="309"
>
</p>
<p>可以用以下設定來優化運算：</p>
<ul>
<li><code>log_device_placement = True</code>: 紀錄我們使用 device 的情況。</li>
<li><code>allow_soft_placement = True</code>: 避免指定的 device 不存在，讓他能自行分配到存在且可運行的地方。</li>
</ul>
<p><img
  src="/images/2017/04/tf_gpus2.png"
  alt="TF_GPUs2"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="1335" height="270"
>
</p>
<p>我沒有多顆 CPU，其他的語法先不試。</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Tensorflow 練習1 : Polynomial Regression</title>
      <link>https://www.kbwen.com/tensorflow-exercise-1-polynomial-regression/</link>
      <pubDate>Thu, 13 Apr 2017 16:30:42 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/tensorflow-exercise-1-polynomial-regression/</guid>
      <description>TensorFlow 練習：用神經網路擬合二維四次多項式 Polynomial Regression，介紹 tf.placeholder、tf.Variable、square error loss 和梯度下降優化器的基礎用法。</description>
      <content:encoded><![CDATA[<h2 id="使用-tensorflow-分析-regression-的基礎練習">使用 Tensorflow 分析 Regression 的基礎練習</h2>
<h3 id="nerual-network-分析二維四次多項式">Nerual network 分析二維四次多項式</h3>
<p>先定義輸入輸出格式，None表示我們不限制它的Row</p>
<p><img
  src="/images/2017/04/tf_pr1.png"
  alt="TF_PR1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="327" height="156"
>
</p>
<p>在 Tensorflow 中，要定義它是常數、變數，或是從外部輸入，必須要分別指定成：</p>
<ul>
<li><code>tf.constant()</code></li>
<li><code>tf.Variable()</code></li>
<li><code>tf.placeholder()</code></li>
</ul>
<p>他才會是那個形式；而想使用 Tensorflow 的任何內容，必須要用 <code>sess.run()</code> 去啟動它，不然會是 Tensor 的格式。</p>
<p>其中 <code>sess = tf.Session()</code></p>
<p>定義一個 <code>Y = W*x + b</code> 的線性方程，在隱藏層中利用 activation function 去改變它。</p>
<p><img
  src="/images/2017/04/tf_pr2.png"
  alt="TF_PR2"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="475" height="266"
>
</p>
<p>評估模型好壞常用有 square error 和 cross_entropy，這裡利用 square error 計算 loss。</p>
<p>選擇基本的梯度下降並最小化 loss；optimizer 是個小於 1 的值。</p>
<p>設定要訓練的數值和函數 (記得要有一定的雜訊)</p>
<p><img
  src="/images/2017/04/tf_pr3.png"
  alt="TF_PR3"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="489" height="265"
>
</p>
<ul>
<li><code>W shape = (in_dim, hidden_units) = (10,1)</code></li>
<li><code>predictions shape = (200,1)*(1,10)*(10,1) = (200,1)</code></li>
</ul>
<p>訓練 1000 次每 50 次看結果：視覺化和數據化</p>
<p><img
  src="/images/2017/04/tf_pr4.png"
  alt="TF_PR4"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="648" height="418"
>
</p>
<p><code>placeholder</code> 給資料會是一個字典的形式：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">Session</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="o">*****</span><span class="p">,</span> <span class="n">feed_dict</span><span class="o">=</span><span class="p">{</span><span class="n">a</span><span class="p">:</span><span class="n">a_data</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span><span class="n">b_data</span><span class="p">,</span> <span class="o">.....</span><span class="p">})</span>
</span></span></code></pre></div><h3 id="最後結果">最後結果</h3>
<p><img
  src="/images/2017/04/tf_pr5.png"
  alt="TF_PR5"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="158" height="682"
>

<img
  src="/images/2017/04/tf_pr6.png"
  alt="TF_PR6"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="450" height="381"
>

<img
  src="/images/2017/04/tf_pr7.png"
  alt="TF_PR7"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="461" height="91"
>
</p>
<p><a href="https://github.com/KbWen/Python_ML">My GitHub</a></p>
<h2 id="系列文章">系列文章</h2>
<ul>
<li><a href="/tensorflow-exercise-2-cnn/">TensorFlow 練習2：CNN</a></li>
<li><a href="/tensorflow-exercise-3-fizzbuzz/">TensorFlow 練習3：FizzBuzz</a></li>
<li><a href="/tensorflow-exercise-4-word2vec/">TensorFlow 練習4：word2vec</a></li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
