keras初识_一个简单的深度学习小案例
0. 背景
Keras是一个高效、易用的深度学习框架,它对theano
和tensorflow
进行了高级封装,使得我们能仅用几行代码就能实现一个深度学习模型。本篇笔记意在简单了解下keras
在搭建深度学习模型时的流程。主要章节如下:
- 数据加载
- 定义模型
- 编译模型
- 训练模型
- 评估模型
- 流程整合
- 预测
完成上述内容需要以下环境:python2/3
、SciPy
和Numpy
、Kears
安装。
1. 数据加载部分
首先第一步是定义我们后面需要用的函数(模型)和类别。将采用Numpy
来加载数据,采用Keras
定义一个二分类模型。样例代码:
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense
本教程中,我们将采用如下数据集:皮马印第安人糖尿病数据集。该数据集描述了皮马印第安人的患病记录以及他们在五年内是否患了糖尿病的记录。
因此,这是个二分类问题
。数据中每个变量都是数值型变量,不需要怎么预处理就能比较符合神经网络对数据输入的要求,因此适合作为第一个案例。数据里获取链接如下:
- 数据集
- 具体信息
下载数据集后,将其放在和python
文件同意文件目录下。采用numpy
的loadtxt()
函数读取数据集。每条数据有8个输入(X
)和一个输出(y
)。加载数据集后,将其划分为数据
和标签
。样例代码:
dataset = loadtxt('pima-indians-diabets.csv', delimiter=',)
X = dataset[:, 0:8]
y = dataset[:, 8]
2. 定义keras模型
Keras中模型被定义为一系列的层。我们可以构造一个Sequential
模型,然后根据自己的需求添加一系列的层,来构造我们的神经网络结构。
首先要确保输入数据的维度正确,通过指定input_dim
参数为8,代表输入变量为8个维度。本案例中,我们使用一个三层神经网络结构。最后一层的全连接层可采用Dense
类,通过指定神经元个数作为第一个参数,采用activation
参数指定激活函数。神经网络前两层采用ReLU
记过函数,最后一层(输出层)采用Sigmoid
函数,其中sigmoid
函数进行0-1分类的阈值取0.5。具体如下:
- 模型输入为每行的8个变量(input_dim=8)
- 第一个隐层12个节点,采用relu激活函数
- 第二个隐层 8个节点,采用relu激活函数。
- 输出层只有一个节点,采用sigmoid激活函数。
样例代码如下:
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
注意,模型的输入维度被定义为第一个Dense
层的参数,这表示,第一个Dense
层做了两件事:定义输入和第一个隐层。
3. 编译Keras模型
模型编译使用了高效的数值库(后端),后端会自动选择表示网络的最佳方式,以便于在硬件上做训练和预测。
编译模型时,需指定一些网络训练过程中的附加属性。模型的训练意味这找到最佳的权重
,来将我们的输入映射到数据集的输出。因此,必须指定一组用于评估权重的损失函数
,优化器是用于搜索并输出训练过程中不同网络的不同权重以及评估指标。
本案例中,将使用交叉熵函数作为损失函数,即keras中的binary_crossentropy
。采用效率较高的随机梯度下降算法adam
作为优化器optimizer。这是当前一个比较流行的梯度下降算法,因为它能够进行自适应的调节来获取更好的结果。最有,本问题为一个分类问题,因此,我们可以用准确度作为评估分类结果的指标。样例代码:
model.compile(loss='binary_crossentropy', optimizer='adma', metrics=['accuracy'])
4. 模型训练
通过调用fit()函数,来加载并训练模型。训练过程可分为不同的epochs,而每个epochs又被拆分为不同的batches。
- Epoch: 完成一次对所有数据的训练
- batch: 权重更新前,一个epoch内,采样的一个或者若干个样本数据。样例代码:
model.fit(X, y, epochs=150, batch_size=10)
5. 模型评估
完成训练后,可以利用同样的数据对模型性能进行评估。这样得到的是一个较为理想的结果,但是在其他新数据上表现可能较差;一般会将数据集划分为训练集和测试集两部分。
你可以用于训练的数据,采用evaluate()函数对模型进行评估。它会收集输出结果、损失以及你指定的评估指标值等信息。该函数将返回一个长度为2的列表,分别代表loss以及accuracy。样例代码:
_, accuracy = model.evaluate(X, y)
print("Accuracy: %.2f" % (accuracy * 100))
6. 完整流程
# first neural network with keras tutorial
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense
# load the dataset
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')
# split into input (X) and output (y) variables
X = dataset[:,0:8]
y = dataset[:,8]
# define the keras 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 the keras model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit the keras model on the dataset
model.fit(X, y, epochs=150, batch_size=10)
# evaluate the keras model
_, accuracy = model.evaluate(X, y)
print('Accuracy: %.2f' % (accuracy*100))
7. 模型预测
模型的预测只需要调用predict()函数即可。我们的输出层采用的是sigmoid函数,因此预测值是一个在0-1之间的概率值,我们需要一定的转化,将其转化为一个二分类的结果。样例代码:
predictions = model.predict(X)
rounded = [round(x[0]) for x in predictions]
也可以采用predict_classes()函数来直接对类别进行预测
predictions = model.predict_classes(X)
总结
到此,我们完成了一个利用python和Keras模型的训练与预测过程,总结一下模型训练与构造过程的六个步骤:
- 数据加载
- 模型定义
- 模型编译
- 模型训练
- 模型评估
- 模型预测
原文链接:https://machinelearningmastery.com/tutorial-first-neural-network-python-keras/