基于Keras的第一个多层感知器实例:印第安人糖尿病诊断

本文将通过使用Keras构建一个简单的多层感知器,数据使用印第安人糖尿病诊断数据。

通过Keras构建深度学习模型的步骤如下:
  1. 定义模型——创建一个序贯模型并添加配置层
  2. 编译模型——指定损失函数和优化器,并调用模型的compile()函数,完成模型编译
  3. 训练模型——通过调用模型的fit()函数来训练模型
  4. 执行预测——调用模型的evaluate()或predict()等函数对新数据进行预测
通过以下步骤创建第一个神经网络模型
  1. 导入数据
  2. 定义模型
  3. 编译模型
  4. 训练模型
  5. 评估模型
数据集使用Pima Indians数据

这是一个可以从UCI Machine Learning免费下载的标准机器学习数据集,目前好像不对外开放了,我这里传到码云上了。
它描述了Pima Indians的患者医疗记录数据,以及他们是否在五年内发生糖尿病,是一个二元分类的问题(糖尿病为1或非糖尿病为0),下表是数据集的8个属性和输出结果。

序号描述
1怀孕次数
22小时口服葡萄糖耐量试验中血浆葡萄糖浓度
3舒张压
4三头肌皮褶皱厚度
52小时血清胰岛素
6身体质量指数
7糖尿病谱系功能
8年龄
9是否是糖尿病(0 or 1)

下面是数据集中的数据示例,显示了数据集中768条记录中的前5行:

6,148,72,35,0,33.6,0.627,50,1
1,85,66,29,0,26.6,0.351,31,0
8,183,64,0,0,23.3,0.672,32,1
1,89,66,23,94,28.1,0.167,21,0
0,137,40,35,168,43.1,2.288,33,1

导入数据

为了重复运行相同的代码,并获得相同的结果,设置随机种子

from keras.models import Sequential
from keras.layers import Dense
import numpy as np
#设定随机种子
np.random.seed(7)

使用NumPy的loadtxt()函数加载数据集

# 1.导入数据
dataset = np.loadtxt('pima-indians-diabetes.csv', delimiter=',')
#分割输入变量x和输出变量Y
x = dataset[:, 0:8]
Y = dataset[:, 8]
定义模型
在Keras中通常使用Dense类来定义完全连接的层:
  • 神经元数量unit为第一个参数
  • 初始化方法init为第二个参数
  • 使用activation参数指定激活函数
  • 使用input_dim参数创建第一层,设置为8,表示输入层有8个输入变量,这与数据的维度一致

通常将网络权重初始化为均匀分布的小随机数uniform,在这个例子中使用介于0和0.05之间的随机数,这是Keras中的默认均衡权重初始化数值。

激活函数:
  • 使用ReLu作为前两层的激活函数,使用Sigmoid作为输出层的激活函数
  • 通常采用sigmoid和tanh作为激活函数,这是构建所有层的首选
  • 现研究表明,使用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'))

下图为该网络结构:
网络结构

编译模型

为了使模型能够有效的使用Keras封装的数值计算,在模型编译时,必须指定用于评估一组权重的损失函数(loss)、用于搜索网格不同权重的优化器(optimizer),以及希望在模型训练期间收集和报告的可选指标。
该例子中使用对数损失函数作为模型的损失函数,在Keras中,对于二进制分类问题的对数损失函数被定义为二进制交叉熵,使用有效的梯度下降算法Adam作为优化器,采用分类准确度作为度量模型的标准。

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
训练模型

模型编译完成后,就可以用于计算了。在使用模型预测新数据之前,需要先对模型进行训练,训练模型通过调用模型的fit()函数来实现。训练过程中采用epochs参数,对数据集进行巩固次数的迭代,还需要设置在执行神经网络中的权重更新的每个批次中所用实例的个数(batch_size),这些参数可以用过试验和错误实验来选择合适的值。

model.fit(x=x, y=Y, epochs=150, batch_size=10)
评估模型

这里通过统一数据集来评估神经网络模型的性能,这个评估方法只能反应训练数据集在模型上的准确度,不能反映算法对新数据的预测结果,通常将数据分成训练数据集和评估数据集。
可以使用模型的evaluation()函数来评估模型的准确度。在这个示例中使用训练集来评估模型的准确度,因此传递给evaluation()函数的数据集与用于训练模型的数据集相同,这个函数将产生每个输入和输出对的预测,并收集分数,包括平均损失和配置的任何指标,如准确度。

scores = model.evaluate(x=x, y=Y)
print('\n%s : %.2f%%' % (model.metrics_names[1], scores[1]*100))
结果

运行上述代码,得到每一个epoch执行的loss和准确度,以及使用相同的训练集的评估结果。执行结果如下:

Using TensorFlow backend.
Epoch 1/150
2021-04-16 10:34:30.195427: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2

 10/768 [..............................] - ETA: 17s - loss: 1.6118 - acc: 0.9000
768/768 [==============================] - 0s 346us/step - loss: 3.7098 - acc: 0.5977
Epoch 2/150

 10/768 [..............................] - ETA: 0s - loss: 0.4447 - acc: 0.8000
768/768 [==============================] - 0s 41us/step - loss: 0.9373 - acc: 0.5924
...
Epoch 149/150

 10/768 [..............................] - ETA: 0s - loss: 0.5201 - acc: 0.7000
768/768 [==============================] - 0s 41us/step - loss: 0.4714 - acc: 0.7630
Epoch 150/150

 10/768 [..............................] - ETA: 0s - loss: 0.3475 - acc: 0.9000
768/768 [==============================] - 0s 41us/step - loss: 0.4769 - acc: 0.7865

 32/768 [>.............................] - ETA: 0s
768/768 [==============================] - 0s 47us/step

acc : 78.12%

Process finished with exit code 0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值