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的版本号:

import sys
import keras as K
import tensorflow as tfpy_ver = sys.version
k_ver = K.__version__
tf_ver = tf.__version__print("Using Python version " + str(py_ver))
print("Using Keras version " + str(k_ver))
print("Using TensorFlow version " + str(tf_ver))

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

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

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

IRIS数据集介绍

  IRIS数据集(鸢尾花数据集),是一个经典的机器学习数据集,适合作为多分类问题的测试数据,它的下载地址为:http://archive.ics.uci.edu/ml...。
  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代码如下:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer# 读取CSV数据集,并拆分为训练集和测试集
# 该函数的传入参数为CSV_FILE_PATH: csv文件路径
def load_data(CSV_FILE_PATH):IRIS = pd.read_csv(CSV_FILE_PATH)target_var = 'class'  # 目标变量# 数据集的特征features = list(IRIS.columns)features.remove(target_var)# 目标变量的类别Class = IRIS[target_var].unique()# 目标变量的类别字典Class_dict = dict(zip(Class, range(len(Class))))# 增加一列target, 将目标变量进行编码IRIS['target'] = IRIS[target_var].apply(lambda x: Class_dict[x])# 对目标变量进行0-1编码(One-hot Encoding)lb = LabelBinarizer()lb.fit(list(Class_dict.values()))transformed_labels = lb.transform(IRIS['target'])y_bin_labels = []  # 对多分类进行0-1编码的变量for i in range(transformed_labels.shape[1]):y_bin_labels.append('y' + str(i))IRIS['y' + str(i)] = transformed_labels[:, i]# 将数据集分为训练集和测试集train_x, test_x, train_y, test_y = train_test_split(IRIS[features], IRIS[y_bin_labels], \train_size=0.7, test_size=0.3, random_state=0)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代码如下:

   import keras as K# 2. 定义模型init = K.initializers.glorot_uniform(seed=1)simple_adam = K.optimizers.Adam()model = K.models.Sequential()model.add(K.layers.Dense(units=5, input_dim=4, kernel_initializer=init, activation='relu'))model.add(K.layers.Dense(units=6, kernel_initializer=init, activation='relu'))model.add(K.layers.Dense(units=3, kernel_initializer=init, activation='softmax'))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次,代码如下(接以上代码):

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

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

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

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

Starting training
Epoch 1/1001/105 [..............................] - ETA: 17s - loss: 0.3679 - acc: 1.000042/105 [===========>..................] - ETA: 0s - loss: 1.8081 - acc: 0.3095 89/105 [========================>.....] - ETA: 0s - loss: 1.5068 - acc: 0.4270
105/105 [==============================] - 0s 3ms/step - loss: 1.4164 - acc: 0.4667
Epoch 2/1001/105 [..............................] - ETA: 0s - loss: 0.4766 - acc: 1.000045/105 [===========>..................] - ETA: 0s - loss: 1.0813 - acc: 0.488993/105 [=========================>....] - ETA: 0s - loss: 1.0335 - acc: 0.4839
105/105 [==============================] - 0s 1ms/step - loss: 1.0144 - acc: 0.4857......Epoch 99/1001/105 [..............................] - ETA: 0s - loss: 0.0013 - acc: 1.000043/105 [===========>..................] - ETA: 0s - loss: 0.0447 - acc: 0.976784/105 [=======================>......] - ETA: 0s - loss: 0.0824 - acc: 0.9524
105/105 [==============================] - 0s 1ms/step - loss: 0.0711 - acc: 0.9619
Epoch 100/1001/105 [..............................] - ETA: 0s - loss: 2.3032 - acc: 0.0000e+0051/105 [=============>................] - ETA: 0s - loss: 0.1122 - acc: 0.9608    99/105 [===========================>..] - ETA: 0s - loss: 0.0755 - acc: 0.9798
105/105 [==============================] - 0s 1ms/step - loss: 0.0756 - acc: 0.9810
Training finished Evaluation on test data: loss = 0.094882 accuracy = 97.78% 

可以看到,训练完100次后,在测试集上的准确率已达到97.78%,效果相当好。
  最后是对新数据集进行预测,我们假设一朵鸢尾花的4个特征为6.1,3.1,5.1,1.1,我们想知道这个DNN模型会把它预测到哪一类,其Python代码如下:

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

