摘要:Keras作为神经网络的高级包,能够快速搭建神经网络,它的兼容性非常广,兼容了TensorFlow和Theano。

本文分享自华为云社区《[Python人工智能] 十六.Keras环境搭建、入门基础及回归神经网络案例》,作者:eastmount。

一.为什么要使用Keras

Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化 。其主要开发者是谷歌工程师François Chollet。

Keras在代码结构上由面向对象方法编写,完全模块化并具有可扩展性,其运行机制和说明文档有将用户体验和使用难度纳入考虑,并试图简化复杂算法的实现难度 。Keras支持现代人工智能领域的主流算法,包括前馈结构和递归结构的神经网络,也可以通过封装参与构建统计学习模型。在硬件和开发环境方面,Keras支持多操作系统下的多GPU并行计算,可以根据后台设置转化为Tensorflow、Microsoft-CNTK等系统下的组件。

Keras作为神经网络的高级包,能够快速搭建神经网络,它的兼容性非常广,兼容了TensorFlow和Theano。

二.安装Keras和兼容Backend

1.如何安装Keras

首先需要确保已经安装了以下两个包:

  • Numpy
  • Scipy

调用“pip3 list”命令可以看到相关包已经安装成功。

接着通过“pip3 install keras”安装,作者是使用Anaconda下的Python3.6版本。

  1. activate tensorflow
  2. pip3 install keras
  3. pip install keras

搭建过程详见这篇文章:

安装如下图所示:

安装成功之后,我们尝试一个简单的代码。打开Anaconda,然后选择已经搭建好的“tensorflow”环境,运行Spyder。

