Keras介绍

  Keras是一个开源的高层神经网络API,由纯Python编写而成,其后端可以基于Tensorflow、Theano、MXNet以及CNTK。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果。Keras适用的Python版本是:Python 2.7-3.6。

  Keras,在希腊语中意为“角”(horn),于2015年3月份第一次发行,它可以在Windows, Linux, Mac等系统中运行。那么,既然有了TensorFlow(或Theano、MXNet、CNTK),为什么还需要Keras呢?这是因为,尽管我们可以用TensorFlow等来创建深度神经网络系统,但Tensorflow等使用相对低级的抽象,直接编写TensorFlow代码具有一定的挑战性,而Keras在TensorFlow的基础上,增加了较易使用的抽象层,使用起来更加简单、高效。

  什么样的场合适合用Keras呢?如果你有如下需求,请选择Keras:

  • 简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
  • 支持CNN和RNN,或二者的结合
  • 无缝CPU和GPU切换

  如果想用在你的电脑上使用Keras,需要以下工具:

  • Python
  • TensorFlow
  • Keras

在这里,我们选择TensorFlow作为Keras的后端工具。使用以下Python代码,可以输出Python、TensorFlow以及Keras的版本号:

  1. import sys
  2. import keras as K
  3. import tensorflow as tf
  4. py_ver = sys.version
  5. k_ver = K.__version__
  6. tf_ver = tf.__version__
  7. print("Using Python version " + str(py_ver))
  8. print("Using Keras version " + str(k_ver))
  9. print("Using TensorFlow version " + str(tf_ver))

在笔者的电脑上,输出的结果如下:

  1. Using TensorFlow backend.
  2. Using Python version 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)]
  3. Using Keras version 2.1.5
  4. Using TensorFlow version 1.6.0

  下面,笔者将使用IRIS数据集(鸢尾花数据集,一个经典的机器学习数据集,适合作为多分类问题的测试数据),使用Keras搭建一个深度神经网络(DNN),来解决IRIS数据集的多分类问题,作为Keras入门的第一个例子。

IRIS数据集介绍

  IRIS数据集(鸢尾花数据集),是一个经典的机器学习数据集,适合作为多分类问题的测试数据,它的下载地址为:http://archive.ics.uci.edu/ml/machine-learning-databases/iris/。

  IRIS数据集是用来给鸢尾花做分类的数据集,一共150个样本,每个样本包含了花萼长度(sepal length in cm)、花萼宽度(sepal width in cm)、花瓣长度(petal length in cm)、花瓣宽度(petal width in cm)四个特征,将鸢尾花分为三类,分别为Iris Setosa,Iris Versicolour,Iris Virginica,每一类都有50个样本。

  IRIS数据集具体如下(只展示部分数据,顺序已打乱):

读取数据集

  笔者的IRIS数据集以csv格式储存,笔者将使用Pandas来读取IRIS数据集,并对目标变量进行0-1编码(One-hot Encoding),最后将该数据集分为训练集和测试集,比例为7:3。完整的Python代码如下:

  1. import pandas as pd
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.preprocessing import LabelBinarizer
  4. # 读取CSV数据集,并拆分为训练集和测试集
  5. # 该函数的传入参数为CSV_FILE_PATH: csv文件路径
  6. def load_data(CSV_FILE_PATH):
  7. IRIS = pd.read_csv(CSV_FILE_PATH)
  8. target_var = 'class' # 目标变量
  9. # 数据集的特征
  10. features = list(IRIS.columns)
  11. features.remove(target_var)
  12. # 目标变量的类别
  13. Class = IRIS[target_var].unique()
  14. # 目标变量的类别字典
  15. Class_dict = dict(zip(Class, range(len(Class))))
  16. # 增加一列target, 将目标变量进行编码
  17. IRIS['target'] = IRIS[target_var].apply(lambda x: Class_dict[x])
  18. # 对目标变量进行0-1编码(One-hot Encoding)
  19. lb = LabelBinarizer()
  20. lb.fit(list(Class_dict.values()))
  21. transformed_labels = lb.transform(IRIS['target'])
  22. y_bin_labels = [] # 对多分类进行0-1编码的变量
  23. for i in range(transformed_labels.shape[1]):
  24. y_bin_labels.append('y' + str(i))
  25. IRIS['y' + str(i)] = transformed_labels[:, i]
  26. # 将数据集分为训练集和测试集
  27. train_x, test_x, train_y, test_y = train_test_split(IRIS[features], IRIS[y_bin_labels], \
  28. train_size=0.7, test_size=0.3, random_state=0)
  29. return train_x, test_x, train_y, test_y, Class_dict

