前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >keras中文-快速开始Sequential模型

keras中文-快速开始Sequential模型

作者头像
CreateAMind
发布2018-07-25 11:37:25
9260
发布2018-07-25 11:37:25
举报
文章被收录于专栏:CreateAMind

快速开始Sequential模型

Sequential是多个网络层的线性堆叠

可以通过向Sequential模型传递一个layer的list来构造该模型:

代码语言:javascript
复制

也可以通过.add()方法一个个的将layer加入模型中:

代码语言:javascript
复制

指定输入数据的shape

模型需要知道输入数据的shape,因此,Sequential的第一层需要接受一个关于输入数据shape的参数,后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数。有几种方法来为第一层指定输入数据的shape

  • 传递一个input_shape的关键字参数给第一层,input_shape是一个tuple类型的数据,其中也可以填入None,如果填入None则表示此位置可能是任何正整数。数据的batch大小不应包含在其中。
  • 传递一个batch_input_shape的关键字参数给第一层,该参数包含数据的batch大小。该参数在指定固定大小batch时比较有用,例如在stateful RNNs中。事实上,Keras在内部会通过添加一个None将input_shape转化为batch_input_shape
  • 有些2D层,如Dense,支持通过指定其输入维度input_dim来隐含的指定输入数据shape。一些3D的时域层支持通过参数input_diminput_length来指定输入shape。

下面的三个指定输入数据shape的方法是严格等价的:

代码语言:javascript
复制

下面三种方法也是严格等价的:

代码语言:javascript
复制

Merge层

多个Sequential可经由一个Merge层合并到一个输出。Merge层的输出是一个可以被添加到新Sequential的层对象。下面这个例子将两个Sequential合并到一起:

代码语言:javascript
复制

Merge层支持一些预定义的合并模式,包括:

  • sum(defualt):逐元素相加
  • concat:张量串联,可以通过提供concat_axis的关键字参数指定按照哪个轴进行串联
  • mul:逐元素相乘
  • ave:张量平均
  • dot:张量相乘,可以通过dot_axis关键字参数来指定要消去的轴
  • cos:计算2D张量(即矩阵)中各个向量的余弦距离

这个两个分支的模型可以通过下面的代码训练:

代码语言:javascript
复制
final_model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
final_model.fit([input_data_1, input_data_2], targets)  # we pass one data array per model input

也可以为Merge层提供关键字参数mode,以实现任意的变换,例如:

代码语言:javascript
复制
merged = Merge([left_branch, right_branch], mode=lambda x, y: x - y)

现在你已经学会定义几乎任何Keras的模型了,对于不能通过Sequential和Merge组合生成的复杂模型,可以参考泛型模型API


编译

在训练模型之前,我们需要通过compile来对学习过程进行配置。compile接收三个参数:

  • 优化器optimizer:该参数可指定为已预定义的优化器名,如rmspropadagrad,或一个Optimizer类的对象,详情见optimizers
  • 损失函数loss:该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical_crossentropymse,也可以为一个损失函数。详情见objectives
  • 指标列表metrics:对分类问题,我们一般将该列表设置为metrics=['accuracy']。指标可以是一个预定义指标的名字(目前仅支持accuracy),也可以是一个一般的函数。
代码语言:javascript
复制

训练

Keras以Numpy数组作为输入数据和标签的数据类型。训练模型一般使用fit函数,该函数的详情见这里。下面是一些例子。

代码语言:javascript
复制
代码语言:javascript
复制

例子

这里是一些帮助你开始的例子

在Keras代码包的examples文件夹中,你将找到使用真实数据的示例模型:

  • CIFAR10 小图片分类:使用CNN和实时数据提升
  • IMDB 电影评论观点分类:使用LSTM处理成序列的词语
  • Reuters(路透社)新闻主题分类:使用多层感知器(MLP)
  • MNIST手写数字识别:使用多层感知器和CNN
  • 字符级文本生成:使用LSTM ...

基于多层感知器的softmax多分类:

代码语言:javascript
复制

相似MLP的另一种实现:

代码语言:javascript
复制

用于二分类的多层感知器:

代码语言:javascript
复制
类似VGG的卷积神经网络:
代码语言:javascript
复制

使用LSTM的序列分类

代码语言:javascript
复制

使用带有门限的递归单元进行图像描述:

(单词级别嵌入,描述语句最多16个单词)

注意,要使该网络良好工作需要更大规模的卷积神经网络并以预训练权重初始化,此处仅为结构示例。

代码语言:javascript
复制

用于序列分类的栈式LSTM

在该模型中,我们将三个LSTM堆叠在一起,是该模型能够学习更高层次的时域特征表示。

开始的两层LSTM返回其全部输出序列,而第三层LSTM只返回其输出序列的最后一步结果,从而其时域维度降低(即将输入序列转换为单个向量)

代码语言:javascript
复制

采用状态LSTM的相同模型

状态(stateful)LSTM的特点是,在处理过一个batch的训练数据后,其内部状态(记忆)会被作为下一个batch的训练数据的初始状态。状态LSTM使得我们可以在合理的计算复杂度内处理较长序列

请FAQ中关于状态LSTM的部分获取更多信息

代码语言:javascript
复制
将两个LSTM合并作为编码端来处理两路序列的分类

在本模型中,两路输入序列通过两个LSTM被编码为特征向量

两路特征向量被串连在一起,然后通过一个全连接网络得到结果,示意图如下:

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 快速开始Sequential模型
    • 指定输入数据的shape
      • Merge层
        • 编译
          • 训练
            • 例子
              • 基于多层感知器的softmax多分类:
              • 相似MLP的另一种实现:
              • 用于二分类的多层感知器:
              • 使用LSTM的序列分类
              • 使用带有门限的递归单元进行图像描述:
              • 用于序列分类的栈式LSTM
              • 采用状态LSTM的相同模型
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档