输出的结果如下:

Using model to predict species for features:
[[ 6.1  3.1  5.1  1.1]]Predicted softmax vector is:
[[  2.0687e-07   9.7901e-01   2.0993e-02]]Predicted species is:
versicolor

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

总结

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

# iris_keras_dnn.py
# Python 3.5.1, TensorFlow 1.6.0, Keras 2.1.5
# ========================================================
# 导入模块
import os
import numpy as np
import keras as K
import tensorflow as tf
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'# 读取CSV数据集,并拆分为训练集和测试集
# 该函数的传入参数为CSV_FILE_PATH: csv文件路径
def load_data(CSV_FILE_PATH):IRIS = pd.read_csv(CSV_FILE_PATH)target_var = 'class'  # 目标变量# 数据集的特征features = list(IRIS.columns)features.remove(target_var)# 目标变量的类别Class = IRIS[target_var].unique()# 目标变量的类别字典Class_dict = dict(zip(Class, range(len(Class))))# 增加一列target, 将目标变量进行编码IRIS['target'] = IRIS[target_var].apply(lambda x: Class_dict[x])# 对目标变量进行0-1编码(One-hot Encoding)lb = LabelBinarizer()lb.fit(list(Class_dict.values()))transformed_labels = lb.transform(IRIS['target'])y_bin_labels = []  # 对多分类进行0-1编码的变量for i in range(transformed_labels.shape[1]):y_bin_labels.append('y' + str(i))IRIS['y' + str(i)] = transformed_labels[:, i]# 将数据集分为训练集和测试集train_x, test_x, train_y, test_y = train_test_split(IRIS[features], IRIS[y_bin_labels], \train_size=0.7, test_size=0.3, random_state=0)return train_x, test_x, train_y, test_y, Class_dictdef main():# 0. 开始print("\nIris dataset using Keras/TensorFlow ")np.random.seed(4)tf.set_random_seed(13)# 1. 读取CSV数据集print("Loading Iris data into memory")CSV_FILE_PATH = 'E://iris.csv'train_x, test_x, train_y, test_y, Class_dict = load_data(CSV_FILE_PATH)# 2. 定义模型init = K.initializers.glorot_uniform(seed=1)simple_adam = K.optimizers.Adam()model = K.models.Sequential()model.add(K.layers.Dense(units=5, input_dim=4, kernel_initializer=init, activation='relu'))model.add(K.layers.Dense(units=6, kernel_initializer=init, activation='relu'))model.add(K.layers.Dense(units=3, kernel_initializer=init, activation='softmax'))model.compile(loss='categorical_crossentropy', optimizer=simple_adam, metrics=['accuracy'])# 3. 训练模型b_size = 1max_epochs = 100print("Starting training ")h = model.fit(train_x, train_y, batch_size=b_size, epochs=max_epochs, shuffle=True, verbose=1)print("Training finished \n")# 4. 评估模型eval = model.evaluate(test_x, test_y, verbose=0)print("Evaluation on test data: loss = %0.6f accuracy = %0.2f%% \n" \% (eval[0], eval[1] * 100) )# 5. 使用模型进行预测np.set_printoptions(precision=4)unknown = np.array([[6.1, 3.1, 5.1, 1.1]], dtype=np.float32)predicted = model.predict(unknown)print("Using model to predict species for features: ")print(unknown)print("\nPredicted softmax vector is: ")print(predicted)species_dict = {v:k for k,v in Class_dict.items()}print("\nPredicted species is: ")print(species_dict[np.argmax(predicted)])main()