搭建DNN

  接下来,笔者将展示如何利用Keras来搭建一个简单的深度神经网络(DNN)来解决这个多分类问题。我们要搭建的DNN的结构如下图所示:

我们搭建的DNN由输入层、隐藏层、输出层和softmax函数组成,其中输入层由4个神经元组成,对应IRIS数据集中的4个特征,作为输入向量,隐藏层有两层,每层分别有5和6个神经元,之后就是输出层,由3个神经元组成,对应IRIS数据集的目标变量的类别个数,最后,就是一个softmax函数,用于解决多分类问题而创建。

  对应以上的DNN结构,用Keras来搭建的话,其Python代码如下:

  1. import keras as K
  2. # 2. 定义模型
  3. init = K.initializers.glorot_uniform(seed=1)
  4. simple_adam = K.optimizers.Adam()
  5. model = K.models.Sequential()
  6. model.add(K.layers.Dense(units=5, input_dim=4, kernel_initializer=init, activation='relu'))
  7. model.add(K.layers.Dense(units=6, kernel_initializer=init, activation='relu'))
  8. model.add(K.layers.Dense(units=3, kernel_initializer=init, activation='softmax'))
  9. model.compile(loss='categorical_crossentropy', optimizer=simple_adam, metrics=['accuracy'])

在这个模型中,我们选择的神经元激活函数为ReLU函数,损失函数为交叉熵(cross entropy),迭代的优化器(optimizer)选择Adam,最初各个层的连接权重(weights)和偏重(biases)是随机生成的。这样我们就讲这个DNN的模型定义完毕了。这么简单?Yes, that's it!

训练及预测

  OK,定义完模型后,我们需要对模型进行训练、评估及预测。对于模型训练,我们每次训练的批数为1,共迭代100次,代码如下(接以上代码):

  1. # 3. 训练模型
  2. b_size = 1
  3. max_epochs = 100
  4. print("Starting training ")
  5. h = model.fit(train_x, train_y, batch_size=b_size, epochs=max_epochs, shuffle=True, verbose=1)
  6. print("Training finished \n")

  为了对模型有个评估,感知模型的表现,需要输出该DNN模型的损失函数的值以及在测试集上的准确率,其Python代码如下(接以上代码):

  1. # 4. 评估模型
  2. eval = model.evaluate(test_x, test_y, verbose=0)
  3. print("Evaluation on test data: loss = %0.6f accuracy = %0.2f%% \n" \
  4. % (eval[0], eval[1] * 100) )

训练100次,输出的结果如下(中间部分的训练展示已忽略):

  1. Starting training
  2. Epoch 1/100
  3. 1/105 [..............................] - ETA: 17s - loss: 0.3679 - acc: 1.0000
  4. 42/105 [===========>..................] - ETA: 0s - loss: 1.8081 - acc: 0.3095
  5. 89/105 [========================>.....] - ETA: 0s - loss: 1.5068 - acc: 0.4270
  6. 105/105 [==============================] - 0s 3ms/step - loss: 1.4164 - acc: 0.4667
  7. Epoch 2/100
  8. 1/105 [..............................] - ETA: 0s - loss: 0.4766 - acc: 1.0000
  9. 45/105 [===========>..................] - ETA: 0s - loss: 1.0813 - acc: 0.4889
  10. 93/105 [=========================>....] - ETA: 0s - loss: 1.0335 - acc: 0.4839
  11. 105/105 [==============================] - 0s 1ms/step - loss: 1.0144 - acc: 0.4857
  12. ......
  13. Epoch 99/100
  14. 1/105 [..............................] - ETA: 0s - loss: 0.0013 - acc: 1.0000
  15. 43/105 [===========>..................] - ETA: 0s - loss: 0.0447 - acc: 0.9767
  16. 84/105 [=======================>......] - ETA: 0s - loss: 0.0824 - acc: 0.9524
  17. 105/105 [==============================] - 0s 1ms/step - loss: 0.0711 - acc: 0.9619
  18. Epoch 100/100
  19. 1/105 [..............................] - ETA: 0s - loss: 2.3032 - acc: 0.0000e+00
  20. 51/105 [=============>................] - ETA: 0s - loss: 0.1122 - acc: 0.9608
  21. 99/105 [===========================>..] - ETA: 0s - loss: 0.0755 - acc: 0.9798
  22. 105/105 [==============================] - 0s 1ms/step - loss: 0.0756 - acc: 0.9810
  23. Training finished
  24. Evaluation on test data: loss = 0.094882 accuracy = 97.78%