测试代码如下:

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Feb 14 16:43:21 2020
  4. @author: Eastmount CSDN
  5. """
  6. import numpy as np
  7. from keras.preprocessing.sequence import TimeseriesGenerator
  8.  
  9. # 时间序列
  10. y = np.array(range(5))
  11. tg = TimeseriesGenerator(y, y, length=3, sampling_rate=1)
  12. for i in zip(*tg[0]):
  13. print(*i)

运行结果如下图所示,究竟“Using TensorFlow backend.”表示什么意思呢?

2.兼容Backend

Backend是指Keras基于某个框架来做运算,包括基于TensorFlow或Theano,上面的那段代码就是使用TensorFlow来运算的。后面要讲解的神经网络也是基于TensorFlow或Theano来搭建的。

如何查看Backend呢?当我们导入Keras扩展包时,它就会有相应的提示,比如下图使用的就是Theano来搭建底层的神经网络。

如果想要改成TensorFlow,怎么办呢?

  • 第一种方法,找到“keras/keras.json”这个文件,然后打开它。所有的backend信息就存储在这里,每次导入Keras包就会检测这个“keras.json”文件的backend。接着我们尝试修改。

  • 第二种方法是在命令行中输入下面这句命令,每次运行脚本时它会直接帮你修改成临时的TensorFlow。
  1. import os
  2. os.environ['KERAS_BACKEND']='tensorflow'
  3. import keras

三.白话神经网络

该部分还是有必要再给大家普及一遍,参考"莫烦大神"网易云课程对神经网络的介绍,讲得清晰透彻,推荐大家阅读。开始吧!让我们一起进入神经网络和TensorFlow的世界。

首先,什么是神经网络(Neural Networks)?

计算机神经网络是一种模仿生物神经网络或动物神经中枢,特别是大脑的结构和功能,它是一种数学模型或计算机模型。神经网络由大量的神经元连接并进行计算,大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应的过程。

现代神经网络是一种基于传统统计学建模的工具,常用来对输入和输出间复杂的关系进行建模,或探索数据间的模式,神经网络是一种运算模型,有大量的节点或神经元及其联系构成。和人类的神经元一样,它们负责传递信息和加工信息,神经元也能被训练或强化,形成固定的神经形态,对特殊的信息有更强烈的反应。

神经网络是如何工作的呢?

如上图所示,不管这是一只跳跃飞奔的猫,或是一只静静思考的猫,你都知道它是一只猫,因为你的大脑已经被告知过圆眼睛、毛茸茸、尖耳朵的就是猫,你通过成熟的视觉神经系统判断它是猫。计算机也是一样,通过不断的训练,告诉哪些是猫、哪些是狗、哪些是猪,它们会通过数学模型来概括这些学习的判断,最终以数学的形式(0或1)来分类。目前,谷歌、百度图片搜索都能清晰识别事物,这些都归功于计算机神经系统的飞速发展。

神经网络系统由多层神经层构成,为了区分不同的神经层,我们分为:

  • 输入层:直接接收信息的神经层,比如接收一张猫的图片
  • 输出层:信息在神经元中传递中转和分析权衡,形成输出结果,通过该层输出的结果可以看出计算机对事物的认知
  • 隐藏层:在输入和输出层之间的众多神经元连接组成的各个层面,可以有多层,负责对传入信息的加工处理,经过多层加工才能衍生出对认知的理解

神经网络举例说明

如下图所示,通常来说,计算机处理的东西和人类有所不同,无论是声音、图片还是文字,它们都只能以数字0或1出现在计算机神经网络里。神经网络看到的图片其实都是一堆数字,对数字的加工处理最终生成另一堆数字,并且具有一定认知上的意义,通过一点点的处理能够得知计算机到底判断这张图片是猫还是狗。

计算机是怎么训练的呢?

首先,需要很多的数据,比如需要计算机判断是猫还是狗,就需要准备上千万张有标记的图片,然后再进行上千万次的训练。计算机通过训练或强化学习判断猫,将获取的特征转换为数学的形式。

我们需要做的就是只给计算机看图片,然后让它给我们一个不成熟也不准确的答案,有可能100次答案中有10%是正确的。如果给计算机看图片是一张飞奔的猫(如下图),但计算机可能识别成一条狗,尽管它识别错误,但这个错误对计算机是非常有价值的,可以用这次错误的经验作为一名好老师,不断学习经验。

那么计算机是如何学习经验的呢?

它是通过对比预测答案和真实答案的差别,然后把这种差别再反向传递回去,修改神经元的权重,让每个神经元向正确的方向改动一点点,这样到下次识别时,通过所有改进的神经网络,计算机识别的正确率会有所提高。最终每一次的一点点,累加上千万次的训练,就会朝正确的方向上迈出一大步。

最后到验收结果的时候,给计算机再次显示猫的图片时,它就能正确预测这是一只猫。

激励函数是什么东东?

接着再进一步看看神经网络是怎么训练的。原来在计算机里每一个神经元都有属于它的激励函数(Active Function),我们可以利用这些激励函数给计算机一个刺激行为。当我们第一次给计算机看一只飞奔的猫时,神经网络中只有部分神经元被激活或激励,被激活传递下去的信息是计算机最为重视的信息,也是对输出结果最有价值的信息。

如果预测的结果是一只狗,所有神经元的参数就会被调整,这时有一些容易被激活的神经元就会变得迟钝,而另一些会变得敏感起来,这就说明了所有神经元参数正在被修改,变得对图片真正重要的信息敏感,从而被改动的参数就能渐渐预测出正确的答案,它就是一只猫。这就是神经网络的加工过程。

四.Keras搭建回归神经网络

推荐前文:[Python人工智能] 二.TensorFlow基础及一元直线预测案例,最终输出的结果如下图所示:

1.导入扩展包

Sequential(序贯模型)表示按顺序建立模型,它是最简单的线性、从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠。Dense是layers中的属性,表示全连接层。Keras还可以实现各种层,包括core核心层、Convolution卷积层、Pooling池化层等非常丰富有趣的网络结构。

  1. import numpy as np
  2. from keras.models import Sequential
  3. from keras.layers import Dense
  4. import matplotlib.pyplot as plt

2.创建散点图数据

通过numpy.linspace随机生成200个散点,并构建y=0.5*x+2的虚拟数据,并调用 np.random.normal(0, 0.05, (200,)) 增加噪声。

  1. import numpy as np
  2. from keras.models import Sequential
  3. from keras.layers import Dense
  4. import matplotlib.pyplot as plt
  5.  
  6. #---------------------------创建散点数据---------------------------
  7. # 输入
  8. X = np.linspace(-1, 1, 200)
  9. # 随机化数据
  10. np.random.shuffle(X)
  11. # 输出
  12. y = 0.5*X + 2 + np.random.normal(0, 0.05, (200,)) #噪声平均值0 方差0.05
  13. # 绘制散点图
  14. plt.scatter(X, y)
  15. plt.show()
  16.  
  17. # 数据集划分(训练集-测试集)
  18. X_train, y_train = X[:160], y[:160] # 前160个散点
  19. X_test, y_test = X[160:], y[160:] # 后40个散点

这里通过matplotlib简单绘制散点图,输出结果如下图所示,基本满足:y = 0.5*x + 2 + noise。

3.添加神经网络层

  • 创建Sequential模型。
  • 添加神经网络层。在Keras中,增加层的操作非常简单,调用model.add(Dense(output_dim=1, input_dim=1))函数添加即可。注意,如果再添加一个神经层,默认上一层的输出为下一层的输入数据,此时不需要定义input_dim,比如model.add(Dense(output_dim=1, ))。
  • 搭建模型并选择损失函数(loss function)和优化方法(optimizing method)。
  1. #----------------------------添加神经层------------------------------
  2. # 创建模型
  3. model = Sequential()
  4.  
  5. # 增加全连接层 输出个数和输入个数(均为1个)
  6. model.add(Dense(output_dim=1, input_dim=1))
  7.  
  8. # 搭建模型 选择损失函数(loss function)和优化方法(optimizing method)
  9. # mse表示二次方误差 sgd表示乱序梯度下降优化器
  10. model.compile(loss='mse', optimizer='sgd')

PS:是不是感觉Keras代码比TensorFlow和Theano都简洁很多,但还是建议大家先学习前者,再深入Keras。

4.训练并输出误差

  1. print("训练")
  2. # 学习300次
  3. for step in range(301):
  4. # 分批训练数据 返回值为误差
  5. cost = model.train_on_batch(X_train, y_train)
  6. # 每隔100步输出误差
  7. if step % 100 == 0:
  8. print('train cost:', cost)

5.测试神经网络并输出误差\权重和偏置

  1. print("测试")
  2. # 运行模型测试 一次传入40个测试散点
  3. cost = model.evaluate(X_test, y_test, batch_size=40)
  4. # 输出误差
  5. print("test cost:", cost)
  6. # 获取权重和误差 layers[0]表示第一个神经层(即Dense)
  7. W, b = model.layers[0].get_weights()
  8. # 输出权重和偏置
  9. print("weights:", W)
  10. print("biases:", b)

6.绘制预测图形

  1. y_pred = model.predict(X_test)
  2. plt.scatter(X_test, y_test)
  3. plt.plot(X_test, y_pred)
  4. plt.show()

输出结果如下所示:

误差从4.002261下降到0.0030148015,说明学习到知识。同时,误差为0.47052705接近我们的初始值0.5,偏置为1.9944116也接近2。

  1. 训练
  2. train cost: 4.002261
  3. train cost: 0.07719966
  4. train cost: 0.005076804
  5. train cost: 0.0030148015
  6. 测试
  7. 40/40 [==============================] - 0s 1ms/step
  8. test cost: 0.0028453178238123655
  9. weights: [[0.47052705]]
  10. biases: [1.9944116]

完整代码如下:

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Feb 14 16:43:21 2020
  4. @author: Eastmount CSDN YXZ
  5. O(∩_∩)O Wuhan Fighting!!!
  6. """
  7. import numpy as np
  8. from keras.models import Sequential
  9. from keras.layers import Dense
  10. import matplotlib.pyplot as plt
  11.  
  12. #---------------------------创建散点数据---------------------------
  13. # 输入
  14. X = np.linspace(-1, 1, 200)
  15. # 随机化数据
  16. np.random.shuffle(X)
  17. # 输出
  18. y = 0.5*X + 2 + np.random.normal(0, 0.05, (200,)) #噪声平均值0 方差0.05
  19. # 绘制散点图
  20. # plt.scatter(X, y)
  21. # plt.show()
  22.  
  23. # 数据集划分(训练集-测试集)
  24. X_train, y_train = X[:160], y[:160] # 前160个散点
  25. X_test, y_test = X[160:], y[160:] # 后40个散点
  26.  
  27. #----------------------------添加神经层------------------------------
  28. # 创建模型
  29. model = Sequential()
  30.  
  31. # 增加全连接层 输出个数和输入个数(均为1个)
  32. model.add(Dense(output_dim=1, input_dim=1))
  33.  
  34. # 搭建模型 选择损失函数(loss function)和优化方法(optimizing method)
  35. # mse表示二次方误差 sgd表示乱序梯度下降优化器
  36. model.compile(loss='mse', optimizer='sgd')
  37.  
  38. #--------------------------------Traning----------------------------
  39. print("训练")
  40. # 学习300次
  41. for step in range(301):
  42. # 分批训练数据 返回值为误差
  43. cost = model.train_on_batch(X_train, y_train)
  44. # 每隔100步输出误差
  45. if step % 100 == 0:
  46. print('train cost:', cost)
  47.  
  48. #--------------------------------Test-------------------------------
  49. print("测试")
  50. # 运行模型测试 一次传入40个测试散点
  51. cost = model.evaluate(X_test, y_test, batch_size=40)
  52. # 输出误差
  53. print("test cost:", cost)
  54. # 获取权重和误差 layers[0]表示第一个神经层(即Dense)
  55. W, b = model.layers[0].get_weights()
  56. # 输出权重和偏置
  57. print("weights:", W)
  58. print("biases:", b)
  59.  
  60. #------------------------------绘制预测图形-----------------------------
  61. y_pred = model.predict(X_test)
  62. plt.scatter(X_test, y_test)
  63. plt.plot(X_test, y_pred, "red")
  64. plt.show()

