62

一招教你使用 tf.keras 和 eager execution 解决复杂问题

 6 years ago
source link: http://zhuanlan.51cto.com/art/201808/582076.htm?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

生成模型和序列模型总是令我着迷:它们提出的问题与我们初学机器学习时常遇到的问题不同。刚开始学习 ML 时,和很多人一样,我学的是分类和回归。这些可以帮助我们提出并回答以下问题:

  • 图片里是猫还是狗?(分类)
  • 明天有多大概率会下雨?(回归)

分类和回归是非常值得掌握的技能,并且几乎可以无限将这两者用于现实问题。但是,我们可能会提出其它类型的问题,这些问题与之前的十分不同。

  • 能作诗吗?(文本生成)
  • 能生成一张猫的图片吗?(生成对抗网络)
  • 能翻译句子吗?(神经网络机器翻译)
  • 能根据图片生成标题吗?(图片标注)

muqMJfe.jpg!web

在暑期实习期间,我使用 TensorFlow 的两个最新 API(tf.keras 和 eager execution)开发了这些示例,以下是分享内容。希望你们能觉得它们有用,有趣!

  • Eager execution 是一个由运行定义的命令式接口,一旦从 Python 调用,其操作将被立即执行。这使得入门 TensorFlow 变得更简单,也使研发更直观。
  • tf.keras 是一个高级 API,用于定义具有类似乐高积木的模型。我使用模型子类化(Model subclassing)实现了这些示例,它允许我们通过子类化 tf.keras 模型和定义自己的前向传播来建立完全可定制的模型。当启用 eager execution 时,模型子类化特别有用,因为前向传播可以被命令式地编写。

如果你还不了解这些 API,可以通过 tensorflow.org/tutorials 上的 notebook 来了解更多信息,其中包含最近更新的示例。

以下每个示例都是端到端的,并遵循类似的模式:

  • 自动下载训练数据。
  • 预处理训练数据,并创建 tf.data 数据集以便在输入管道中使用。
  • 使用 tf.keras 模型子类化 API 定义模型。
  • 使用 eager execution 训练模型。
  • 演示如何使用训练好的模型。

示例#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

鉴于莎士比亚著作颇丰,这个例子学会了生成与莎翁风格相似的文本:

mABbueY.jpg!web

在莎士比亚文集训练 30 个 epoch 后,notebook 生成的示例文本。

虽然大部分句子都没有意义(因为这个简单的模型还没有学会语言的含义),但令人印象深刻的是,大多数单词拼写正确,并且它生成的剧本结构看起来与原始剧本的结构相似。(这是一个基于字符的模型,我们训练它的时间不长——但它已经成功地从零开始学会了这两件事)。只要你想,更改一行代码就可以更改数据集。)

想要更进一步了解 RNN,可以去看 Andrej Karpathy 的优秀文章——《The Unreasonable Effectiveness of Recurrent Neural 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

jqQ3Ebu.jpg!web

在 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

uYzMveN.jpg!web

上述翻译的注意力图。

示例 #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

iam2miv.jpg!web

图像的预测标题。

fmArYve.jpg!web

上图中每个单词的注意力图。

原文链接:

https://medium.com/tensorflow/complete-code-examples-for-machine-translation-with-attention-image-captioning-text-generation-51663d07a63d

【本文是51CTO专栏机构“机器之心”的原创文章,微信公众号“机器之心( id: almosthuman2014)”】

戳这里,看该作者更多好文


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK