深度学习——keras

来源:互联网 发布:三菱fx5u编程手册 编辑:程序博客网 时间:2024/06/07 14:00

keras入门(一)

利用keras一步一步实现你的第一个神经网络。(python)
Keras是一个强大的易于使用的Python库,用于开发和评估深度学习模型。
keras包含两个高效的计算库,Theano and TensorFlow,利用少量的代码及可以实现神经网络模型。

步骤
1.加载数据.
2.定义模型.
3.编译模型.
4.训练模型.
5.评估模型.
6.完整代码.
配置:anaconda3+keras(后端theano,tensorflow)+numpy
1.加载数据
当我们的机器学习算法使用随机数据时,我们最好设置一个随机数种子,这样你运行同一段代码时,能得到同样的结果。这个设置在你需要用相同的随机数论证结论,对比算法,或者调试程序的时候很有用。
seed值可以由你决定,举例

from keras.models import Sequentialfrom keras.layers import Denseimport numpy# fix random seed for reproducibilitynumpy.random.seed(7)

现在我们加载数据,这个教程中,我们使用皮马县的印度人糖尿病发病数据,这是个来自uci机器学习库的标准机器学习数据,数据包含病人的药物治疗记录数据,以及五年内有没有发病。
这是个二维分类器,糖尿病发(1),不发(0)。并且,所有输入变量都是数值,我们可以很方便的使用神经网络,处理输入和输出都是数值的训练集。
首相下载数据,放在.py文件对应的本地文件目录下,文件名pima-indians-diabetes.csv。
用numpy的方法loadtxt()加载数据,输入变量有8个,最后一列为输出变量。加载数据后,将输入变量定义为x,输出变量定义为y。

# load pima indians datasetdataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")# split into input (X) and output (Y) variablesX = dataset[:,0:8]Y = dataset[:,8]

初始化随机数据生成器保证实验结果可重现,加载好数据,之后,下一步定义神经网络模型。
2.定义模型
Keras中的模型被定义为层序列。我们创建一个Sequential模型,并一次添加一个层,直到我们对结果感到满意。
要确保第一层input_dim=8,对应输入数据量8
如何确定网络层数和类型?
通过一系列实验测定误差率,确定最合适网络结构。
本教程使用三层完全连接网络。全连接层用dense类定义,层中神经元数量作为类的第一个参数,初始化方法作为第二个参数,定义激活函数。
网络权重初始化有两种方式,均匀分布(‘uniform’)产生随机数,keras默认初始化值0~0.05;高斯分布(‘normal’)产生随机数。
我们对网络前两层使用激活函数rectifier(’relu’),输出层使用sigmoid函数。之前我们所有层都使用激活函数sigmoid和tanh,但rectifier效果更好。输出层用sigmoid函数是为了保证输出在0~1之内,从而和概率值(0~1)映射;或者以0.5为分割的二分类。
下面开始添加神经网络层,第一层有12个神经元,8个输入;第二层有8个神经元;输出层有一个神经元来预测结果(糖尿病是否发病)。

# create modelmodel = Sequential()model.add(Dense(12, input_dim=8, activation='relu'))model.add(Dense(8, activation='relu'))model.add(Dense(1, activation='sigmoid'))

3.编译模型
模型已经定义可以开始编译,编译过程的高效的数据处理库,基于theano和tensorflow后端(backend),后端自动选择最好的方法训练网络,预测结果,基于cpu,gpu,或者分布式硬件条件。
编译,及训练网络过程中,也需要确定其他属性。记住训练网络的目的是找到预测模型的最佳权重设定。
我们用损失函数来评估权重设定,优化器用于遍历网络的权重,以及我们想在训练期间收集和报告的其他可选指标。
这个案例中,我们选择的keras中的用来处理二分类问题的损失算法‘binary_crossentropy’;我们选择梯度下降算法‘adam’(默认),学习更多adam算法(Adam: A Method for Stochastic Optimization)。最后,这是一个分类问题,我们要收集和报告分类准确。

# Compile modelmodel.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

4.训练模型
对模型使用fit()函数,用我们已经加载的数据来训练模型,训练过程将用称为epoch的数据集经过固定次数迭代,因此我们必须明确epoch的值。我们也可以设定实例的数量(batch_size),在权重更新以前用来评估。
本次我们使用小数量的迭代(150),用较小的batch_size(10)。补充,数值也可以由实验和误差率来选择

# Fit the modelmodel.fit(X, Y, epochs=150, batch_size=10)

这一步发生在你的cpu或者gpu上。
5.评估模型
我们已经在全部数据集上训练出了神经网络,我们也可以在相同的数据集上评估网络(train accuracy)。
你也可以将训练数据与测试数据分开。
相同数据集评估网络用evaluate()函数,该方法会对训练集中数据产生预测结果,包括平均损失和配置指标,例如准确率。

# evaluate the modelscores = model.evaluate(X, Y)print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

6.完整代码

# Create your first MLP in Kerasfrom keras.models import Sequentialfrom keras.layers import Denseimport numpy# fix random seed for reproducibilitynumpy.random.seed(7)# load pima indians datasetdataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")# split into input (X) and output (Y) variablesX = dataset[:,0:8]Y = dataset[:,8]# create modelmodel = Sequential()model.add(Dense(12, input_dim=8, activation='relu'))model.add(Dense(8, activation='relu'))model.add(Dense(1, activation='sigmoid'))# Compile modelmodel.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# Fit the modelmodel.fit(X, Y, epochs=150, batch_size=10)# evaluate the modelscores = model.evaluate(X, Y)print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

运行结果

...Epoch 145/150768/768 [==============================] - 0s - loss: 0.5105 - acc: 0.7396Epoch 146/150768/768 [==============================] - 0s - loss: 0.4900 - acc: 0.7591Epoch 147/150768/768 [==============================] - 0s - loss: 0.4939 - acc: 0.7565Epoch 148/150768/768 [==============================] - 0s - loss: 0.4766 - acc: 0.7773Epoch 149/150768/768 [==============================] - 0s - loss: 0.4883 - acc: 0.7591Epoch 150/150768/768 [==============================] - 0s - loss: 0.4827 - acc: 0.7656 32/768 [>.............................] - ETA: 0sacc: 78.26%

新数据预测
如何由得到的训练结果,对新数据预测,预测方法model.predict()
由于sigmoid激活函数的预测结果在0~1内,我们可以轻松的通过舍入法转换成二进制分类器。
包含prediction预测方法的代码如下

# Create first network with Kerasfrom keras.models import Sequentialfrom keras.layers import Denseimport numpy# fix random seed for reproducibilityseed = 7numpy.random.seed(seed)# load pima indians datasetdataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")# split into input (X) and output (Y) variablesX = dataset[:,0:8]Y = dataset[:,8]# create modelmodel = 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 modelmodel.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# Fit the modelmodel.fit(X, Y, nb_epoch=150, batch_size=10,  verbose=2)# calculate predictionspredictions = model.predict(X)# round predictionsrounded = [round(x[0]) for x in predictions]print(rounded)

预测结果

[1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]

来源http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/