前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >keras中文doc之三

keras中文doc之三

作者头像
用户1908973
发布2018-07-25 11:38:13
4850
发布2018-07-25 11:38:13
举报
文章被收录于专栏:CreateAMindCreateAMind

前面介绍了keras文档一二 keras中文文档, keras中文-快速开始Sequential模型

keras文档内容丰富(视觉、语言、cnn、lstm、常用模型等),代码思路清晰,非常方便入门了解。

快速开始泛型模型

Keras泛型模型接口是用户定义多输出模型、非循环有向模型或具有共享层的模型等复杂模型的途径

这部分的文档假设你已经对Sequential模型已经比较熟悉

让我们从简单一点的模型开始

第一个模型:全连接网络

Sequential当然是实现全连接网络的最好方式,但我们从简单的全连接网络开始,有助于我们学习这部分的内容。在开始前,有几个概念需要澄清:

  • 层对象接受张量为参数,返回一个张量。张量在数学上只是数据结构的扩充,一阶张量就是向量,二阶张量就是矩阵,三阶张量就是立方体。在这里张量只是广义的表达一种数据结构,例如一张彩色图像其实就是一个三阶张量,它由三个通道的像素值堆叠而成。而10000张彩色图构成的一个数据集合则是四阶张量。
  • 输入是张量,输出也是张量的一个框架就是一个模型
  • 这样的模型可以被像Keras的Sequential一样被训练
代码语言:javascript
复制

所有的模型都是可调用的,就像层一样

利用泛型模型的接口,我们可以很容易的重用已经训练好的模型:你可以把模型当作一个层一样,通过提供一个tensor来调用它。注意当你调用一个模型时,你不仅仅重用了它的结构,也重用了它的权重。

代码语言:javascript
复制

多输入和多输出模型

使用泛型模型的一个典型场景是搭建多输入、多输出的模型。

考虑这样一个模型。我们希望预测Twitter上一条新闻会被转发和点赞多少次。模型的主要输入是新闻本身,也就是一个词语的序列。但我们还可以拥有额外的输入,如新闻发布的日期等。这个模型的损失函数将由两部分组成,辅助的损失函数评估仅仅基于新闻本身做出预测的情况,主损失函数评估基于新闻和额外信息的预测的情况,即使来自主损失函数的梯度发生弥散,来自辅助损失函数的信息也能够训练Embeddding和LSTM层。在模型中早点使用主要的损失函数是对于深度网络的一个良好的正则方法。总而言之,该模型框图如下:

让我们用泛型模型来实现这个框图

主要的输入接收新闻本身,即一个整数的序列(每个整数编码了一个词)。这些整数位于1到10,000之间(即我们的字典有10,000个词)。这个序列有100个单词。

代码语言:javascript
复制

最后,我们定义整个2输入,2输出的模型:

代码语言:javascript
复制

共享层

另一个使用泛型模型的场合是使用共享层的时候。

考虑微博数据,我们希望建立模型来判别两条微博是否是来自同一个用户,这个需求同样可以用来判断一个用户的两条微博的相似性。

一种实现方式是,我们建立一个模型,它分别将两条微博的数据映射到两个特征向量上,然后将特征向量串联并加一个logistic回归层,输出它们来自同一个用户的概率。这种模型的训练数据是一对对的微博。

因为这个问题是对称的,所以处理第一条微博的模型当然也能重用于处理第二条微博。所以这里我们使用一个共享的LSTM层来进行映射。

首先,我们将微博的数据转为(140,256)的矩阵,即每条微博有140个字符,每个单词的特征由一个256维的词向量表示,向量的每个元素为1表示某个字符出现,为0表示不出现,这是一个one-hot编码。

【Tips】之所以是(140,256)是因为一条微博最多有140个字符(据说现在要取消这个限制了),而扩展的ASCII码表编码了常见的256个字符。原文中此处为Tweet,所以对外国人而言这是合理的。如果考虑中文字符,那一个单词的词向量就不止256了。【@Bigmoyan】

先暂停一下,看看共享层到底输出了什么,它的输出数据shape又是什么

层“节点”的概念

无论何时,当你在某个输入上调用层时,你就创建了一个新的张量(即该层的输出),同时你也在为这个层增加一个“(计算)节点”。这个节点将输入张量映射为输出张量。当你多次调用该层时,这个层就有了多个节点,其下标分别为0,1,2...

在上一版本的Keras中,你可以通过layer.get_ouput()方法来获得层的输出张量,或者通过layer.output_shape获得其输出张量的shape。这个版本的Keras你仍然可以这么做(除了layer.get_ouput()ouput()替换)。但如果一个层与多个输入相连,会出现什么情况呢?

如果层只与一个输入相连,那没有任何困惑的地方。.ouput()将会返回该层唯一的输出

够简单吧?

对于input_shapeoutput_shape也是一样,如果一个层只有一个节点,或所有的节点都有相同的输入或输出shape,那么input_shapeoutput_shape都是没有歧义的,并也只返回一个值。但是,例如你把一个相同的Convolution2D应用于一个大小为(3,32,32)的数据,然后又将其应用于一个(3,64,64)的数据,那么此时该层就具有了多个输入和输出的shape,你就需要显式的指定节点的下标,来表明你想取的是哪个了

代码语言:javascript
复制

更多的例子

代码示例依然是学习的最佳方式,这里是更多的例子

inception模型

inception的详细结构参见Google的这篇论文:Going Deeper with Convolutions

代码语言:javascript
复制

共享视觉模型

该模型在两个输入上重用了图像处理的模型,用来判别两个MNIST数字是否是相同的数字

代码语言:javascript
复制

视觉问答模型

在针对一幅图片使用自然语言进行提问时,该模型能够提供关于该图片的一个单词的答案

这个模型将自然语言的问题和图片分别映射为特征向量,将二者合并后训练一个logistic回归层,从一系列可能的回答中挑选一个。

代码语言:javascript
复制

视频问答模型

在做完图片问答模型后,我们可以快速将其转为视频问答的模型。在适当的训练下,你可以为模型提供一个短视频(如100帧)然后向模型提问一个关于该视频的问题,如“what sport is the boy playing?”->“football”

代码语言:javascript
复制
本文摘自keras-cn 文档 http://keras-cn.readthedocs.io/en/latest/getting_started/functional_API/
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CreateAMind 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 快速开始泛型模型
    • 第一个模型:全连接网络
      • 所有的模型都是可调用的,就像层一样
        • 多输入和多输出模型
          • 共享层
            • 层“节点”的概念
              • 更多的例子
                • inception模型
                • 共享视觉模型
                • 视觉问答模型
                • 视频问答模型
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档