本文转自微信公众号createamind
keras中文doc之三
前面介绍了keras文档一二 keras中文文档, keras中文-快速开始Sequential模型
keras文档内容丰富(视觉、语言、cnn、lstm、常用模型等),代码思路清晰,非常方便入门了解。
快速开始泛型模型
Keras泛型模型接口是用户定义多输出模型、非循环有向模型或具有共享层的模型等复杂模型的途径
这部分的文档假设你已经对Sequential
模型已经比较熟悉
让我们从简单一点的模型开始
第一个模型:全连接网络
Sequential
当然是实现全连接网络的最好方式,但我们从简单的全连接网络开始,有助于我们学习这部分的内容。在开始前,有几个概念需要澄清:
-
层对象接受张量为参数,返回一个张量。张量在数学上只是数据结构的扩充,一阶张量就是向量,二阶张量就是矩阵,三阶张量就是立方体。在这里张量只是广义的表达一种数据结构,例如一张彩色图像其实就是一个三阶张量,它由三个通道的像素值堆叠而成。而10000张彩色图构成的一个数据集合则是四阶张量。
-
输入是张量,输出也是张量的一个框架就是一个模型
-
这样的模型可以被像Keras的
Sequential
一样被训练
![](https://i-blog.csdnimg.cn/blog_migrate/6567641995a3c5247386950e7096e5ff.jpeg)
所有的模型都是可调用的,就像层一样
利用泛型模型的接口,我们可以很容易的重用已经训练好的模型:你可以把模型当作一个层一样,通过提供一个tensor来调用它。注意当你调用一个模型时,你不仅仅重用了它的结构,也重用了它的权重。
![](https://i-blog.csdnimg.cn/blog_migrate/39875c1d4834bbf0b965b95f84d187b1.jpeg)
多输入和多输出模型
使用泛型模型的一个典型场景是搭建多输入、多输出的模型。
考虑这样一个模型。我们希望预测Twitter上一条新闻会被转发和点赞多少次。模型的主要输入是新闻本身,也就是一个词语的序列。但我们还可以拥有额外的输入,如新闻发布的日期等。这个模型的损失函数将由两部分组成,辅助的损失函数评估仅仅基于新闻本身做出预测的情况,主损失函数评估基于新闻和额外信息的预测的情况,即使来自主损失函数的梯度发生弥散,来自辅助损失函数的信息也能够训练Embeddding和LSTM层。在模型中早点使用主要的损失函数是对于深度网络的一个良好的正则方法。总而言之,该模型框图如下:
让我们用泛型模型来实现这个框图
主要的输入接收新闻本身,即一个整数的序列(每个整数编码了一个词)。这些整数位于1到10,000之间(即我们的字典有10,000个词)。这个序列有100个单词。
![](https://i-blog.csdnimg.cn/blog_migrate/9a36ab9d55acff320a0de638d5698728.jpeg)
最后,我们定义整个2输入,2输出的模型:
![](https://i-blog.csdnimg.cn/blog_migrate/08c0206286942747a4d196fb279eab28.jpeg)
共享层
考虑微博数据,我们希望建立模型来判别两条微博是否是来自同一个用户,这个需求同样可以用来判断一个用户的两条微博的相似性。
一种实现方式是,我们建立一个模型,它分别将两条微博的数据映射到两个特征向量上,然后将特征向量串联并加一个logistic回归层,输出它们来自同一个用户的概率。这种模型的训练数据是一对对的微博。
因为这个问题是对称的,所以处理第一条微博的模型当然也能重用于处理第二条微博。所以这里我们使用一个共享的LSTM层来进行映射。
首先,我们将微博的数据转为(140,256)的矩阵,即每条微博有140个字符,每个单词的特征由一个256维的词向量表示,向量的每个元素为1表示某个字符出现,为0表示不出现,这是一个one-hot编码。
先暂停一下,看看共享层到底输出了什么,它的输出数据shape又是什么
层“节点”的概念
如果层只与一个输入相连,那没有任何困惑的地方。.ouput()
将会返回该层唯一的输出
够简单吧?
对于input_shape
和output_shape
也是一样,如果一个层只有一个节点,或所有的节点都有相同的输入或输出shape,那么input_shape
和output_shape
都是没有歧义的,并也只返回一个值。但是,例如你把一个相同的Convolution2D
应用于一个大小为(3,32,32)的数据,然后又将其应用于一个(3,64,64)的数据,那么此时该层就具有了多个输入和输出的shape,你就需要显式的指定节点的下标,来表明你想取的是哪个了
![](https://i-blog.csdnimg.cn/blog_migrate/cc1e7b1bde68fc1f53ec774574026e0e.png)
更多的例子
代码示例依然是学习的最佳方式,这里是更多的例子
inception模型
inception的详细结构参见Google的这篇论文:Going Deeper with Convolutions
![](https://i-blog.csdnimg.cn/blog_migrate/f7aee15d37dbcde25394da1395fe9f9a.jpeg)
共享视觉模型
该模型在两个输入上重用了图像处理的模型,用来判别两个MNIST数字是否是相同的数字
![](https://i-blog.csdnimg.cn/blog_migrate/cbc3f1cc597fb2e0f0263234f682043c.jpeg)
视觉问答模型
在针对一幅图片使用自然语言进行提问时,该模型能够提供关于该图片的一个单词的答案
这个模型将自然语言的问题和图片分别映射为特征向量,将二者合并后训练一个logistic回归层,从一系列可能的回答中挑选一个。
![](https://i-blog.csdnimg.cn/blog_migrate/bb34217b9c512da9de3a1e7ba24b300d.jpeg)
视频问答模型
在做完图片问答模型后,我们可以快速将其转为视频问答的模型。在适当的训练下,你可以为模型提供一个短视频(如100帧)然后向模型提问一个关于该视频的问题,如“what sport is the boy playing?”->“football”
本文摘自keras-cn 文档 http://keras-cn.readthedocs.io/en/latest/getting_started/functional_API/
一起学习讨论:qq群号 325921031;微信群请后台留言加群或下方二维码;
线下活动报名请后台留言所在地区;
其他入门干货访问公众号createamind即可。
![](https://i-blog.csdnimg.cn/blog_migrate/713aea13cbe392d5fab953349f915bec.png)
微信扫一扫
关注该公众号