第一个神经网络
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模型
如何训练数据模型
如何评估数据模型
以及如何用模型做出预测
领取专属 10元无门槛券
私享最新 技术干货