参考文献

  1. Keras中文文档: https://keras-cn.readthedocs....
  2. Keras Succinctly: http://ebooks.syncfusion.com/...
  3. IRIS数据集: http://archive.ics.uci.edu/ml...

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

  1. Keras入门之搭建回归神经网络

    Regressor 回归神经网络 参考资料:哔哩哔哩-莫烦python Keras快速搭建神经网络 通俗说也就是实现一个线性回归的数据预测. 以下是莫烦老师视频中的代码,我对一些细节添加了注释以方便阅 ...

  2. Keras入门(一)搭建深度神经网络(DNN)解决多分类问题 1

    Keras入门(一)搭建深度神经网络(DNN)解决多分类问题 参考文章: (1)Keras入门(一)搭建深度神经网络(DNN)解决多分类问题 (2)https://www.cnblogs.com/jc ...

  3. TensorFlow2.0(四)--Keras构建深度神经网络(DNN)

    Keras构建深度神经网络(DNN) 1. 深度神经网络简介 2. Kerase搭建DNN模型 2.1 导入相应的库 2.2 数据加载与归一化 2.3 网络模型的构建 2.4 批归一化,dropout ...

  4. 深度学习之手撕深度神经网络DNN代码(基于numpy)

    声明 1)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 2)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢 ...

  5. dnn神经网络_OpenCV3.3深度神经网络(DNN)模块

    今天,甜菇凉整理了一下电脑里面OpenCV深度神经网络(DNN)模块-应用视频教程,这个是贾志刚老师的视频,学习视觉的同学应该都知道贾志刚老师吧,他的视频很适合想要入门计算机视觉图像处理的小白学习,那 ...

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

    http://www.csdn.net/article/2014-07-11/2820628-DNN 深度神经网络(Deep Neural Networks, 简称DNN)是近年来机器学习领域中的研究 ...

  7. 讯飞输入法将深度神经网络DNN技术应用于语音识别达到业界领先水平

    10月20日,以"语见更好的我们"为主题的"讯飞输入法10周年 A.I.输入沙龙"在北京举办.记者从活动现场了解到,自2010年10月上线至今,讯飞输入法的日语 ...

  8. 理解深度神经网络——DNN(Deep Neural Networks)

    深度神经网络--DNN 是深度学习的基础. 要理解DNN最好先搞清楚它的模型.本篇博文主要对DNN的模型与前向传播算法做一个易于理解的总结. 1.从感知机到神经网络的理解. 感知机是这么一种模型:一个 ...

  9. 多层感知器及常见激活函数-深度神经网络DNN及计算推导

    多层感知器 在之前的博客中,我们了解到,感知器(指单层感知器)具有一定的局限--无法解决异或问题,即线性不可分的问题. 将多个单层感知器进行组合,就可以得到一个多层感知器(MLP--Multi-Lay ...

  10. 深度神经网络DNN的理解

    1.从感知机到神经网络 上图是一个感知机模型,有若干个输入和一个输出(输出的结果只可以是1或-1) 输入和输出有一个线性关系: 神经元激活函数:(二分类) 由于这个简单的感知机只可以进行二分类,则对于 ...

最新文章

  1. 自然语言处理ACL2020论文列表
  2. java.io.IOException: Stream closed
  3. 如何在阿里云上使用Data Lake Analytics分析Table Store数据
  4. 例子 客户端_服务端也是可以主动向客户端推送数据的--WebSocket
  5. my paper in EI
  6. href标签带上了localhont地址怎么删除_如何找回删除的微信好友?
  7. spring 主从表_听听京东架构师浅谈,MySQL binlog 主从同步
  8. python进阶11并发之七多种并发方式的效率测试
  9. 微软的新一代web开发工具 - WebMatrix2
  10. c# 注册了Ctrl+空格为热键,捕获后发送Ctrl+Shift
  11. a标签中执行js函数
  12. 2013 多校联合(1)个人总结
  13. Vue中watch用法详解
  14. 世界上最健康的作息时间表健康十不易
  15. 数据库设计4-概念结构设计
  16. 时间记录APP———Time Meter
  17. 线性代数系列(1)行列式
  18. 商业模式分析——3W2H分析法
  19. 12. FolderDialog、FileDialog、FolderListModel的简单使用
  20. 数据库like和rlike区别

热门文章

  1. 关于html5的使用简单总结
  2. 使用vux+ajax,Vue 应用中结合vux使用微信 jssdk的方法
  3. java new newinstance_Java中newInstance()和new()区别
  4. react页面数据过多怎么办_性能!!让你的 React 组件跑得再快一点,收藏
  5. FPGA逻辑设计回顾(3)多比特信号上升沿检测的设计方式与陷阱?
  6. FPGA之道(总)推荐下这本书以及传递下作者的原话
  7. HDLBits 系列(17) 计数器的级联实现1000分频的分频器
  8. Verilog: How to avoid 'Redeclaration of ansi port'
  9. 【 MATLAB 】sort ( Sort array elements )
  10. 解读ADC采样芯片(EV10AQ190A)的工作模式(单通道模式)