keras中的主要数据结构是model(模型),它提供定义完整计算图的方法。通过将图层添加到现有模型/计算图,我们可以构建出复杂的神经网络。

Keras有两种不同的构建模型的方法:

  1. Sequential models
  2. Functional API

本文将要讨论的就是keras中的Sequential模型。

理解Sequential模型

Sequential模型字面上的翻译是顺序模型,给人的第一感觉是那种简单的线性模型,但实际上Sequential模型可以构建非常复杂的神经网络,包括全连接神经网络、卷积神经网络(CNN)、循环神经网络(RNN)、等等。这里的Sequential更准确的应该理解为堆叠,通过堆叠许多层,构建出深度神经网络。

如下代码向模型添加一个带有64个大小为3 * 3的过滤器的卷积层:

from keras.models import Sequential
from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropoutmodel = Sequential()
model.add(Conv2D(64, (3, 3), activation='relu'))

Sequential模型的核心操作是添加layers(图层),以下展示如何将一些最流行的图层添加到模型中:

  • 卷积层
model.add(Conv2D(64, (3, 3), activation='relu'))
  • 最大池化层
model.add(MaxPooling2D(pool_size=(2, 2)))
  • 全连接层
model.add(Dense(256, activation='relu'))
  • dropout
model.add(Dropout(0.5))
  • Flattening layer(展平层)
model.add(Flatten())

基本的Sequential模型开发流程

从我们所学习到的机器学习知识可以知道,机器学习通常包括定义模型、定义优化目标、输入数据、训练模型,最后通常还需要使用测试数据评估模型的性能。keras中的Sequential模型构建也包含这些步骤。

首先,网络的第一层是输入层,读取训练数据。为此,我们需要指定为网络提供的训练数据的大小,这里input_shape参数用于指定输入数据的形状:

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)))

上面的代码中,输入层是卷积层,其获取224 * 224 * 3的输入图像。

接下来就是为模型添加中间层和输出层,请参考上面一节的内容,这里不赘述。

然后,进入最重要的部分: 选择优化器(如rmsprop或adagrad)并指定损失函数(如categorical_crossentropy)来指定反向传播的计算方法。在keras中,Sequential模型的compile方法用来完成这一操作。例如,在下面的这一行代码中,我们使用’rmsprop’优化器,损失函数为’binary_crossentropy’。

model.compile(loss='binary_crossentropy',optimizer='rmsprop')

到这一步,我们创建了模型,接下来就是调用fit函数将数据提供给模型。这里还可以指定批次大小(batch size)、迭代次数、验证数据集等等。其中批次大小、迭代次数需要根据数据规模来确定,并没有一个固定的最优值。

model.fit(x_train, y_train, batch_size=32, epochs=10,validation_data=(x_val, y_val))

最后,使用evaluate方法来评估模型:

score = model.evaluate(x_test,y_test,batch_size = 32)

以上就是在Keras中使用Sequential模型的基本构建块,相对于tensorflow,keras的代码更少,接口更加清晰,更重要的是,keras的后端框架切(比如从tensorflow切换到Theano)换后,我们的代码不需要做任何修改。

使用Sequential模型解决线性回归问题

谈到tensorflow、keras之类的框架,我们的第一反应通常是深度学习,其实大部分的问题并不需要深度学习,特别是在数据规模较小的情况下,一些机器学习算法就可以解决问题。除了构建深度神经网络,keras也可以构建一些简单的算法模型,下面以线性学习为例,说明使用keras解决线性回归问题。

线性回归中,我们根据一些数据点,试图找出最拟合各数据点的直线。为了说明这一问题,我们创建100个数据点,然后通过回归找出拟合这100个数据点的直线。

  1. 创建训练数据
import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as nptrX = np.linspace(-1, 1, 101)
trY = 3 * trX + np.random.randn(*trX.shape) * 0.33

上面这段代码创中,TrainX的值在-1和1之间均匀分布,而TrainY的值为TrainX的三倍,但增加了一些随机扰动。

  1. 创建模型
model = Sequential()
model.add(Dense(input_dim=1, output_dim=1, init='uniform', activation='linear'))

代码创建一个Sequential模型,这里使用了一个采用线性激活的全连接(Dense)层。它实际上封装了输入值x乘以权重w,加上偏置(bias)b,然后进行线性激活以产生输出。

我们可以查看默认初始化的权重和偏置值:

weights = model.layers[0].get_weights()
w_init = weights[0][0][0]
b_init = weights[1][0]
print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init))
  1. 选择优化器和损失函数
model.compile(optimizer='sgd', loss='mse')

选择简单的梯度递减优化算法,损失函数选择均方差(mean squared error, mse)。

  1. 训练模型
model.fit(trX, trY, nb_epoch=200, verbose=1)

训练完毕之后,我们可以再看看权重值和偏置值

weights = model.layers[0].get_weights()
w_final = weights[0][0][0]
b_final = weights[1][0]
print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final))

最后的结果为

Linear regression model is trained to have weight w: 2.94, b: 0.08

可以看到,进行200次迭代之后,权重值现在非常接近3。我们可以尝试修改迭代次数,看看不同迭代次数下得到的权重值。

