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 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

在 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

工程API序列模型生成模型TensorFlow文本生成
5
相关数据
机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

TensorFlow技术

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

机器翻译技术

机器翻译(MT)是利用机器的力量「自动将一种自然语言(源语言)的文本翻译成另一种语言(目标语言)」。机器翻译方法通常可分成三大类:基于规则的机器翻译(RBMT)、统计机器翻译(SMT)和神经机器翻译(NMT)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

生成模型技术

在概率统计理论中, 生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下。 它给观测值和标注数据序列指定一个联合概率分布。 在机器学习中,生成模型可以用来直接对数据建模(例如根据某个变量的概率密度函数进行数据采样),也可以用来建立变量间的条件概率分布。

生成对抗网络技术

生成对抗网络是一种无监督学习方法,是一种通过用对抗网络来训练生成模型的架构。它由两个网络组成:用来拟合数据分布的生成网络G,和用来判断输入是否“真实”的判别网络D。在训练过程中,生成网络-G通过接受一个随机的噪声来尽量模仿训练集中的真实图片去“欺骗”D,而D则尽可能的分辨真实数据和生成网络的输出,从而形成两个网络的博弈过程。理想的情况下,博弈的结果会得到一个可以“以假乱真”的生成模型。

推荐文章
暂无评论
暂无评论~