可以看到,训练完100次后,在测试集上的准确率已达到97.78%,效果相当好。

  最后是对新数据集进行预测,我们假设一朵鸢尾花的4个特征为6.1,3.1,5.1,1.1,我们想知道这个DNN模型会把它预测到哪一类,其Python代码如下:

  1. import numpy as np
  2. # 5. 使用模型进行预测
  3. np.set_printoptions(precision=4)
  4. unknown = np.array([[6.1, 3.1, 5.1, 1.1]], dtype=np.float32)
  5. predicted = model.predict(unknown)
  6. print("Using model to predict species for features: ")
  7. print(unknown)
  8. print("\nPredicted softmax vector is: ")
  9. print(predicted)
  10. species_dict = {v:k for k,v in Class_dict.items()}
  11. print("\nPredicted species is: ")
  12. print(species_dict[np.argmax(predicted)])

输出的结果如下:

  1. Using model to predict species for features:
  2. [[ 6.1 3.1 5.1 1.1]]
  3. Predicted softmax vector is:
  4. [[ 2.0687e-07 9.7901e-01 2.0993e-02]]
  5. Predicted species is:
  6. versicolor

如果我们仔细地比对IRIS数据集,就会发现,这个预测结果令人相当满意,这个鸢尾花样本的预测结果,以人类的眼光来看,也应当是versicolor。

