用 Keras 编写你的第一我的工神经网络(Python)—— Jinkey 翻译

译者:Jinkey(微信公众号 jinkey-love)
英文原版地址:点击跳转python

教程概述

这里不须要编写太多的代码,不过咱们将一步步慢慢地告诉你怎么之后怎么建立本身的模型。
教程将会涵盖如下步骤:算法

  1. 加载数据
  2. 定义模型
  3. 编译模型
  4. 训练模型
  5. 评估模型
  6. 结合全部步骤在一块儿

这个教程的前置条件:数据库

  1. 有 python 2 或 3 的环境和编程基础
  2. 安装并配置好 Scipy 库(包括 Numpy )
  3. 你安装好 Keras 而且有一个后端(Theano or TensorFlow

建立一个新的文件,命名为 keras_first_network.py ,而后将教程的代码一步步复制进去。编程

1. 加载数据

每当咱们使用机器学习算法使用随机过程(如随机数),先设置随机数种子是一个好的习惯。后端

这样您就能够运行相同的代码一次又一次,获得相同的结果。若是你须要证实结果,使用随机数据比较算法或调试代码,这是颇有用的。微信

你能够初始化随机数发生器及其种子,例如:网络

from keras.models import Sequential
from keras.layers import Dense
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)复制代码

如今咱们能够加载咱们的数据了。
在这个教程中,咱们将使用皮马印第安人糖尿病数据集.这是UCI 机器学习数据库一个标准的机器学习数据集。它描述了病人医疗记录和他们是否在五年内发病。dom

所以,它是一个二分类问题(出现糖尿病为1, 不然为 0)。
全部描述病人的输入变量都是数值。这便于直接用于须要数值输入输出的神经网络, 适合咱们第一个 Keras 神经网络。
下载数据集而且重命名为 pima-indians-diabetes.csv 放入 python 脚本所在的目录的 data/pima-indians-diabetes.csv机器学习

你能够只直接使用 Numpy 库的 loadtxt() 方法加载数据,一共 8 个输出变量和 1 个输出变量(最后一列)。加载以后咱们就能够把数据分离为 X(输出变量)和 Y(输出分类)分布式

# load pima indians dataset
dataset = numpy.loadtxt("data/pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:, 0:8]
Y = dataset[:, 8]复制代码

咱们已经初始化了咱们对的随机数生成器来确保结果可复现, 也加载了数据。咱们如今能够准备定义咱们的神经网络模型了。

2. 定义模型

Keras 中的模型被定义为一系列的层。

咱们实例化一个 Sequential 模型对象,每次添加一层知道咱们对网络的拓扑结构满意。

第一件事情咱们须要确保的是输出神经元的数量。这能够在模型建立的时候设置参数 input_dim 来定义,咱们将这个参数设置为 8 对应 8 个输出变量。
咱们怎么知道层的数量和他们的类型呢?

这是一个很是难回答的问题。这是启发式的,咱们经过不断地试错找出最好的网络结构、通常来讲,你须要足够大的网络去明白结构对于问题是否有用。
在这个例子中, 咱们使用三层全链接的结构。

全链接层使用 Dense 定义。咱们能够经过第一个参数定义层的神经元数量,第二个参数 init 定义权重的初始化方法, activation 参数定义激活函数。

在这个例子中, 咱们把权重初始化成一个服从均匀分布的小随机数(init='uniform'),在0到0.05直接(这是 Keras 标准均匀分布权重初始值)。另外一种传统的选择是‘normal’,会从高斯分布(正态分布)中产生一个小的随机数。

咱们在前两层使用 (relu)[en.wikipedia.org/wiki/Rectif…)] 激活函数, 在输出层使用 Sigmoid 函数。曾经 Sigmoidtanh 激活函数是全部的层首选的。但时至今日, 使用 relu 激活函数能够达到更好的性能。咱们在输出层使用 Sigmoid 函数来确保网络输出在 0 和 1 之间,

咱们能够添加每一层将这些东西放到一块儿。第一层有 12 个神经元、8个输出变量。第二层有 8 个神经元和最后 1 个神经元的输出层用于预测类别(糖尿病有无发病)

# 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'))复制代码

3. 编译模型

如今咱们定义好模型, 那么就能够编译他了。

编译使用高效的数学库, 封装了 Theano 或者 TensorFlow(称为 backend)。后端(backend)在你的硬件上自动选择最好的方式去表现用于训练和预测的神经网络,好比 CPU、GPU 或者分布式。

编译时, 咱们须要额外定义训练网络所须要的参数。记住, 训练网络意味着寻找最优的权重集去预测。