这段例子仅仅作为一个简单的示例,所以没有做模型评估,有兴趣的同学可以构建测试数据自己尝试一下。

总结

keras中的Sequential模型其实非常强大,而且接口简单易懂,大部分情况下,我们只需要使用Sequential模型即可满足需求。在某些特别的场合,可能需要更复杂的模型结构,这时就需要Functional API,在后面的教程中,我将探讨Functional API。

参考

  1. Keras tutorial: Practical guide from getting started to developing complex deep neural network
  2. Getting started with the Keras Sequential model

理解keras中的sequential模型相关推荐

  1. Python机器学习笔记:深入理解Keras中序贯模型和函数模型

     先从sklearn说起吧,如果学习了sklearn的话,那么学习Keras相对来说比较容易.为什么这样说呢? 我们首先比较一下sklearn的机器学习大致使用流程和Keras的大致使用流程: skl ...

  2. 理解RabbitMQ中的AMQP模型,知乎上已获万赞

    前言 在实际开发,Redis使用会频繁,那么在使用过程中我们该如何正确抉择数据类型呢?哪些场景下适用哪些数据类型.而且在面试中也很常会被面试官问到Redis数据结构方面的问题: Redis为什么快呢? ...

  3. conv2d 公式_理解keras中conv2d层的输出形状

    这个问题在互联网上以各种形式被问到,而且有一个简单的答案,常常被忽略或混淆: 简单回答: Keras Conv2D层在多通道输入(例如彩色图像)的情况下,将在所有颜色通道上应用滤波器,并将结果求和,生 ...

  4. 多层神经网络 —— Sequential模型

    前一节介绍说, 这里主要介绍 tf.keras 中的 Sequential 模型. Sequential 是 Keras 中的一种神经网络框架,可以被认为是一个容器,其中封装了神经网络的结构.Sequ ...

  5. 如何在 Keras 中使用 FaceNet 开发人脸识别系统

    https://www.infoq.cn/article/4wT4mNvKlVvEQZR-JXmp Keras 是一个用 Python 编写的高级神经网络 API,能够以 TensorFlow.CNT ...

  6. Keras中Sequential模型及方法详细总结

    Sequential 序贯模型 序贯模型是函数式模型的简略版,为最简单的线性.从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠. Keras实现了很多层,包括core核心层,Convolution卷 ...

  7. Keras中的两种模型:Sequential和Model

    在Keras中有两种深度学习的模型:序列模型(Sequential)和通用模型(Model).差异在于不同的拓扑结构. 序列模型 Sequential 序列模型各层之间是依次顺序的线性关系,模型结构通 ...

  8. 如何在Keras中检查深度学习模型(翻译)

    本文翻译自:How to Check-Point Deep Learning Models in Keras 深度学习模型可能需要数小时,数天甚至数周才能进行训练. 如果意外停止运行,则可能会丢失大量 ...

  9. java55矩阵output_将矩阵乘积输入到keras中的两个模型的输出

    具体来说,现在我想对两个CNN模型的两个输出矩阵做外积,并且我完成了矩阵的转置,现在我只想在 keras 中加倍两个矩阵,其大小为(None,512,49)和(无,49,512) . 我尝试在kera ...

最新文章

  1. Grafana中整个Dashboard报错问题解决
  2. Layer 2 Tunneling Protocol
  3. 复用 TensorFlow 模型
  4. adas技术实现途径_未来实现100%清洁电力的途径,带来巨大的健康和工作
  5. 一次看完28个关于ES的性能调优技巧
  6. scikit-learn学习笔记(三)Generalized Linear Models ( 广义线性模型 )
  7. C# Keywords - as
  8. 前端学习(3187):ant-design的button介绍按钮属性
  9. JDBC连接SQL Server 2005问题
  10. 销售数据分析这么做,领导不重用你都难
  11. 对Linux的cp命令的思考
  12. 大容量nc文件解析_分布式文件系统浅谈
  13. 一千个哈姆雷特,一千个手游开发者
  14. 简单家乡风景静态HTML网页设计作品 DIV布局家乡介绍网页模板代码
  15. android provided without an @Inject constructor or an @Provides-annotated method.报错原因
  16. Cyberdog——小米四足机器人测评
  17. python绘制单列多色柱状图
  18. 没有项目经验?软件测试简历项目经验怎么写...
  19. iOS-error: unable to read property list from file: /Users/XX/Info.plist
  20. node-sass改dart-sass and 一些七七八八,实现sass主题色修改

热门文章

  1. GIS原理篇 Coverage
  2. java jmap instances_jmap命令详解
  3. TensorFlow 智能移动项目:1~5
  4. QT常用表格导出为Excel以及Excel导入表格
  5. 基于微信平台的在线漫画阅读小程序设计与实现【附项目源码+论文说明】分享
  6. 量子计算机与电子科学,科学家们发现,电子之间也有量子隐形传态,这对量子计算机来说很重要...
  7. 基于JAVA教育培训机构信息管理系统计算机毕业设计源码+系统+lw文档+部署
  8. 由cadence allegro 设计的STM32开发板PCB教程
  9. Java Object
  10. NW.js和Electron优缺点综合对比