用Keras和Python开发你的第一个神经网络

第一个神经网络

Keras功能强大且易于使用,常被用来训练深度学习模型在这篇文章中,我将向你展示如何使用Keras和Python一步一步地创建你的第一个神经网络模型,我们开始吧。

教程概述

使用Keras创建神经网络模型不需要你写太多代码,但是思路一定要清晰,创建神经网络模型的步骤如下:

1、加载数据

2、定义模型

3、编译模型

4、训练模型

5、评估模型

6、做出预测

创建一个名为keras_first_network.py的新文件,然后一步一步把代码复制、粘贴到文件中。

1

加载数据

当使用随机过程(例如随机数)的机器学习算法时,最好设置随机数种子(seed),这样可以反复运行相同的代码并获得相同的结果,例如:

from keras.models import Sequential

from keras.layers import Dense

import numpy

# fix random seed for reproducibility

现在可以加载我们的数据了,在本教程中,我们将使用皮马印第安人糖尿病数据集。这是来自UCI机器学习库的标准机器学习数据集。这是一个皮马印第安人的患者病历数据集,显示近五年内糖尿病患者是否发作。因此,这是一个二元分类问题(糖尿病发作为1或未发作为0)。数据集共有768个样本(患者),每个样本(患者)有8个特征值。数据集如下图所示,红框处为8个特征值,蓝框处为标签值。

下载数据集并将其放在与python文件相同目录下,数据集下载地址为:https://pan.baidu.com/s/1KKfI_7folNfhgTZ2Ys0tcQ

(pima-indians-diabetes.csv为数据集文件,pima-indians-diabetes.names文件为数据集字段注解,code.py为完整代码),现在可以使用NumPy的loadtxt()函数直接加载数据集。数据集中一行有9个数值,前8个是特征值,最后一个是标签值。加载后,我们可以将数据集拆分为输入变量X(即前8个特征值)和输出变量Y(即最后一个标签值),代码如下:

#load pima indians dataset

dataset = numpy.loadtxt("pima-indians-diabetes.csv",delimiter=",")

#split into input (X) and output (Y) variables

X = dataset[:,0:8]

Y = dataset[:,8]

数据已经加载完成,现在准备定义我们的神经网络模型。

注意,数据集有9列。

2

定义模型

我们使用Keras中的Sequential模型即序列模型,首先我们创建一个Sequential模型,然后使用add()函数一次添加一个层,一直添加到我们满意的层数为止,在本教程中共3层。

我们将创建具有3层的全连接网络结构。全连接层使用Dense()来定义。在第一层中,我们可以指定层中神经元的数量作为第一个参数,输入维度作为第二个参数,激活函数作为第三个参数;在第二层中,指定层中神经元的数量作为第一个参数,激活函数作为第二个参数;第三层和第二层相似,指定层中神经元的数量作为第一个参数,激活函数作为第二个参数;

我们在前两层使用"relu"激活函数,在输出层使用"sigmoid"激活函数。顺便提一下,以前创建神经网络时优先选择"sigmoid"和"tanh"激活函数。现在都是使用"relu"激活函数,因为相比之下它的表现比"sigmoid"和"tanh"更优秀。我们在输出层使用"sigmoid"来确保我们的网络输出介于0和1之间。

创建神经网络的代码如下所示,第一层有12个神经元,需要8个输入变量。第二个隐藏层有8个神经元,最后,输出层有1个神经元来预测类别(糖尿病的发病与否)。

#create model

model=Sequential()

model.add(Dense(12,input_dim=8,

activation='relu'))

model.add(Dense(8,activation='relu'))

model.add(Dense(1,activation='sigmoid'))

神经网络模型已经搭建起来了,是不是很有成就感,是不是很简单!!!

3

编译模型

神经网络模型搭建起来之后,下一步我们就该编译它了。编译操作很简单,只需要一个compile()函数就搞定了,要记住训练网络的目的是要找到最好的权重集和偏置,使模型具有最佳的预测功能。

第一步我们需要指定一个用于评估一组权重的损失函数,第二步需要指定一个用于寻找最好权重集和偏置的优化器。在本教程中我们使用“binary_crossentropy”

作为损失函数,使用“adam”作为优化器,最后我们使用”accuracy”准确率作为评估的指标。编译代码如下:

#Compile model

model.compile(

loss='binary_crossentropy',

optimizer='adam',

metrics=['accuracy'])

4

训练模型

上一步完成了神经网络模型的编译,接下来就该用数据集对模型进行训练了。

我们通过调用keras的fit()函数对模型进行训练,训练代码如下所示:X、Y分别是数据集的特征值和标签值,epochs表示训练多少轮,batch_size表示一次训练多少个样本,对于初学者来说epochs和batch_size这两个名词不容易理解,其实很简单,举个例子,有一条小河,河上有一座破桥,破桥每次只允许10个人同时过桥,现在有1000个人要过桥,注意,关键时刻到了,1000个人全部过去就是1个epoch,1000个人全部从对岸过来又是一个epoch,1000个人过了几次桥就是几个epoch,再说batch_size,每次只允许10个人同时过桥,那么batch_size就等于10,已经够清楚了吧。