总结

  到此为止,笔者就把这个演示例子给讲完了,作为入门Keras的第一步,这个例子还是可以的。回顾该模型,首先我们利用Pandas读取IRIS数据集,并分为训练集和测试集,然后用Keras搭建了一个简单的DNN模型,并对该模型进行训练及评估,最后看一下该模型在新数据集上的预测能力。从中,读者不难体会到Keras的优越性,因为,相比TensorFlow,搭建同样的DNN模型及模型训练、评估、预测,其Python代码无疑会比Keras来得长。

  最后,附上该DNN模型的完整Python代码:

  1. # iris_keras_dnn.py
  2. # Python 3.5.1, TensorFlow 1.6.0, Keras 2.1.5
  3. # ========================================================
  4. # 导入模块
  5. import os
  6. import numpy as np
  7. import keras as K
  8. import tensorflow as tf
  9. import pandas as pd
  10. from sklearn.model_selection import train_test_split
  11. from sklearn.preprocessing import LabelBinarizer
  12. os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
  13. # 读取CSV数据集,并拆分为训练集和测试集
  14. # 该函数的传入参数为CSV_FILE_PATH: csv文件路径
  15. def load_data(CSV_FILE_PATH):
  16. IRIS = pd.read_csv(CSV_FILE_PATH)
  17. target_var = 'class' # 目标变量
  18. # 数据集的特征
  19. features = list(IRIS.columns)
  20. features.remove(target_var)
  21. # 目标变量的类别
  22. Class = IRIS[target_var].unique()
  23. # 目标变量的类别字典
  24. Class_dict = dict(zip(Class, range(len(Class))))
  25. # 增加一列target, 将目标变量进行编码
  26. IRIS['target'] = IRIS[target_var].apply(lambda x: Class_dict[x])
  27. # 对目标变量进行0-1编码(One-hot Encoding)
  28. lb = LabelBinarizer()
  29. lb.fit(list(Class_dict.values()))
  30. transformed_labels = lb.transform(IRIS['target'])
  31. y_bin_labels = [] # 对多分类进行0-1编码的变量
  32. for i in range(transformed_labels.shape[1]):
  33. y_bin_labels.append('y' + str(i))
  34. IRIS['y' + str(i)] = transformed_labels[:, i]
  35. # 将数据集分为训练集和测试集
  36. train_x, test_x, train_y, test_y = train_test_split(IRIS[features], IRIS[y_bin_labels], \
  37. train_size=0.7, test_size=0.3, random_state=0)
  38. return train_x, test_x, train_y, test_y, Class_dict
  39. def main():
  40. # 0. 开始
  41. print("\nIris dataset using Keras/TensorFlow ")
  42. np.random.seed(4)
  43. tf.set_random_seed(13)
  44. # 1. 读取CSV数据集
  45. print("Loading Iris data into memory")
  46. CSV_FILE_PATH = 'E://iris.csv'
  47. train_x, test_x, train_y, test_y, Class_dict = load_data(CSV_FILE_PATH)
  48. # 2. 定义模型
  49. init = K.initializers.glorot_uniform(seed=1)
  50. simple_adam = K.optimizers.Adam()
  51. model = K.models.Sequential()
  52. model.add(K.layers.Dense(units=5, input_dim=4, kernel_initializer=init, activation='relu'))
  53. model.add(K.layers.Dense(units=6, kernel_initializer=init, activation='relu'))
  54. model.add(K.layers.Dense(units=3, kernel_initializer=init, activation='softmax'))
  55. model.compile(loss='categorical_crossentropy', optimizer=simple_adam, metrics=['accuracy'])
  56. # 3. 训练模型
  57. b_size = 1
  58. max_epochs = 100
  59. print("Starting training ")
  60. h = model.fit(train_x, train_y, batch_size=b_size, epochs=max_epochs, shuffle=True, verbose=1)
  61. print("Training finished \n")
  62. # 4. 评估模型
  63. eval = model.evaluate(test_x, test_y, verbose=0)
  64. print("Evaluation on test data: loss = %0.6f accuracy = %0.2f%% \n" \
  65. % (eval[0], eval[1] * 100) )
  66. # 5. 使用模型进行预测
  67. np.set_printoptions(precision=4)
  68. unknown = np.array([[6.1, 3.1, 5.1, 1.1]], dtype=np.float32)
  69. predicted = model.predict(unknown)
  70. print("Using model to predict species for features: ")
  71. print(unknown)
  72. print("\nPredicted softmax vector is: ")
  73. print(predicted)
  74. species_dict = {v:k for k,v in Class_dict.items()}
  75. print("\nPredicted species is: ")
  76. print(species_dict[np.argmax(predicted)])
  77. main()

参考文献

  1. Keras中文文档: https://keras-cn.readthedocs.io/en/latest/
  2. Keras Succinctly: http://ebooks.syncfusion.com/downloads/keras-succinctly/keras-succinctly.pdf?AWSAccessKeyId=AKIAJ5W3G2Z6F2ZHAREQ&Expires=1539315050&Signature=r6qJ%2BP7KUEU442WMObSLd2%2Flkqw%3D
  3. IRIS数据集: http://archive.ics.uci.edu/ml/machine-learning-databases/iris/

注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~