咱们须要定义评估权重集的损失函数, 用于寻找不一样权重的优化器以及咱们但愿在训练过程呈现的可选指标。

在这个例子中, 咱们使用对数损失函数(logarithmic loss), 对于二分类问题, 其在 Keras 中称为“binary_crossentropy”。咱们还将使用梯度降低算法‘adam’, 没有为何, 它就是一种高效地默认方法。想了解更多这种算法能够查看论文: (Adam: A Method for Stochastic Optimization)[arxiv.org/abs/1412.69…]

最后, 觉得这是一个分类问题, 因此咱们会收集和汇报分类的准确率做为度量指标。

# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])复制代码

4. 训练模型

咱们已经定义和编译了模型, 他是为高效地计算而准备的。

如今是时候在数据上训练模型了。

咱们能够在加载的数据上训练和拟合模型,经过 fit() 函数。

训练过程会在数据集迭代必定的次数,成为 epochs, 这个能够经过 nb_epoch 参数来设定。咱们也能够设定 batch_size 参数来指定进行梯度降低时每一个batch包含的样本数。训练时一个batch的样本会被计算一次梯度降低, 使目标函数优化一步。在这个例子中, 咱们将迭代150次、批处理大小为10。再说一次, 这些参数能够经过试错来选择。

# Fit the model
model.fit(X, Y, nb_epoch=150, batch_size=10)复制代码

这就是在你的 CPU 或者 GPU 上发生的事情。

5. 评估模型

咱们已经在整个数据集上训练了咱们的神经网络, 咱们能够在线通的数据集上评估神经网络的性能。

这只会告诉咱们模型有多适合已有的数据(训练的准确率),但咱们无从知道算法在新数据上的性能。

咱们能够简单但很理想地把数据分为训练集和测试集来分别训练和评估模型。

你能够经过 evaluate() 函数在训练集评估你的模型, 使用你训练模型时相同的输出和输出。

这会针对每个输出-输出产生预测而且收集分数,包括平均损失和其余咱们定义的指标,好比准确率。

# evaluate the model
scores = model.evaluate(X, Y)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))复制代码

6. 将这些放在一块儿

你已经看到用 Keras 建立你的第一个神经网络有多么简单、

运行以上的代码, 将会看到150个迭代中, 每次迭代的损失和准确率,以及最终的模型在训练集上的评估结果, 在个人 CPU 上耗时 10s(使用 Theano 做为后端)

...
Epoch 143/150
768/768 [==============================] - 0s - loss: 0.4614 - acc: 0.7878
Epoch 144/150
768/768 [==============================] - 0s - loss: 0.4508 - acc: 0.7969
Epoch 145/150
768/768 [==============================] - 0s - loss: 0.4580 - acc: 0.7747
Epoch 146/150
768/768 [==============================] - 0s - loss: 0.4627 - acc: 0.7812
Epoch 147/150
768/768 [==============================] - 0s - loss: 0.4531 - acc: 0.7943
Epoch 148/150
768/768 [==============================] - 0s - loss: 0.4656 - acc: 0.7734
Epoch 149/150
768/768 [==============================] - 0s - loss: 0.4566 - acc: 0.7839
Epoch 150/150
768/768 [==============================] - 0s - loss: 0.4593 - acc: 0.7839
768/768 [==============================] - 0s
acc: 79.56%

若是你尝试在 IPython 或者 Jupyter , 你将会获得错误。缘由是在训练期间输出进度条。你能够关闭这个, 经过让 model.fit() 的参数 verbose=0

福利: 作出预测

我被问得最多的一个问题是:

在我训练模型以后, 怎么预测新数据的分类?

这是个好问题。

咱们拟合了上述例子, 用他来在训练集上做出预测, 伪装咱们以前没看到过这些数据。

作预测一样很是简单, 只须要使用 model.predict()。咱们在输出层使用 Sigmoid 激活函数, 所以咱们的预测值将会在 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, nb_epoch=150, batch_size=10,  verbose=2)
# calculate predictions
predictions = model.predict(X)
# round predictions
rounded = [round(x) 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]

总结

在这篇文章当中, 咱们学会了如何经过 Keras 建立本身的第一个神经网络模型。

特别是咱们学会了 使用 Keras 来建立神经网络或深度学习模型时关键的 5 个步骤:

  1. 加载数据
  2. 定义模型
  3. 编译模型
  4. 训练模型
  5. 评估模型

有任何疑问欢迎关注个人公众号 jinkey-love 和我交流。

相关文章
相关标签/搜索