一招教你使用 tf.keras 和 eager execution 解決複雜問題

ofollow,noindex" target="_blank">機器之心 翻譯
Yash Katariya 作者
一招教你使用 tf.keras 和 eager execution 解決複雜問題
本文作者利用 TensorFlow 的兩個最新 API(tf.keras 和 eager execution)解決了四類複雜問題:文字生成、生成對抗網路、神經網路機器翻譯、圖片標註。文中對此進行了詳細描述,並附上其 notebook 地址。
生成模型和序列模型總是令我著迷:它們提出的問題與我們初學機器學習時常遇到的問題不同。剛開始學習 ML 時,和很多人一樣,我學的是分類和迴歸。這些可以幫助我們提出並回答以下問題:
-
圖片裡是貓還是狗?(分類)
-
明天有多大概率會下雨?(迴歸)
分類和迴歸是非常值得掌握的技能,並且幾乎可以無限將這兩者用於現實問題。但是,我們可能會提出其它型別的問題,這些問題與之前的十分不同。
-
能作詩嗎?(文字生成)
-
能生成一張貓的圖片嗎?(生成對抗網路)
-
能翻譯句子嗎?(神經網路機器翻譯)
-
能根據圖片生成標題嗎?(圖片標註)
在暑期實習期間,我使用TensorFlow 的兩個最新 API(tf.keras 和 eager execution)開發了這些示例,以下是分享內容。希望你們能覺得它們有用,有趣!
-
Eager execution 是一個由執行定義的命令式介面,一旦從 Python 呼叫,其操作將被立即執行。這使得入門TensorFlow 變得更簡單,也使研發更直觀。
-
tf.keras 是一個高階 API,用於定義具有類似樂高積木的模型。我使用模型子類化(Model subclassing)實現了這些示例,它允許我們通過子類化 tf.keras 模型和定義自己的前向傳播來建立完全可定製的模型。當啟用 eager execution 時,模型子類化特別有用,因為前向傳播可以被命令式地編寫。
如果你還不瞭解這些 API,可以通過 tensorflow.org/tutorials 上的 notebook 來了解更多資訊,其中包含最近更新的示例。
以下每個示例都是端到端的,並遵循類似的模式:
1. 自動下載訓練資料。
2. 預處理訓練資料,並建立 tf.data 資料集以便在輸入管道中使用。
3. 使用 tf.keras 模型子類化 API 定義模型。
4. 使用 eager execution 訓練模型。
5. 演示如何使用訓練好的模型。
示例#1:文字生成
第一個示例是文字生成,我們用 RNN 生成與莎士比亞風格類似的文字。你可以通過下面的連結在 Colaboratory 上執行它(或者從 GitHub 下載它當做 Jupyter notebook)。程式碼在 notebook 中有詳細解釋。
示例 1 notebook:https://colab.research.google.com/github/tensorflow/tensorflow/blob/master/tensorflow/contrib/eager/python/examples/generative_examples/text_generation.ipynb
鑑於莎士比亞著作頗豐,這個例子學會了生成與莎翁風格相似的文字:
在莎士比亞文集訓練 30 個 epoch 後,notebook 生成的示例文字。
雖然大部分句子都沒有意義(因為這個簡單的模型還沒有學會語言的含義),但令人印象深刻的是,大多數單詞拼寫正確,並且它生成的劇本結構看起來與原始劇本的結構相似。(這是一個基於字元的模型,我們訓練它的時間不長——但它已經成功地從零開始學會了這兩件事)。只要你想,更改一行程式碼就可以更改資料集。)
想要更進一步瞭解 RNN,可以去看 Andrej Karpathy 的優秀文章——《The Unreasonable Effectiveness of RecurrentNeural Networks》。如果你想了解更多關於用 Keras 或 tf·Keras 實現 RNN 的資訊,我們推薦 Francois Chollet 的 notebook。
Francois Chollet 的 notebook:https://github.com/fchollet/deep-learning-with-python-notebooks
示例 #2:DCGAN
在這個示例中,我們用 DCGAN 生成手寫數字。生成對抗網路(GAN)由生成器和判別器組成。生成器的工作是生成逼真的影象,以欺騙判別器。判別器的工作是在真影象和偽影象(由生成器生成)之間進行分類。下面看到的輸出是在使用《Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks》一文中所述的網路架構和超引數訓練生成器和判別器 150 個 epoch 之後生成的。
示例 2 notebook:https://colab.research.google.com/github/tensorflow/tensorflow/blob/master/tensorflow/contrib/eager/python/examples/generative_examples/dcgan.ipynb
在 150 個 epoch 中每 10 個 epoch 生成一次影象的 GIF。你可以在 notebook 中找到生成這種 GIF 的程式碼。
示例#3:注意力神經網路機器翻譯
這個示例訓練模型將西班牙語句子翻譯成英語句子。模型訓練好後,你可以輸入西班牙語,例如「¿todavia estan en casa?」,並返回英文翻譯:「are you still at home?」
下圖是注意力圖。它顯示了翻譯時,輸入句子的哪些部分會引起模型的注意。例如,當模型翻譯「cold」這個詞時,它正看著「mucho」,「frio」,「aqui」。我們使用 tf.keras 和 eager execution 從零開始實現 Bahdanau Attention,詳細解釋在 notebook 中。你還可以將此實現用作實現自定義模型的基礎。
示例 3 notebook:https://colab.research.google.com/github/tensorflow/tensorflow/blob/master/tensorflow/contrib/eager/python/examples/nmt_with_attention/nmt_with_attention.ipynb
上述翻譯的注意力圖。
示例 #4:注意力影象標註
在此示例中,我們訓練模型用以預測影象的標題。我們還生成了一個注意力圖,它顯示了模型在生成標題時所關注的影象部分。例如,當模型預測單詞「衝浪板」時,它會聚焦在圖片中的衝浪板附近。我們使用 MS-COCO 資料集的子集訓練該模型,該資料集將由 notebook 自動下載。
示例 4 notebook:https://colab.research.google.com/github/tensorflow/tensorflow/blob/master/tensorflow/contrib/eager/python/examples/generative_examples/image_captioning_with_attention.ipynb
影象的預測標題。
上圖中每個單詞的注意力圖。
後續
要了解有關 tf.keras 和 eager 的更多資訊,請密切關注 tensorflow.org/tutorials 以獲取更新內容,並定期檢視此部落格和TensorFlow 的官方推特。
原文連結:https://medium.com/tensorflow/complete-code-examples-for-machine-translation-with-attention-image-captioning-text-generation-51663d07a63d
工程 文字生成 TensorFlow 生成模型 序列模型 API
相關資料
Neural Network
(人工)神經網路是一種起源於 20 世紀 50 年代的監督式機器學習模型,那時候研究者構想了「感知器(perceptron)」的想法。這一領域的研究者通常被稱為「聯結主義者(Connectionist)」,因為這種模型模擬了人腦的功能。神經網路模型通常是通過反向傳播演算法應用梯度下降訓練的。目前神經網路有兩大主要型別,它們都是前饋神經網路:卷積神經網路(CNN)和迴圈神經網路(RNN),其中 RNN 又包含長短期記憶(LSTM)、門控迴圈單元(GRU)等等。深度學習是一種主要應用於神經網路幫助其取得更好結果的技術。儘管神經網路主要用於監督學習,但也有一些為無監督學習設計的變體,比如自動編碼器和生成對抗網路(GAN)。
來源:機器之心
Generative Adversarial Networks
生成對抗網路是一種無監督學習方法,是一種通過用對抗網路來訓練生成模型的架構。它由兩個網路組成:用來擬合數據分佈的生成網路G,和用來判斷輸入是否“真實”的判別網路D。在訓練過程中,生成網路-G通過接受一個隨機的噪聲來儘量模仿訓練集中的真實圖片去“欺騙”D,而D則儘可能的分辨真實資料和生成網路的輸出,從而形成兩個網路的博弈過程。理想的情況下,博弈的結果會得到一個可以“以假亂真”的生成模型。
Hyperparameter
在機器學習中,超引數是在學習過程開始之前設定其值的引數。 相反,其他引數的值是通過訓練得出的。 不同的模型訓練演算法需要不同的超引數,一些簡單的演算法(如普通最小二乘迴歸)不需要。 給定這些超引數,訓練演算法從資料中學習引數。相同種類的機器學習模型可能需要不同的超引數來適應不同的資料模式,並且必須對其進行調整以便模型能夠最優地解決機器學習問題。 在實際應用中一般需要對超引數進行優化,以找到一個超引數元組(tuple),由這些超引數元組形成一個最優化模型,該模型可以將在給定的獨立資料上預定義的損失函式最小化。
來源: Wikipedia
Generative Model
在概率統計理論中, 生成模型是指能夠隨機生成觀測資料的模型,尤其是在給定某些隱含引數的條件下。 它給觀測值和標註資料序列指定一個聯合概率分佈。 在機器學習中,生成模型可以用來直接對資料建模(例如根據某個變數的概率密度函式進行資料取樣),也可以用來建立變數間的條件概率分佈。
來源: 維基百科
Machine Learning
機器學習是人工智慧的一個分支,是一門多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、計算複雜性理論等多門學科。機器學習理論主要是設計和分析一些讓計算機可以自動“學習”的演算法。因為學習演算法中涉及了大量的統計學理論,機器學習與推斷統計學聯絡尤為密切,也被稱為統計學習理論。演算法設計方面,機器學習理論關注可以實現的,行之有效的學習演算法。
來源:Mitchell, T. (1997). Machine Learning. McGraw Hill.
Machine translation
機器翻譯(MT)是利用機器的力量「自動將一種自然語言(源語言)的文字翻譯成另一種語言(目標語言)」。機器翻譯方法通常可分成三大類:基於規則的機器翻譯(RBMT)、統計機器翻譯(SMT)和神經機器翻譯(NMT)。
來源:機器之心
Tensor
張量是一個可用來表示在一些向量、標量和其他張量之間的線性關係的多線性函式,這些線性關係的基本例子有內積、外積、線性對映以及笛卡兒積。其座標在 維空間內,有 個分量的一種量,其中每個分量都是座標的函式,而在座標變換時,這些分量也依照某些規則作線性變換。稱為該張量的秩或階(與矩陣的秩和階均無關係)。 在數學裡,張量是一種幾何實體,或者說廣義上的“數量”。張量概念包括標量、向量和線性運算元。張量可以用座標系統來表達,記作標量的陣列,但它是定義為“不依賴於參照系的選擇的”。張量在物理和工程學中很重要。例如在擴散張量成像中,表達器官對於水的在各個方向的微分透性的張量可以用來產生大腦的掃描圖。工程上最重要的例子可能就是應力張量和應變張量了,它們都是二階張量,對於一般線性材料他們之間的關係由一個四階彈性張量來決定。
來源: 維基百科

機器之心是國內領先的前沿科技媒體和產業服務平臺,關注人工智慧、機器人和神經認知科學,堅持為從業者提供高質量內容和多項產業服務。
推薦文章
