神经网络是由多层神经元组成的复杂系统,旨在模拟人脑的神经网络结构,使其能够像人类一样理解和响应。这种网络设计用于执行机器学习算法难以胜任的更复杂的任务,并且在性能上无法达到所需标准。神经网络能够执行许多复杂的任务,包括图像分类、目标检测、面部识别、文本摘要、语音识别等,应用范围非常广泛。
神经网络如何学习复杂特征?神经网络拥有多层结构,每一层执行特定的功能,网络越复杂,性能越强。因此,神经网络也被称为多层感知器。
Keras是一个快速、开源且易于使用的神经网络库,用Python编写,运行在Theano或TensorFlow之上。TensorFlow提供了低级和高级API,而Keras仅提供高级API。对于初学者来说,建议先使用Keras,然后再转向TensorFlow。原因是TensorFlow的函数对于初学者来说理解起来较为复杂,而Keras的功能则相对简单。
将逐步构建一个简单的人工神经网络,这将帮助在未来创建自己的模型。
将使用Pima Indians Diabetes Data数据集,可以从这里下载。这是一个由UCI机器学习数据集提供的简单数据集,包含印度患者的医疗记录。需要预测患者是否会在5年内出现糖尿病。
import pandas as pd
data = pd.read_csv('diabetes.csv')
x = data.drop("Outcome", axis=1)
y = data["Outcome"]
这是一个二元分类问题,需要判断患者是否会出现糖尿病,即1或0。所有列都是数值型,这使得可以直接在其上构建神经网络。因此,已经分离了独立和依赖数据。
在Keras中,模型总是定义为一系列层。这意味着初始化序列模型,并逐层添加,按列表顺序执行。实际上,需要尝试通过添加和移除层来实验,直到对架构感到满意。
需要注意的是,第一层必须有正确数量的输入特征,这是通过input_dim参数指定的。可以将神经元的数量作为层的第一个参数来指定。要定义激活函数,请使用activation参数。
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(12, input_dim=8, activation="relu"))
model.add(Dense(8, activation="relu"))
model.add(Dense(1, activation="sigmoid"))
请记住,在第一层,即输入层,指定数据的正确形状。
当编译Keras模型时,它使用后端数值库,如TensorFlow或Theano。无论使用哪个后端,它都会自动选择在硬件上(如CPU、GPU或TPU)表示网络的最佳方式。
在编译模型时,必须指定一些额外的参数,以更好地评估模型并找到将输入映射到输出的最佳权重集合。
损失函数 - 必须指定损失函数,以评估模型将映射的权重集合。将使用交叉熵作为损失函数,实际上被称为二元交叉熵,用于二元分类。
优化器 - 第二个是优化器,用于优化损失。将使用adam,这是梯度下降的一个流行版本,在大多数问题中都能给出最佳结果。
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
模型成功编译后,准备将数据拟合到模型并开始训练神经网络。除了向模型提供数据外,还需要定义训练发生的周期数和批量大小。
周期 - 通过训练数据集的所有行的单次传递
批量大小 - 模型在更新权重之前考虑的样本数量。
model.fit(x, y, epochs=150, batch_size=10)
一个周期可以包含多个批次。这些参数最终是在试错方法后决定的。
训练模型后,让了解神经网络的性能。模型总是在测试集上进行评估,在本例中,为了简单起见,在完整数据集上进行了训练,但在任何项目中,通常会分割数据并训练网络。
_, accuracy = model.evaluate(x, y)
print("Model accuracy: %.2f" % (accuracy * 100))
要评估模型,请使用evaluate方法,并将输入和输出传递给模型,以检查性能。
通过简单地使用predict方法,可以预测新数据的输出。由于有一个二元分类问题,所以输出将简单地是0或1。
predictions = model.predict(x)
print([round(x[0]) for x in predictions])
或者,也可以直接使用predict_classes函数来预测类别。
解决了,使用Keras仅用几行代码就轻松地构建了一个具有3层的神经网络。
model = Sequential() #define model
model.add(Dense(12, input_dim=8, activation="relu"))
model.add(Dense(8, activation="relu"))
model.add(Dense(1, activation="sigmoid"))
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) #compile model
model.fit(x, y, epochs=150, batch_size=10) #training
_, accuracy = model.evaluate(x, y) #testing
print("Model accuracy: %.2f" % (accuracy * 100))
predictions = model.predict(x) #make predictions
#round the prediction
rounded = [round(x[0]) for x in predictions]