使用keras和python的神经网络教程
深度学习
深度学习是人工智能最重要的部分,它需要大量的数据,并为任何问题提供解决方案。深度学习是机器学习的一部分,但由于高计算能力和数据的可用性,现在它在人工智能领域占有重要地位。
神经网络是一种受人脑工作启发而建立的数学模型。根据维基百科,Warren McCulloch和Walter Pitts(1943)基于数学和算法为神经网络创建了一个计算模型,称为阈值逻辑。该模型为神经网络研究划分为两种方法奠定了基础。一种方法专注于大脑中的生物过程,另一种专注于神经网络在人工智能中的应用。
简单神经网络
简单神经网络是一个简单的数学模型,它以Xn为输入,将输入与权重Wn相乘,再加上偏差b,从激活函数传递出去,输出Y,如下图所示。单层简单神经网络也称为感知器。
从上面的图中可以看出,激活函数是一个像sigmoid和relu这样的非线性函数,实现了非线性。例如,在sigmoid函数中,所有负值都被赋值为零。在神经网络中使用激活函数得到光滑损失函数的目的是损失函数必须是凸函数或凹函数,然后对其进行梯度下降。我们将在实现过程中讨论这个问题。
python实现
使用keras库很容易在python中实现神经网络。Keras是一个建立在tensorflow之上的python库,是一个非常强大的工具,用于执行Google开发的深度学习。我们将使用 Pima diabetes dataset(http://www.kankanyun.com/data/pima-indians-diabetes.data.csv)并构建一个神经网络,该网络将预测患者是否患有糖尿病。首先,使用pip安装keras和tensorflow。
现在我们将使用pandas加载数据并可视化前五行或记录。
#importing important libraries from keras.models import Sequential from keras.layers import Dense import pandas as pd import numpy as np import numpy #load and see first five rows of datasets df = pd.read_csv('pima-indians-diabetes.data.csv', header=None) df.head()
然后我们将选择因变量y和自变量X.在选择X和y之后,我们将分别缩放数据并将它们分成训练和测试集。此外,我们将对目标变量y执行one-hot编码。
#choosing X and y X = df.drop(8, axis = 1) y = df[8] #scaling the data from sklearn.preprocessing import scale X = scale(X) #spiltting data into train and test from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) #one hot encoding from keras.utils import np_utils y_train = np_utils.to_categorical(y_train)
在此之后,我们将转向使用keras设计和构建神经网络模型。这里我们使用一个带有12个神经元的输入层,一个带有8个神经元的隐藏层和一个带有2个神经元的输出层。隐藏层只不过是简单的层,它将输入层输出作为输入传递给下一层。这里我们使用两个激活函数relu和sigmoid。Sigmoid获取所有负值并将它们映射到零,并且relu也是类似的激活函数,其可以定义为y = max(0,x)。
#Defining and desining neural network model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(2, activation='sigmoid'))
现在我们将编译我们的神教网络模型并分配优化方法,它将为我们执行反向传播。反向传播只不过是它会更新权重以优化我们的损失函数。这里我们使用adam优化器来执行反向传播。此外,我们使用二元交叉熵作为我们的损失函数和准确度指标。准确度指标只是实际值和预测值之间的差异。
# Compiling model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
现在终于我们将训练我们的神经网络模型。在这里,我们使用150个epochs,如果你训练这个模型1000个epochs或更多,那么模型将变得更加准确。
# training model model.fit(X_train, y_train, epochs=150, batch_size=10)
在训练模型之后,我们将使用准确度分数来预测和评估我们的深度学习模型。此外,我们将绘制损失函数,以查看模型是否正确收敛。如果图形得到更多的elbow形状,这意味着模型已经达到了最大的准确性,它不需要更多的训练。
#prediction and evalution from sklearn.metrics import accuracy_score y_pred = model.predict(X_test) y_pred = np.argmax(y_pred, axis=1) accuracy_score(y_test, y_pred)
0.7165354330708661
#plotting loss against no. of epochs import matplotlib.pyplot as plt plt.plot(model.history.epoch, model.history.history['loss']) plt.xlabel('epochs') plt.xlabel('loss')
目前,大多数使用的神经网络是CNN(卷积神经网络)和RNN(递归神经网络),它们分别专门用于计算机视觉和时序数据等顺序数据。这是我们使用keras对深度学习和神经网络的简单介绍。