# Fit the model

model.fit(

X,

Y,

epochs=150,

batch_size=10)

5

评估模型

我们已经在整个数据集上训练了神经网络,我们也将在同一数据集上做测试来评估网络的性能。注意本教程中没有划分训练集和测试集,是用整个数据集做训练,然后再用整个数据集做测试,我们这样做是为了简化,理想情况下,应该将数据集分为训练集和测试集,以便对模型进行训练和评估。

使用keras的evaluate()函数在数据集上评估模型,操作很简单,代码如下所示:将特征值数据X和标签值数据Y传递给evaluate()函数,函数将评估结果返回给scores,包括平均损失和配置的其他指标,例如准确率指标。

# evaluate the model

scores=model.evaluate(X,Y)

print("\n%s:%.2f%%"%(model.metrics_names[1],scores[1]*100))

代码整合:

上面我们展示了如何一步一步创建神经网络模型的过程,现在我们把代码整合起来。

# Create your first MLP in Keras

from keras.models import Sequential

from keras.layers import Dense

import numpy

# fix random seed for reproducibility

numpy.random.seed(7)

# load pima indians dataset

dataset=numpy.loadtxt("pima-indians-diabetes.csv",delimiter=",")

# split into input (X) and output (Y) variables

X=dataset[:,0:8]

Y=dataset[:,8]

# create model

model = Sequential()

model.add(Dense(12,input_dim=8,activation='relu'))

model.add(Dense(8,activation='relu'))

model.add(Dense(1,activation='sigmoid'))

# Compile model

model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

# Fit the model

model.fit(X,Y,epochs=150,batch_size=10)

# evaluate the model

scores=model.evaluate(X,Y)

print("\n%s:%.2f%%"% (model.metrics_names[1],scores[1]*100))

运行以上代码,应该可以看到150个epoch中每个epoch的消息,打印每个epoch的损失值和准确率,然后在数据集上对模型进行最终评估。

在带有Theano后端的CPU上运行的工作站上执行大约需要10秒钟。

...

Epoch 145/150

768/768 [==============================] - 0s - loss: 0.5105 - acc: 0.7396

Epoch 146/150

768/768 [==============================] - 0s - loss: 0.4900 - acc: 0.7591

Epoch 147/150

768/768 [==============================] - 0s - loss: 0.4939 - acc: 0.7565

Epoch 148/150

768/768 [==============================] - 0s - loss: 0.4766 - acc: 0.7773

Epoch 149/150

768/768 [==============================] - 0s - loss: 0.4883 - acc: 0.7591

Epoch 150/150

768/768 [==============================] - 0s - loss: 0.4827 - acc: 0.7656

注意:如果你尝试在IPython或Jupyter笔记本中运行上述代码可能会出错。出错的原因是训练期间的输出进度条问题。可以通过在对model.fit()函数调用时设置verbose= 0来轻松解决。

6

做出预测

训练模型的最终目的是对输入数据做出预测,到目前为止,我们的第一神经网络已经训练完成了,可以对输入数据进行预测了。调用keras的predict()函数对输入数据进行预测,将特征值X传递给model.predict()函数,由于我们在输出层使用sigmoid激活函数,因此预测值将是0和1之间的小数。我们期望的输出值是0(糖尿病未发作)或者1(糖尿病发作),我们可以调用round()函数,通过四舍五入方法轻松地将0到1之间的小数数值转化为只有0或1的预测值。

下面列出了使用数据集进行预测的完整代码。

# Create first network with Keras

from keras.models import Sequential

from keras.layers import Dense

import numpy

# fix random seed for reproducibility

seed=7

numpy.random.seed(seed)

# load pima indians dataset

dataset=numpy.loadtxt("pima-indians-diabetes.csv",delimiter=",")

# split into input (X) and output (Y) variables

X=dataset[:,0:8]

Y=dataset[:,8]

# create model

model = Sequential()

model.add(Dense(12,input_dim=8,init='uniform',activation='relu'))

model.add(Dense(8,init='uniform',activation='relu'))

model.add(Dense(1,init='uniform',activation='sigmoid'))

# Compile model

model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

# Fit the model

model.fit(X,Y,epochs=150,batch_size=10,verbose=2)

# calculate predictions

predictions=model.predict(X)

# round predictions

rounded=[round(x[0]) for x in predictions]

print(rounded)

总结

在这篇文章中,你学会了如何使用功能强大的Keras库和Python创建你的第一个深度学习神经网络模型。具体来说,你学习了使用Keras创建神经网络或深度学习模型的五个关键步骤,包括:

如何加载数据。

如何在Keras中定义神经网络

如何高效的编译Keras模型

如何训练数据模型

如何评估数据模型

以及如何用模型做出预测

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180803G08L4V00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券