首先非常感谢作者:http://yangguang2009.github.io/2016/11/27/deeplearning/develop-neural-network-model-with-keras-step-by-step/
Keras 是简单易用、高效强大的神经网络库,底层计算可基于 TensorFlow 或 Theano 平台实现。本篇将详细介绍 Keras 模型构建的具体步骤。通过阅读本篇内容您将了解到:
- Keras 模型构建的主要步骤;
- Keras 神经网络搭建的一般过程;
请先配置好 Keras 的相关运行环境,方法很简单,具体请参考本教程的“Keras 简介”一章。
Keras 模型构建主要包括5个步骤:定义(define),编译(compile),训练(fit),评估(evaluate),预测(prediction)。
接下来我们将对每个步骤进行详细的介绍。
1 2 |
model = Sequential() model.add(Dense(2)) |
定义模型是 Keras 构建神经网络的第一步,这里我们由Sequential
类生成了一个实例,然后添加了一个Dense
类型的层(layer),参数2
表示该层神经元的数量。
层的添加也可以在Sequential
实例生成时添加:
1 2 |
layers = [Dense(2)] model = Sequential(layers) |
一般层的添加顺序即是各层连接的顺序,也是数据流经模型被处理的顺序。
模型添加的第一层必须指定输入参数的数量,指定方式由具体模型类型而定,例如多层感知模型提供了一个input_dim
参数来指定。
1 2 3 |
model = Sequential() model.add(Dense(5, input_dim=2)) model.add(Dense(1)) |
上面代码我们定义了一个简单的多层感知模型:具有2个入参的输入层,具有5个神经元的隐含层,具有1个神经元的输出层。
1 2 3 4 5 |
model = Sequential() model.add(Dense(5, input_dim=2)) model.add(Activation('relu')) model.add(Dense(1)) model.add(Activation('sigmoid')) |
这里我们在之前的基础上添加了两个Activation
新层,你可以看到层的添加在 Keras 中操作起来是非常简便的。
1 |
model.compile(optimizer='sgd', loss='mse', metrics=['accuracy']) |
定义好模型之后我们需要通过编译(compile)来对学习过程进行配置,我们可以为模型的编译指定各类参数包括:优化器optimizer
,损失函数loss
,评估指标metrics
。
编译的过程也是 Keras 将我们刚定义好的模型转化为底层平台(TensorFlow 或 Theano)结构描述过程,底层平台会负责后续的计算任务,GPU、CPU 的调度选择,分布式运行等。
1 |
history = model.fit(X, y, batch_size=10, nb_epoch=100) |
编译后的模型就可开始训练(fit)了,fit 的过程可以简单的理解为就是通过测试数据来确定神经元间连接权重(weight)的过程。
测试数据分为两部分,矩阵类型的输入数据X
,和对应的数组类型的输出y
数据。
神经网络训练通常采用的是反向传播(Backpropagation)算法,因此我们需要指定训练周期nb_epoch
和每次计算的数据量batch_size
。
训练完成后,history
会保存模型训练后的相关描述。
1 |
loss, accuracy = model.evaluate(X, y) |
训练后的模型,我们需要对其性能进行评估,以此来确定训练效果是否达到了我们的预期。evaluate
方法的参数X
,y
与fit
方法的数据类型是一样的,一般会选择用测试数据进行评估。
1 |
predictions = model.predict(x) |
当模型的性能评估达到要求后,我们就可以用训练好的模型在新的数据上进行预测了。predictions
是预测返回的结果,数据格式与输出层的输出格式相同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 简易多层感知神经网络示例 from keras.models import Sequential from keras.layers import Dense import numpy # 加载,预处理数据集 dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",") X = dataset[:,0:8] Y = dataset[:,8] # 1. 定义模型 model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # 2. 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 3. 训练模型 history = model.fit(X, Y, nb_epoch=100, batch_size=10) # 4. 评估模型 loss, accuracy = model.evaluate(X, Y) print("\nLoss: %.2f, Accuracy: %.2f%%" % (loss, accuracy*100)) # 5. 数据预测 probabilities = model.predict(X) predictions = [float(round(x)) for x in probabilities] accuracy = numpy.mean(predictions == Y) print("Prediction Accuracy: %.2f%%" % (accuracy*100)) |
这里示例数据选用的是Pima Indians Diabetes Data Set 。您可以下载到示例代码文件到相同目录下。该数据集每项具有8个输入变量和一个输出变量:0或1。
我们定义了一个多层感知神经网络模型:输入层有8个入参,隐含层具有12个神经元,激活函数采用的是relu
,输出层具有1个神经元,激活函数采用的是sigmoid
。
模型采用的优化器和损失函数类型分别为:adam
和binary_crossentropy
,训练周期为100,每次数据量为10。
为了演示方便,我们这里模型评估和预测依然采用的是训练数据,实际应用中评估需要在单独准备的测试数据上进行,同样预测也只有在新数据上进行才有意义。
以下是示例运行结果:
1 2 3 4 5 6 7 8 9 |
... 768/768 [==============================] - 0s - loss: 0.5219 - acc: 0.7591 Epoch 99/100 768/768 [==============================] - 0s - loss: 0.5250 - acc: 0.7474 Epoch 100/100 768/768 [==============================] - 0s - loss: 0.5416 - acc: 0.7331 32/768 [>.............................] - ETA: 0s Loss: 0.51, Accuracy: 74.87% Prediction Accuracy: 74.87% |