Keras入门(一)搭建深度神经网络(DNN)解决多分类问题的更多相关文章

  1. 深度神经网络DNN的多GPU数据并行框架 及其在语音识别的应用

    深度神经网络(Deep Neural Networks, 简称DNN)是近年来机器学习领域中的研究热点,产生了广泛的应用.DNN具有深层结构.数千万参数需要学习,导致训练非常耗时.GPU有强大的计算能 ...

  2. 深度学习:Keras入门(二)之卷积神经网络(CNN)

    说明:这篇文章需要有一些相关的基础知识,否则看起来可能比较吃力. 1.卷积与神经元 1.1 什么是卷积? 简单来说,卷积(或内积)就是一种先把对应位置相乘然后再把结果相加的运算.(具体含义或者数学公式 ...

  3. 深度学习:Keras入门(二)之卷积神经网络(CNN)【转】

    本文转载自:https://www.cnblogs.com/lc1217/p/7324935.html 说明:这篇文章需要有一些相关的基础知识,否则看起来可能比较吃力. 1.卷积与神经元 1.1 什么 ...

  4. 深度学习:Keras入门(二)之卷积神经网络(CNN)(转)

    转自http://www.cnblogs.com/lc1217/p/7324935.html 1.卷积与神经元 1.1 什么是卷积? 简单来说,卷积(或内积)就是一种先把对应位置相乘然后再把结果相加的 ...

  5. 一天搞懂深度学习-训练深度神经网络(DNN)的要点

    前言 这是<一天搞懂深度学习>的第二部分 一.选择合适的损失函数 典型的损失函数有平方误差损失函数和交叉熵损失函数. 交叉熵损失函数: 选择不同的损失函数会有不同的训练效果 二.mini- ...

  6. 使用NetworkX模块绘制深度神经网络(DNN)结构图

      本文将展示如何利用Python中的NetworkX模块来绘制深度神经网络(DNN)结构图.   在文章Keras入门(一)搭建深度神经网络(DNN)解决多分类问题中,我们创建的DNN结构图如下: ...

  7. 神经网络6_CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)概念区分理解

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程,QQ:231469242) https://study.163.com/course/introduction.htm?courseId ...

  8. 深度神经网络(DNN)模型与前向传播算法

    深度神经网络(Deep Neural Networks, 以下简称DNN)是深度学习的基础,而要理解DNN,首先我们要理解DNN模型,下面我们就对DNN的模型与前向传播算法做一个总结. 1. 从感知机 ...

  9. 深度神经网络(DNN)

    深度神经网络(DNN) 深度神经网络(Deep Neural Networks, 以下简称DNN)是深度学习的基础,而要理解DNN,首先我们要理解DNN模型,下面我们就对DNN的模型与前向传播算法做一 ...

随机推荐

  1. django2+python3+uwsgi+centos7部署网站

    Centos7中安装Python虚拟环境 2018年08月27日 00:09:36 kaichenkai 阅读数:984 1.为什么要搭建虚拟环境? 问题:如果在一台电脑上, 想开发多个不同的项目, ...

  2. jupyter-notebook快捷键

    Jupyter Notebook 的快捷键 Jupyter Notebook 有两种键盘输入模式.编辑模式,允许你往单元中键入代码或文本:这时的单元框线是绿色的.命令模式,键盘输入运行程序命令:这时的 ...

  3. java.lang.OutOfMemoryError: PermGen space (jvm内存泄漏解决办法)

    2.在myeclipse根目录 打开myeclipse.ini 3.在myeclipse中配置内存

  4. c++ 实现hashmap

    由于hashmap不是c++ stl中标准实现,这样在跨平台使用时就可能会出现问题,于是想到自己实现一个hashmap hash算法使用开链法解决hash冲突,主要实现了添加,删除,查找几个方法 头文 ...

  5. 背水一战 Windows 10 (113) - 锁屏: 将 Application 的 Badge 通知和 Tile 通知发送到锁屏, 将 secondary tile 的 Badge 通知和 Tile 通知发送到锁屏

    [源码下载] 背水一战 Windows 10 (113) - 锁屏: 将 Application 的 Badge 通知和 Tile 通知发送到锁屏, 将 secondary tile 的 Badge ...

  6. 背水一战 Windows 10 (94) - 选取器: 自定义文件打开选取器

    [源码下载] 背水一战 Windows 10 (94) - 选取器: 自定义文件打开选取器 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件打开选取器 示例1.演示如何 ...

  7. FFmpeg开发实战(一):FFmpeg 打印日志

    在Visual Studio 开发(二):VS 2017配置FFmpeg开发环境一文中,我们配置好了FFmpeg的开发环境,下面我们开始边实战,边学习FFmpeg. 首先,我们要学习的就是FFmpeg ...

  8. itemKNN发展史----推荐系统的三篇重要的论文解读

    itemKNN发展史----推荐系统的三篇重要的论文解读 本文用到的符号标识 1.Item-based CF 基本过程: 计算相似度矩阵 Cosine相似度 皮尔逊相似系数 参数聚合进行推荐 根据用户 ...

  9. 第68节:Java中的MYSQL运用从小白到大牛

    第68节:Java中的MYSQL运用从小白到大牛 前言 学习java必备要求,学会运用!!! 常见关系化数据库 BootStrap是轻量级开发响应式页面的框架,全局css组件,js插件.栅格系统是将页 ...

  10. python2程序移植python3的一些注意事项

    1 queue: python2: import Queue python3: import queue 2 queue size: python2: cache = Queue.Queue(maxs ...