下面补充代码对比各训练阶段拟合的直线,可以看到随着训练次数增加,误差逐渐降低并且拟合的直线越来越好。

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Feb 14 16:43:21 2020
  4. @author: Eastmount CSDN YXZ
  5. """
  6. import numpy as np
  7. from keras.models import Sequential
  8. from keras.layers import Dense
  9. import matplotlib.pyplot as plt
  10.  
  11. #---------------------------创建散点数据---------------------------
  12. # 输入
  13. X = np.linspace(-1, 1, 200)
  14. # 随机化数据
  15. np.random.shuffle(X)
  16. # 输出
  17. y = 0.5*X + 2 + np.random.normal(0, 0.05, (200,)) #噪声平均值0 方差0.05
  18. # 绘制散点图
  19. # plt.scatter(X, y)
  20. # plt.show()
  21.  
  22. # 数据集划分(训练集-测试集)
  23. X_train, y_train = X[:160], y[:160] # 前160个散点
  24. X_test, y_test = X[160:], y[160:] # 后40个散点
  25.  
  26. #----------------------------添加神经层------------------------------
  27. # 创建模型
  28. model = Sequential()
  29.  
  30. # 增加全连接层 输出个数和输入个数(均为1个)
  31. model.add(Dense(output_dim=1, input_dim=1))
  32.  
  33. # 搭建模型 选择损失函数(loss function)和优化方法(optimizing method)
  34. # mse表示二次方误差 sgd表示乱序梯度下降优化器
  35. model.compile(loss='mse', optimizer='sgd')
  36.  
  37. #--------------------------------Traning----------------------------
  38. print("训练")
  39. k = 0
  40. # 学习1000次
  41. for step in range(1000):
  42. # 分批训练数据 返回值为误差
  43. cost = model.train_on_batch(X_train, y_train)
  44. # 每隔100步输出误差
  45. if step % 100 == 0:
  46. print('train cost:', cost)
  47.  
  48. #-----------------------------------------------------------
  49. # 运行模型测试 一次传入40个测试散点
  50. cost = model.evaluate(X_test, y_test, batch_size=40)
  51. # 输出误差
  52. print("test cost:", cost)
  53. # 获取权重和误差 layers[0]表示第一个神经层(即Dense)
  54. W, b = model.layers[0].get_weights()
  55. # 输出权重和偏置
  56. print("weights:", W)
  57. print("biases:", b)
  58.  
  59. #-----------------------------------------------------------
  60. # 可视化绘图
  61. k = k + 1
  62. plt.subplot(5, 2, k)
  63. y_pred = model.predict(X_test)
  64. plt.scatter(X_test, y_test)
  65. plt.plot(X_test, y_pred, "red", label='cost=%.4f k=%d' %(cost,k))
  66. plt.legend()
  67.  
  68. plt.show()

点击关注,第一时间了解华为云新鲜技术~

从环境搭建到回归神经网络案例,带你掌握Keras的更多相关文章

  1. Flume环境搭建_五种案例

    Flume环境搭建_五种案例 http://flume.apache.org/FlumeUserGuide.html A simple example Here, we give an example ...

  2. Flume环境搭建_五种案例(转)

    Flume环境搭建_五种案例 http://flume.apache.org/FlumeUserGuide.html A simple example Here, we give an example ...

  3. 03 Mybatis:01.Mybatis课程介绍及环境搭建&&02.Mybatis入门案例

    mybatis框架共四天第一天:mybatis入门 mybatis的概述 mybatis的环境搭建 mybatis入门案例 -------------------------------------- ...

  4. JFinal开发环境搭建,JFinal开发案例

     JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java 语言所 ...

  5. CC++初学者编程教程(2) Microsoft Visual C++ 6.0开发环境搭建

    上一篇演示的是如何安装VS2010,本文演示的是如何安装Microsoft Visual C++ 6.0 简称VC6. 有同学经常VC6都是很古董的版本了,为啥他还存在,不得不说VC6是微软一个很经典 ...

  6. Mybatis学习笔记之一(环境搭建和入门案例介绍)

    一.Mybatis概述 1.1 Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了go ...

  7. Mybatis环境搭建中的案例分析 及 如果自己编写DAO接口的实现类

    Mybatis环境搭建中的案例分析public static void main (String[] args) throws Exception { //读配置文件 //第一个: 使用类加载器,只能 ...

  8. SpringBoot2.0基础案例(01):环境搭建和RestFul风格接口

    一.SpringBoot 框架的特点 1.SpringBoot2.0 特点 1)SpringBoot继承了Spring优秀的基因,上手难度小 2)简化配置,提供各种默认配置来简化项目配置 3)内嵌式容 ...

  9. Hadoop分布环境搭建步骤,及自带MapReduce单词计数程序实现

    Hadoop分布环境搭建步骤: 1.软硬件环境 CentOS 7.2 64 位 JDK- 1.8 Hadoo p- 2.7.4 2.安装SSH sudo yum install openssh-cli ...

随机推荐

  1. 『Python』matplotlib的imshow用法

    热力图是一种数据的图形化表示,具体而言,就是将二维数组中的元素用颜色表示.热力图之所以非常有用,是因为它能够从整体视角上展示数据,更确切的说是数值型数据. 使用imshow()函数可以非常容易地制作热 ...

  2. linux mint17.3+vmware 12.1.1 流畅安装运行OSX EI capitan

    在linux mint17.3的vmware虚拟机中安装mac osx ei capitan系统 出于对苹果操作系统的好奇与喜爱,分别在宿主机操作系统为windows 7和linux mint17.3 ...

  3. 洛谷3721 HNOI2017单旋(LCT+set+思维)

    这题难道不是spaly裸题吗? 言归正传QWQ 一看到这个题目,其实第一反应是很懵X的 从来没有见过类似的题目啊,什么\(spaly\),单旋.QWQ很懵逼啊 不过,我们可以注意到这么一件事情,就是我 ...

  4. DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告

    DFS and  BFS 在解题前我们还是大致讲一下dfs与bfs的.(我感觉我不会bfs) 1.DFS dfs(深度优先算法) 正如其名,dfs是相当的深度,不走到最深处绝不回头的那种. 深度优先搜 ...

  5. C# 提取PDF中的表格

    本文介绍在C#程序中(附VB.NET代码)提取PDF中的表格的方法,调用Spire.PDF for .NET提供的提取表格的类以及方法等来获取表格单元格中的文本内容:代码内容中涉及到的主要类及方法归纳 ...

  6. struts2漏洞复现分析合集

    struts2漏洞复现合集 环境准备 tomcat安装 漏洞代码取自vulhub,使用idea进行远程调试 struts2远程调试 catalina.bat jpda start 开启debug模式, ...

  7. Kubernetes client-go 源码分析 - Reflector

    概述入口 - Reflector.Run()核心 - Reflector.ListAndWatch()Reflector.watchHandler()NewReflector()小结 概述 源码版本: ...

  8. Go语言核心36讲(Go语言进阶技术四)--学习笔记

    10 | 通道的基本操作 作为 Go 语言最有特色的数据类型,通道(channel)完全可以与 goroutine(也可称为 go 程)并驾齐驱,共同代表 Go 语言独有的并发编程模式和编程哲学. D ...

  9. XSS_Labs靶场通关

    XSS-labs靶场(1-20) 开始通关!   0x01 (直接漏洞注入) 反射型xss注入 1.遇到?name=text,尝试参数注入 注入语句: <script>alert('xss ...

  10. [no code][scrum meeting] Alpha 4

    项目 内容 会议时间 2020-04-09 会议主题 OCR相关的技术展示与讨论 会议时长 30min 参会人员 全体成员 $( "#cnblogs_post_body" ).ca ...