（音乐）
大家好！
我是 Francois，
我将跟你们讲讲如何将 Keras API 整合入 TensorFlow
首先，Keras 是什么呢？
如果你听过 TensorFlow，
你应该也知道 Keras， 不过，以防万一，
我还是要介绍一下
Keras 是一种
可以让构建深层学习模型 更加容易和快捷的 API
所以，它是一个深度学习的工具 为了使用的简便性
降低复杂性 减少认知负荷
如果你使得深度学习变得容易，
那么它也会被更多人接受
所以，Keras的关键理念就是
让每个人都能掌握深度学习
我们相信，在不久的将来，
深度学习将成为每个开发者的工具盒
它不仅仅会成为专家和研究者们的工具，
它会被大家利用
TensorFlow 这样的平台
和 Keras 这样的 API 也同样
所以，对 Keras 比较好的理解是
它不同于图书馆、代码库
而是一种 API 规格
而且，
它有几种不同的实施
Theano
是两年前发布的
最初的 Keras
当然，还有 TensorFlow
在将来还会有更多
比如，Microsoft
正在研究一种 Keras 实施
迄今为止，TensorFlow 的实施
分开了（听不清）很多用户
我们现在所做的是将 Keras API
直接带入 Keras 项目
带入 TensorFlow 项目
我们相信那是朝
让所有人认知 TensorFlow 和 深度学习 迈出了一大步
具体来说，
我们要将 Keras 兼容模型 tf.keras
带入 TensorFlow
这是一个 Keras 规格的实施
这是从 TensorFlow 基础建立而来的
作为这个行动的一部分
我们将要引入新数据结构到 TensorFlow 的核心
比如 Martin 刚才介绍的层
还有模型
包含了图画层面
这些曾经是 Keras 的数据结构
现在它们将在 TensorFlow 核心
以及 tf.keras 模型之间分享
那么，由于这个 Keras 实施
建立在
结构外壳的基础之上，
它和所有的 TensorFlow 的功能兼容
这意味着它也和（听不清）兼容
Martin 介绍的那个试验 API
所以，如果你是 Keras 的用户 这对你的意义是
首先，它给你带来更高的灵活性
你可以很容易地混合并且匹配
纯粹的 TensorFlow 功能和 Keras 功能
那么，你可以建立更多 强大的，更灵活的模型
还有，你可以通过（听不清）
Martin 介绍的 TensorFlow 训练 API
获取更高级的，更强大的特征
你可以获得
Keras 模型便捷简易的分布训练
获得 Cloud ML 的训练
以及超参数分布训练，真的非常强大
你可以很容易地部署 Keras 模型
用于 TensorFlow 服务
如果你是 TensorFlow 的用户
这个变化对你意味着什么呢？
基本上，它会让你得以访问全部 Keras API
让你的工作更轻松
而无需抛开现有的 TensorFlow 工作事项
所以，你可以利用 Keras API
而不失灵活性
你不必全部采用 Keras
比如，你可以仅仅采用需要的层
它还能让你访问任何现存的
Keras 的开源代码
你可以到 Github，拷贝一些 Keras 代码
将它放入你的代码库中 只需要调整输入，
就行了
所以这使得你可以访问 很多开放的开源代码
你可以把它放入你的 TensorFlow
工作流程中。
更具体一点讲，
我会给你们展示一下
当你在 TensorFlow 上使用 Keras 时
工作流程是怎样的
让我们来看看视频问题的回答模型
用 Keras 定义一个模型
来解决这个问题
我们会在分布设置中 利用高阶 TensorFlow 的培训 API
对它进行重新训练
这就是我们要研究的问题
这里有些视频 大概是4个画幅每秒取样
差不多10秒一个视频
所以，我们每个视频大概有40画
我们会问关于视频的问题
关于视频内容
这个视频里，一位女士
正把东西打包进车
你可以问，她在做什么？
她衣服的颜色是什么？
回答得是一个词
所以，我们构建了一个深度学习模型
它将以画面顺序作为视频的输入
所以40个画幅的次序
模型应该输出一个单词，即回答
所以，如果你问这个女人在做什么
她在弄包裹
这很有意思 因为，如果你只是
用一个画幅并尝试训练（听不清）
例如，回答这个问题
问题是，如果只从单个画面看，
她也可能在拆包裹，对吗？
但你知道她其实是在打包
因为画幅的次序
看看第二个画幅 毯子在车外
下一个画幅，在车内
我们期望所有的计划模型
能够衡量画幅的顺序
从而正确回答这类问题
不用说，这是一个相当艰巨的问题
几年以前，三到四年以前
在 TensorFlow 之前，在 Keras 之前
只有为数不多的大公司或者 资金非常充足的研究室
才能做到这一点
尤其是
如果你想在一组 GPU 上做模型训练
现在有了 TensorFlow 作为平台
有了 Keras API，我们
正让这三个难题可以让每个
拥有基本的（听不清）脚本功能的人 有能力解决
那么，我们就把深度学习的能力
赋予了每个人
这个模型，你可能会用来解决这个问题。
在高阶， 它有两个分支
其中一个是为了
将视频输入编码成
单矢量 另一个是将问题编码
编词成单矢量
那么，有单矢量
包含了全部视频信息，
另外一个包含了全部问题
然后我们再连接两个载体
这给了我们一个单矢量
编码了全部问题的信息
结合了视频和问题
绝妙之处就在于此， 而深度学习的魔力在于
知觉输入，比如视频，
语义，
嵌入知觉输入
就是把语义嵌入几何空间
把意思转化成矢量
就可以发现
这些几何空间有趣的转换
那就是深度学习的绝妙之处
所以，在我们例子里
我们将要用这个矢量编码全部的问题
我们将要在上面训练全部连接的（听不清）
它会得出一个预定义词汇上的 Sofmax
因此
最有可能得到的词汇
正是问题的答案
所以，如果你现在看看更高水平的细节
我们如何将一个视频转变成一个单一矢量呢？
我们又如何将一个问题转成矢量呢？
对这个视频，
我们把它作为一系列画面
每一幅都是一张图片
RGB，它有高度、宽度、厚度，颜色深浅度等
其他顺序，你可以用
（听不清）将每个画幅转化成单矢量。
本质上说，你是利用了
预先训练的网络的条件库，
而后，做一些引导提取一个矢量
编码画幅的视觉内容
而你从中得到的是
这个视频作为一系列矢量而固定
每个矢量编码一画幅的视觉内容
然后，获取序列，在 LSTM 里运行
我想你应该了解 LSTM，
基本来说，它是一种（听不清）类型的网络
能够处理序列并考虑到顺序
LSTM
会输出一个编码全部视频信息的单矢量
要将一个问题转成矢量
流程很相似。
我们将一个问题
表现为一个整数序列， 每个数字代表一个单词
然后我们将每个单词定位到词汇矢量
通过一个嵌入程序
那么，我们就可以得到
表现为序列矢量的单词序列
我们通过另外一个 LSTM 层面运行
它会把整个问题
编码成单矢量。
所以，在 Keras，这就是
我们将用来实施模型的构造
实际上只是前一个图画的
简单转换
所以，对于视频编码而言，基本上
是以5D张量开始
第一个轴是批轴
然后是时间轴
3D 张量 编码一个框架
接着应用一个初始 v3 网路，
在 ImageNet 上进行预先训练5D张量的每个画幅
以提取一个矢量，每个画幅一个特征矢量
由此，我们得到了
一系列视觉向量， 将会在 LSTM 层里运行
至于嵌入问题部分，
我们简单地利用嵌入层来定位问题
一个序列的整数成为一个序列向量
我们将它在 LSTM 层里运行
最后，我们用 concat 操作
连接两个向量
我们堆叠了几个密集层
最终得到一个预定义词汇的 Sofmax
通过编码为 one-hot 矢量的目标答案
训练它。
那么实施是怎样的呢？
很简单。
你可以看到，
这里只用了五行来编码视频。
第一行，
只是确定了视频输入的框架
它是5D张量
通过一个形状参数，
你不必明确批量大小
所以，第一个轴设定为 none，是时间轴
将它设定为 none 是因为想让它可行
我们想小一些的能够处理
任意框架数的视频
有了单一框架的形状，
单一的框架是150x150RGB图画
那么，它的张量就是150，150x3
下一行，
我们要在一行内，
例示初始v3网络
它能自动加载预训练的权重
我们要使该网络成型
以提取视觉特征。
本质上，我们不会包含
v3的分级部分
只在卷积基层
接着我们要
在瓶颈层之上应用一些均衡牵引
你只需要提取一个矢量 图像输入
然后，下一行我们要设置（听不清）
为不可训练的
这意味着，在训练过程中
我们不会更新权重
为什么呢？
因为它是预训练模型
如果你在训练时要更新权重
在这个新问题的回答上
我们可能就会破坏
模型已通过 ImageNet 学到的演示
所以你不要那么做
只要冻结它
下一步，运用时间分布层
来（听不清）
并且将其应用于
视频输入的时间轴的每一步
此时间分布层 只是采取这个（听不清）
并应用到每一个框架
这一层得到的
只是一个3D 张量，
就是一系列视觉矢量
每个矢量就代表一个框架
最后，我们通过 LSTM 层运行这个序列张量
得到一个单一矢量
就编码了全部视频
你会注意到， 当我们实例化这个
Keras LSTM 层时， 我们只指定了一个参数
也就是 LSTM 层的单位数量
仔细想想，你就会发现这很厉害
因为有许多的高级配置参数
在 LSTM 中
当你使用 LSTM 时
会有很多这样的体验
例如，你要记住
权重的记录应当用
（听不清）初始化
此外，（听不清）的偏差
应当初始化到1
如果你想要自己的训练顺利进行
对这些问题就要注意
Keras 的核心原则之一就是
包含最佳实践
所以每一个 Keras 层
都有了优化好的默认配置
考虑了所有最好的实践
你不能仅仅依赖 Keras 的默认为好的默认
就直接在工具盒外训练模型
而不对这些超参数
进行调整。
所以，最佳实践包括了
你只要指定几个关键参数
比如单元数，
其他的就是“开箱即用”了
对于编码，问题就更简单了
我们仅有三行
首先，我们为问题指定输入张量
每个问题就是一个
最多有100整数的序列
所以，我们将问题限制在100 个单字的长度
接着把所有整数编码到单词矢量
就有了这个嵌入层
注意，我们在此嵌入层上用了掩蔽
也就是说，
如果我们对问题（听不清）
如果问题短于100 个单词
我们只需用0填补剩下的来达到100
这就创建了一个掩蔽
将会在之后传到（听不清）层
那么我们就最终把四矢量序列
编码成单一矢量，通过另一个 LSTM 层
请记住，当我们使用这些预培训的初创网络
加载这些预培训的权重
是非常基础的
因为你处理的数据组相对较小
这个设置本身不会有足够的数据
让你学会提取有趣的视觉特征
所以你需要让该网络真的进行训练
你需要平衡这些预培训的权重
最后，才会得到回答单词
利用视频矢量和问题矢量
以一个联通操作将它们接合起来
最后，应用几个密集层
得到1000单元
我们有一个可能答案的词汇表
只是1000个不同单词
这是明确网络训练构造的
一个步骤
实例化一个模型
也就是图层的一个容器
通过
明确模型模型的输入输出
就把它们实例化了
你可以添加任何数量的输入和输出
让模型知道
应当在训练中使用广告优化
这就是最后的（听不清）
你会注意到
用1000单元来指定分类层时， 我们没有指定任何激活
所以它只是一个线性层
SoftMax 的激活将包括在损失中
所以，总结一下全部的代码 大约只有十五行
确实很短。
本质上讲，我们将这个复杂的构造
包括加载预培训权重，
转化为少数几行
真正地降低了复杂性
通过让你在每一层上可依赖不同的配置
减轻了认知负荷
你不必去理会
LSTM 层的大部分参数
而它最棒的部分是，
由于此 Keras 的实施
是建立在 TensorFlow 基础上
它和估计量以及实验
完全相容
只要一行， 你就可实例化 TensorFlow
试验
这让你可以分布训练
可以在云ML上训练等等 也可以访问 TensorFlow
服务端
所以，只用几行你就可以开始你的实验
就像你所做的问题回答模型
查阅用户数据和问题数据
以及回答数据，从（听不清）数据框架
你还可以开始用几行
在（听不清）上开始运行
从本演讲中学到的很简单
我们所说的是 Keras API
我们将它带入 TensorFlow
它是一个新的 Keras 实施
建立于 TensorFlow
你作为一个 Keras 用户，会获得更大灵活性
你可以混合并匹配
纯粹的 TensorFlow 功能和 Karas 模型
作为 TensorFlow 用户 你可以获取完全的 Keras API
工作将变得更容易
所以你可预计这些 Keras 兼容模型
是作为 tf.contrib.keras by TF 1.1 存在
最后将会是 TensorFlow 1.2 的 tf.keras
所以，我们相信这是朝 TensorFlow 和深度学习
被每个人掌握
迈出了一大步
这就是我今天所要讲的内容
下面我们会有一些零食给大家
感谢收听本演讲！
（音乐）