仅供学习参考,不做商用!
大家好,我技术人Howzit,这是深度学习入门系列第二篇,欢迎大家一起交流!
深度学习入门系列1:多层感知器概述
深度学习入门系列2:用TensorFlow构建你的第一个神经网络
深度学习入门系列3:深度学习模型的性能评价方法
深度学习入门系列4:用scikit-learn找到最好的模型
深度学习入门系列5项目实战:用深度学习识别鸢尾花种类
深度学习入门系列6项目实战:声纳回声识别
深度学习入门系列7项目实战:波士顿房屋价格回归
深度学习入门系列8:用序列化保存模型便于继续训练
深度学习入门系列9:用检查点保存训练期间最好的模型
深度学习入门系列10:从绘制记录中理解训练期间的模型行为
深度学习入门系列11:用Dropout正则减少过拟合
深度学习入门系列12:使用学习规划来提升性能
深度学习入门系列13:卷积神经网络概述
深度学习入门系列14:项目实战:基于CNN的手写数字识别
深度学习入门系列15:用图像增强改善模型性能
深度学习入门系列16:项目实战:图像中目标识别
深度学习入门系列17:项目实战:从电影评论预测情感
深度学习入门系列18:循环神经网络概述
深度学习入门系列19:基于窗口(window)的多层感知器解决时序问题
深度学习入门系列20:LSTM循环神经网络解决国际航空乘客预测问题
深度学习入门系列21:项目:用LSTM+CNN对电影评论分类
深度学习入门系列22:从猜字母游戏中理解有状态的LSTM递归神经网络
深度学习入门系列23:项目:用爱丽丝梦游仙境生成文本
让我们开始吧
虽然不需要写很多代码,但是我们需要逐步介绍它,以便于让你了解如何创建自己的模型。本篇包含的步骤如下:
在这个教程中,我们将使用匹马印第安人糖尿病数据集。这是一个标准的机器学习数据集,你可以从UCI机器学习仓库免费下载。它描述了匹马印第安病人的医疗记录和是否在五年之内有糖尿病。这是个二分类问题(是糖尿病为1,否则为0)。描述每个病人的输入变量是数字的而且有变化的。下面列表是数据集中8个属性。
1.Number of times Pregnant(怀孕次数)
2.Plasma glucose concentration a 2 hours in an oral glucose tolerance test.(口服葡萄糖耐量试验中2小时血浆葡萄糖浓度)
3.Diastolic blood pressure(mm Hg)(舒张压mm Hg)。
4.triceps skin fold thickness(肱三头肌皮肤褶皱厚度mm)。
5.2-Hours serum insulin(mu u/ml)(2小时血清胰岛素)。
6.Body mass index(体重指数)。
7.diabetes pedigree function(糖尿病谱系功能)。
8.Age 年龄(年)。
9.五年之内糖尿病分类。
鉴于所有属性都是数字的,因此很容易直接用于神经网络的输入和输出值。这个数据集也在本书的其他课程中也使用,因此,最后保存在很容易找得到地方。下面是数据集的样例,展示了768实例中前5行。
数据集文件可在本书提供的代码包中可以获得。或者,你可以从UCI机器学习仓库中下载印第安匹马人数据集,并把它放在本里工程目录下,和你的python文件一样。保存的名字如下:
pima-indians-diabetes.csv
如果所有预测是在没有糖尿病数据上,那么基准准确率为65.1%。在数据集上使用10倍交叉验证,排名靠前的77.7%准确性。你可以在数据集网站UCI机器学习仓库上了解更多关于这个数据集信息。
我们无论什么时候从事机器学习算法,都可以采用随机处理(如随机数),用一个固定的数初始化随机数生成器是一个不错的操作。因此当你重复跑代码时,能够得到同样的结果。如果你需要展示结果,比较算法或者调试程序,那么你需要使用同样的随机源是合适的。你可以用任意随机种子来初始化,例如:
from keras.models import Sequential
from keras.models import Dense
import numpy
# fix random seed for reproducility
seed = 7
numpy.random.seed(seed)
现在我可以加载Pima Indians 数据集。你现在可以使用Numpy中loadtxt()函数直接加载文件。有八个输入变量和一个输出变量(最后一列)。一旦加载我们就将数据集分成输入变量(X)和输出类变量(Y)。
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabets.csv",delimiter=",")
# splite into input(X) and output(Y) variables
X = dataset[:,0.8]
Y = dataset[:,8]
我们已经初始化随机生成器,以确保结果的可复制性并加载数据。现在我们准备定义我们的神经网络模型。
Keras模型由一系列的层组成。我们创建Sequential模型,每次添加一个层,直到满足我们网络拓扑结构。第一件正确的事情是确保输入层与数据集输入个数匹配。当你使用input_dim参数创建第一层时,其设置的8,明确了8为输入变量个数。
如何知道使用的层数和他们类型呢?这是个非常难的问题。可以使用启发式方法,最好的网络结构是在试错过程中找到的。一般来说,如果有必要的话,用一个足够大的网络来捕获问题的结构。在这个例子中,我们将使用三层全连接网络结构。
全连接层使用Dense类定义的。我们能指定该层的神经元个数作为第一个参数,初始化函数为第二个参数init和使用activation指定激活函数。在这个例子中,我们采用一个小的连续性均匀分布(uniform)随机生成的数字来初始化网络权重,在0和0.05之间,因为它是Keras默认均匀权重初始化。另外一个可以选择的是noraml,它是高斯分布随机生成的数字。
我们将在前两层使用整流器(rectifier)relu激活函数,在输出层使用sigmoid激活函数。以前对于所有层的首选是sigmoid和tanh激活函数。现在使用整流器会有更好的性能。
我们在输出层使用sigmoid函数是确保网络的输出在0和1之间而且易于映射到要么类1的概率要么使用默认阈值0.5捕捉到某一类别。通过增加每层把它们拼起来。第一个隐藏层有12个神经元,期望有8输出变量。第二份隐藏层有8个神经元,最后输出层有1个神经元用于预测类(是否会犯糖尿病)。
# create model
model = Sequential()
model.add(Dense(12,input_dim=9,init='uniform',activation='relu'))
model.add(Dense(8,init='uniform',acitvation='relu'))
model.add(Dense(8,init='uniform',acitvation='sigmoid'))
既然模型已经定义,那么我们就可以编译它。编译模型的后端使用有效的数值计算库,如theano或者tensorflow。为了训练和预测,后端自动的选择最好的方法来表示神经网络并在你的硬件上运行。当编译时,我们必须指定训练网络的必要属性。记住训练网络意味着找到最好的权重集合来预测问题。
对于神经网络,我们必须指定用于评估权重的损失函数、用于搜索不同的网络权重的优化器,在训练中有选择的收集和报告的度量。在这个例子中,我们使用对数损失函数,因为二分类问题在Keras中被定义为binary_crossentropy。我们使用了效率较高的梯度下降算法adam,不为别的原因,默认的有效方法。Adam优化算法可以在Aadm:A method for stochastic Optiimization论文中学习。最后,因为它是分类问题,我们将收集并报展示类别的精度作为指标。
# compile model
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy']
我们已经定义了我们模型而且编译它,准备好有效的计算。现在是时候在数据上执行我们的模型了。我们能在已加载数据上通过调用fit()函数训练或者拟合我们的模型。
训练过程以固定迭代次数在数据集上运行,叫做epochs,它通过nb_epoch参数来指定。网络中权重更新之前,我们可以设置很多被评估的实例数量,叫做批量大小(batch size)并且使用batch_size参数进行设置。对于这个问题,我们将以迭代次数(150)和相对较小批量大小10来运行的。再次,通过试错方式来实验选择这些参数。
# Fit the model
model.fit(X,Y,nb_epoch=150,batch_size=10)
这个可以在你的CPU或者GPU上运行。
我们已经在整个数据集上训练神经网路,我们也能在同样的数据上评估网络性能。这仅仅让我了解到如何在数据集上建模(如训练精度),但是不知道在新数据上如何表现。为了简化但是必要,我们可以这么做,你可以将数据分成训练集和测试集,用于训练和评估你的模型。
在你的训练集上可以用evaluation() 函数评估你的模型,传同样的输入和输出用于训练模型。这将为每对输入和输出生成预测并收集分手,包括平均损失和任何你已经配置的度量,如精度。
# evaluate the model
scores = model.evaluate(X,Y)
print("%s:%.2f%%"%(model.metrics_name[1],scores[1]*100)
你已经学到了如何轻松的在Keras上创建第一个神经网络模型,让我们它整合成一个完整的代码。
# create your first MLP in Keras
from keras.models import Sequential
from keras.models import Dense
import numpy
# fix random seed for reproducility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabets.csv",delimiter=",")
# splite into input(X) and output(Y) variables
X = dataset[:,0.8]
Y = dataset[:,8]
# create model
model = Sequential()
model.add(Dense(12,input_dim=9,init='uniform',activation='relu'))
model.add(Dense(8,init='uniform',acitvation='relu'))
model.add(Dense(8,init='uniform',acitvation='sigmoid'))
# compile model
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy']
# Fit the model
model.fit(X,Y,nb_epoch=150,batch_size=10)
# evaluate the model
scores = model.evaluate(X,Y)
print("%s:%.2f%%"%(model.metrics_name[1],scores[1]*100)
运行这个例子,你能看到下面的信息-每150周期打印一个损失值和准确率,紧接着是在训练集上训练模型的最后评估。它在theano后端工作站的CPU上执行,花费大概10秒。
在这节课中,你已经知道如何使用强大的深度学习keras python 库创建你的第一个神经网络。特别是,你已经学习了使用Keras创建神经网路或者深度学习关键的五步,包括:
你现在已经知道如何在Keras上构建多层感知器。接下来部分,你将学习在未知数据上评估你的模型,并学习估计他们性能的不同方法。
数据集