当前位置:首页 » 新媒体运营 » 正文

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

6397 人参与  2022年08月02日 14:19  分类 : 新媒体运营  评论
Keras介绍

  Keras是一个开源的高层神经网络API,由纯Python编写而成,其后端可以基于Tensorflow、Theano、MXNet以及CNTK。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果。Keras适用的Python版本是:Python .-.。  Keras,在希腊语中意为“角”(horn),于年月份第一次发行,它可以在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 sysimport keras as Kimport tensorflow as tfpy_ver = sys.versionk_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 .. (v..:acee, Dec   , ::) [MSC v.  bit (AMD)]Using Keras version ..Using TensorFlow version ..

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

IRIS数据集介绍

  IRIS数据集(鸢尾花数据集),是一个经典的机器学习数据集,适合作为多分类问题的测试数据,它的下载地址为:
http://archive.ics.uci.edu/ml/machine-learning-databases/iris/。
  IRIS数据集是用来给鸢尾花做分类的数据集,一共个样本,每个样本包含了花萼长度(sepal length in cm)、花萼宽度(sepal width in cm)、花瓣长度(petal length in cm)、花瓣宽度(petal width in cm)四个特征,将鸢尾花分为三类,分别为Iris Setosa,Iris Versicolour,Iris Virginica,每一类都有个样本。
  IRIS数据集具体如下(只展示部分数据,顺序已打乱):

IRIS数据集(部分)

iris数据集预览

读取数据集

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

import pandas as pdfrom sklearn.model_selection import train_test_splitfrom 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])    # 对目标变量进行-编码(One-hot Encoding)    lb = LabelBinarizer()    lb.fit(list(Class_dict.values()))    transformed_labels = lb.transform(IRIS[&#;target&#;])    y_bin_labels = []  # 对多分类进行-编码的变量    for i in range(transformed_labels.shape[]):        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=., test_size=., random_state=)    return train_x, test_x, train_y, test_y, Class_dict
搭建DNN

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

DNN结构图

我们搭建的DNN由输入层、隐藏层、输出层和softmax函数组成,其中输入层由个神经元组成,对应IRIS数据集中的个特征,作为输入向量,隐藏层有两层,每层分别有和个神经元,之后就是输出层,由个神经元组成,对应IRIS数据集的目标变量的类别个数,最后,就是一个softmax函数,用于解决多分类问题而创建。
  对应以上的DNN结构,用Keras来搭建的话,其Python代码如下:

   import keras as K    # . 定义模型    init = K.initializers.glorot_uniform(seed=)    simple_adam = K.optimizers.Adam()    model = K.models.Sequential()    model.add(K.layers.Dense(units=, input_dim=, kernel_initializer=init, activation=&#;relu&#;))    model.add(K.layers.Dense(units=, kernel_initializer=init, activation=&#;relu&#;))    model.add(K.layers.Dense(units=, 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,定义完模型后,我们需要对模型进行训练、评估及预测。对于模型训练,我们每次训练的批数为,共迭代次,代码如下(接以上代码):

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

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

    # . 评估模型    eval = model.evaluate(test_x, test_y, verbose=)    print("Evaluation on test data: loss = %.f accuracy = %.f%% 
"           % (eval[], eval[] * ) )

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

Starting training Epoch /  / [..............................] - ETA: s - loss: . - acc: . / [===========>..................] - ETA: s - loss: . - acc: .  / [========================>.....] - ETA: s - loss: . - acc: ./ [==============================] - s ms/step - loss: . - acc: .Epoch /  / [..............................] - ETA: s - loss: . - acc: . / [===========>..................] - ETA: s - loss: . - acc: . / [=========================>....] - ETA: s - loss: . - acc: ./ [==============================] - s ms/step - loss: . - acc: .......Epoch /  / [..............................] - ETA: s - loss: . - acc: . / [===========>..................] - ETA: s - loss: . - acc: . / [=======================>......] - ETA: s - loss: . - acc: ./ [==============================] - s ms/step - loss: . - acc: .Epoch /  / [..............................] - ETA: s - loss: . - acc: .e+ / [=============>................] - ETA: s - loss: . - acc: .     / [===========================>..] - ETA: s - loss: . - acc: ./ [==============================] - s ms/step - loss: . - acc: .Training finished Evaluation on test data: loss = . accuracy = .%

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

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

输出的结果如下:

Using model to predict species for features: [[ .  .  .  .]]Predicted softmax vector is: [[  .e-   .e-   .e-]]Predicted species is: versicolor

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

总结

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

# iris_keras_dnn.py# Python .., TensorFlow .., Keras ..# ========================================================# 导入模块import osimport numpy as npimport keras as Kimport tensorflow as tfimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import LabelBinarizeros.environ[&#;TF_CPP_MIN_LOG_LEVEL&#;]=&#;&#;# 读取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])    # 对目标变量进行-编码(One-hot Encoding)    lb = LabelBinarizer()    lb.fit(list(Class_dict.values()))    transformed_labels = lb.transform(IRIS[&#;target&#;])    y_bin_labels = []  # 对多分类进行-编码的变量    for i in range(transformed_labels.shape[]):        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=., test_size=., random_state=)    return train_x, test_x, train_y, test_y, Class_dictdef main():    # . 开始    print("
Iris dataset using Keras/TensorFlow ")    np.random.seed()    tf.set_random_seed()    # . 读取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)    # . 定义模型    init = K.initializers.glorot_uniform(seed=)    simple_adam = K.optimizers.Adam()    model = K.models.Sequential()    model.add(K.layers.Dense(units=, input_dim=, kernel_initializer=init, activation=&#;relu&#;))    model.add(K.layers.Dense(units=, kernel_initializer=init, activation=&#;relu&#;))    model.add(K.layers.Dense(units=, kernel_initializer=init, activation=&#;softmax&#;))    model.compile(loss=&#;categorical_crossentropy&#;, optimizer=simple_adam, metrics=[&#;accuracy&#;])    # . 训练模型    b_size =     max_epochs =     print("Starting training ")    h = model.fit(train_x, train_y, batch_size=b_size, epochs=max_epochs, shuffle=True, verbose=)    print("Training finished 
")    # . 评估模型    eval = model.evaluate(test_x, test_y, verbose=)    print("Evaluation on test data: loss = %.f accuracy = %.f%% 
"           % (eval[], eval[] * ) )    # . 使用模型进行预测    np.set_printoptions(precision=)    unknown = np.array([[., ., ., .]], dtype=np.float)    predicted = model.predict(unknown)    print("Using model to predict species for features: ")    print(unknown)    print("
Predicted softmax vector is: ")    print(predicted)    species_dict = {v:k for k,v in Class_dict.items()}    print("
Predicted species is: ")    print(species_dict[np.argmax(predicted)])main()
参考文献
  1. Keras中文文档: https://keras-cn.readthedocs.io/en/latest/

  2. Keras Succinctly: http://ebooks.syncfusion.com/downloads/keras-succinctly/keras-succinctly.pdf?AWSAccessKeyId=AKIAJWGZFZHAREQ&Expires=&Signature=rqJ%BPKUEUWMObSLd%Flkqw%D

  3. IRIS数据集: http://archive.ics.uci.edu/ml/machine-learning-databases/iris/

本文链接:https://www.woshiqian.com/post/127243.html

百度分享获取地址:https://share.baidu.com/code
dnn深度神经网络  

我是钱微信/QQ:5087088

广告位、广告合作QQ:5087088

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

       

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。