前面介绍了keras文档一二 keras中文文档, keras中文-快速开始Sequential模型
keras文档内容丰富(视觉、语言、cnn、lstm、常用模型等),代码思路清晰,非常方便入门了解。
Keras泛型模型接口是用户定义多输出模型、非循环有向模型或具有共享层的模型等复杂模型的途径
这部分的文档假设你已经对Sequential
模型已经比较熟悉
让我们从简单一点的模型开始
Sequential
当然是实现全连接网络的最好方式,但我们从简单的全连接网络开始,有助于我们学习这部分的内容。在开始前,有几个概念需要澄清:
Sequential
一样被训练
利用泛型模型的接口,我们可以很容易的重用已经训练好的模型:你可以把模型当作一个层一样,通过提供一个tensor来调用它。注意当你调用一个模型时,你不仅仅重用了它的结构,也重用了它的权重。
使用泛型模型的一个典型场景是搭建多输入、多输出的模型。
考虑这样一个模型。我们希望预测Twitter上一条新闻会被转发和点赞多少次。模型的主要输入是新闻本身,也就是一个词语的序列。但我们还可以拥有额外的输入,如新闻发布的日期等。这个模型的损失函数将由两部分组成,辅助的损失函数评估仅仅基于新闻本身做出预测的情况,主损失函数评估基于新闻和额外信息的预测的情况,即使来自主损失函数的梯度发生弥散,来自辅助损失函数的信息也能够训练Embeddding和LSTM层。在模型中早点使用主要的损失函数是对于深度网络的一个良好的正则方法。总而言之,该模型框图如下:
让我们用泛型模型来实现这个框图
主要的输入接收新闻本身,即一个整数的序列(每个整数编码了一个词)。这些整数位于1到10,000之间(即我们的字典有10,000个词)。这个序列有100个单词。
最后,我们定义整个2输入,2输出的模型:
另一个使用泛型模型的场合是使用共享层的时候。
考虑微博数据,我们希望建立模型来判别两条微博是否是来自同一个用户,这个需求同样可以用来判断一个用户的两条微博的相似性。
一种实现方式是,我们建立一个模型,它分别将两条微博的数据映射到两个特征向量上,然后将特征向量串联并加一个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_shape
和output_shape
也是一样,如果一个层只有一个节点,或所有的节点都有相同的输入或输出shape,那么input_shape
和output_shape
都是没有歧义的,并也只返回一个值。但是,例如你把一个相同的Convolution2D
应用于一个大小为(3,32,32)的数据,然后又将其应用于一个(3,64,64)的数据,那么此时该层就具有了多个输入和输出的shape,你就需要显式的指定节点的下标,来表明你想取的是哪个了
代码示例依然是学习的最佳方式,这里是更多的例子
inception的详细结构参见Google的这篇论文:Going Deeper with Convolutions
该模型在两个输入上重用了图像处理的模型,用来判别两个MNIST数字是否是相同的数字
在针对一幅图片使用自然语言进行提问时,该模型能够提供关于该图片的一个单词的答案
这个模型将自然语言的问题和图片分别映射为特征向量,将二者合并后训练一个logistic回归层,从一系列可能的回答中挑选一个。
在做完图片问答模型后,我们可以快速将其转为视频问答的模型。在适当的训练下,你可以为模型提供一个短视频(如100帧)然后向模型提问一个关于该视频的问题,如“what sport is the boy playing?”->“football”
本文摘自keras-cn 文档 http://keras-cn.readthedocs.io/en/latest/getting_started/functional_API/