Keras深度学习库多级分类教程

2017年07月11日 由 yuxiangyu 发表 651867 0
Keras是一个用于深度学习的Python库,其中包含了有效的数字库Theano和TensorFlow。

在本教程中,您将发现如何使用Keras开发和评估多级分类问题的神经网络模型。

完成本教程后,您将了解到:

  • 如何从CSV加载数据并将其提供给Keras。

  • 如何编制多级分类数据,以供神经网络建模。

  • 如何用scikit- learn来评估Keras神经网络模型


让我们开始吧。

  • 更新2010年10月/ 2016日:更新了Keras 1.1.0和scikit-learn v0.18的示例。

  • 更新2010年3月7日:更新了Keras 2.0.2,TensorFlow 1.0.1和Theano 0.9.0的示例。

  • 更新2011年6月/更新:在输出层中使用softmax激活的更新示例,较大的隐藏层,默认权重初始化。


1.问题描述


在本教程中,我们将使用称为iris flowers dataset的标准机器学习问题。

这个数据集充分地进行了研究,并且在神经网络上也是一个很好实践的问题,因为所有的4个输入变量都是数字,在厘米中规模相同。每个实例都描述了可观察到的flower测量值的属性,而且输出变量是特定的iris species。

这是一个多类别的分类问题,这意味着有两个以上的类可以预测,其实有三种flower。这是使用神经网络进行实践的一个重要类型的问题,因为三个类的值需要专门的处理。

iris flowers dataset是一个经过深入研究的问题,我们可以期望在95%至97%的范围内实现模型精度。这为开发我们的模型提供了一个很好的目标。

您可以从UCI Machine Learning存储库下载iris flowers dataset,并将其放在您当前的工作目录中,文件名为 “ iris.csv ”。

2.导入类和函数


我们可以从本教程中导入我们将需要的所有类和函数开始。

这包括我们从Keras需要的功能,还包括来自pandas数据加载以及从scikit-learn的数据准备和模型评估。
import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from keras.utils import np_utils
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.preprocessing import LabelEncoder
from sklearn.pipeline import Pipeline

3.初始化随机数生成器


接下来,我们需要将随机数生成器初始化为常数值(7)。

这对于确保我们从该模型实现的结果可以再次精确地实现来说非常重要。它确保了可以复制训练神经网络模型的随机过程。
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)

4.加载数据集


数据集可以直接加载。因为输出变量包含字符串,所以最容易使用panda加载数据。然后我们可以将属性(列)分割成输入变量(X)和输出变量(Y)。
# load dataset
dataframe = pandas.read_csv("iris.csv", header=None)
dataset = dataframe.values
X = dataset[:,0:4].astype(float)
Y = dataset[:,4]

5.编码输出变量


输出变量包含三个不同的字符串值。

建模时多使用神经网络分类问题,是一种很好的做法重塑输出属性从一个向量,其中包含值为每个类值为每个类矩阵和布尔值和给定实例是否有这类值。

这被称为一个独热编码或从分类变量创建虚拟变量。

例如,在这个问题上,三个类别的值是Iris-setosa,Iris-versicolor和Iris-virginica。如果我们有观测值:
Iris-setosa
Iris-versicolor
Iris-virginica

我们可以将其转换为每个数据实例的独热编码的二进制矩阵,如下所示:
Iris-setosa, Iris-versicolor, Iris-virginica
1, 0, 0
0, 1, 0
0, 0, 1

我们可以通过使用scikit-learn类的LabelEncoder将字符串一致地编码为整数来实现。然后使用Keras函数to_categorical()将整数向量转换为独热编码。
# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_Y)

6.定义神经网络模型


Keras库提供封装类,以便您可以在scikit学习中使用Keras开发的神经网络模型。

Keras中有一个KerasClassifier类,可用作scikit-learn中的评估,该库是库中的基本类型。KerasClassifier将一个函数的名称作为参数。该函数必须返回构建的神经网络模型,准备进行训练。

以下是为虹膜分类问题创建基线神经网络的函数。它创建一个简单的完全连接的网络,其中一个隐藏层包含8个神经元。

隐藏层使用整流器激活函数,这是一个很好的做法。因为我们对我们的虹膜数据集使用独热编码,所以输出层必须创建3个输出值,每个类别一个。具有最大值的输出值将被视为模型预测的类别。

该简单单层神经网络的网络拓扑结构可概括为:
4 inputs -> [8 hidden nodes] -> 3 outputs

请注意,我们在输出层使用“ softmax ”激活函数。这是为了确保输出值在0和1的范围内,可以用作预测概率。

最后,网络使用具有对数丢失函数的有效亚当梯度下降优化算法,在Keras中称为“ 分类相关性”。
# define baseline model
def baseline_model():
# create model
model = Sequential()
model.add(Dense(8, input_dim=4, activation='relu'))
model.add(Dense(3, activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model

我们现在可以创建我们的KerasClassifier,用于scikit-learn。

我们还可以在构造KerasClassifier类中传递参数,该类将被传递给内部用于训练神经网络的fit()函数。在这里,当训练模型时我们epochs的传递次数为200并且批处理大小为5。当verbose训练设置为0时也会关闭调试。
estimator = KerasClassifier(build_fn=baseline_model, epochs=200, batch_size=5, verbose=0)

7.使用k-fold交叉验证评估模型


我们现在可以对我们的训练数据评估神经网络模型。

scikit- learn有很好的能力来评估使用一套技术的模型。评估机器学习模型的黄金标准是k折交叉验证。

首先我们可以定义模型评估过程。在这里,我们将折叠数设置为10(很好的默认值),并在分割之前对数据进行调整。
kfold = KFold(n_splits=10, shuffle=True, random_state=seed)

现在我们可以使用10倍的交叉验证程序(kfold)来评估我们的数据集(X和dummy_y)上的模型(估计量)。

评估模型只需要大约10秒钟,并返回描述数据集的每个分割的10个构造模型的评估的对象。
results = cross_val_score(estimator, X, dummy_y, cv=kfold)
print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)

结果总结了数据集模型精度的平均值和标准偏差。这是对未知数据的模型性能的合理估计。这个问题也在已知的最佳结果领域内。
Accuracy: 97.33% (4.42%)

概要


在这篇文章中,您发现了如何使用Keras Python库进行深度学习来开发和评估神经网络。

通过完成本教程,您了解到:

  • 如何加载数据并使其可用于Keras。

  • 如何使用独热编码准备多类分类数据进行建模。

  • 如何用scikit学习使用Keras神经网络模型。

  • 如何使用Keras定义一个神经网络进行多类分类。

  • 如何使用k-折叠交叉验证的scikit学习来评估Keras神经网络模型

欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消