输入层中的神经节点数目由输入数据的维数决定,本例中有链球菌 x 1 x_1 x1和葡萄球菌 x 2 x_2 x2,因此输入数据维度是 2 2 2,输入由2个神经元节点组成。同理,输出层中的节点数目由输出的分类维度决定, 本例中为病原体 I(O)和病原体 II(1),因此输出层由 2个神经元组成。
人工神经网络的定义图
激活函数使用Tanh函数,输出层函数使用Softmax函数
在神经网络中Softmax 函数常作用于输出层,将神经网络的输出向量转换成同分布的概率分布。
损失函数采用交叉熵损失函数(负对数似然函数),假设 N N N个训练样本,对应C个分类,预测值 y ^ \hat y y^与真实值 y y y的损失函数为: L ( y , y ^ ) = − 1 N ∑ n ∈ N ∑ i ∈ C y n , i l o g y ^ n , i L(y,\hat y)=- \frac{1}{N} \sum_{n \in N} \sum_{i \in C} y_{n,i}log\hat y_{n,i} L(y,y^)=−N1n∈N∑i∈C∑yn,ilogy^n,i
梯度下降算法使用固定学习率 η \eta η的批量梯度下降算法 x ← x − η Δ x x \leftarrow x-\eta \Delta x x←x−ηΔx对本例中人工智能模型中用到的参数 W 1 , b 1 , W 2 , b 2 W_1,b_1,W_2,b_2 W1,b1,W2,b2求导,对权重和偏置参数进行求导则是利用 BP反向传播算法,可以得到网络中各个参数的偏导 δ 3 = y ^ − y δ 2 = ( 1 − tanh 2 ( z 1 ) ) × δ 3 W 2 T ∂ L ∂ W 2 = a 1 T δ 3 ∂ L ∂ b 2 = δ 3 ∂ L ∂ W 1 = x T δ 2 ∂ L ∂ b 1 = δ 2 \begin{align*} \boldsymbol{\delta}_3 &= \hat{\boldsymbol{y}} - \boldsymbol{y} \\ \boldsymbol{\delta}_2 &= \left(1 - \tanh^2(\boldsymbol{z}_1)\right) \times \boldsymbol{\delta}_3 \boldsymbol{W}_2^T \\ \frac{\partial L}{\partial \boldsymbol{W}_2} &= \boldsymbol{a}_1^T \boldsymbol{\delta}_3 \\ \frac{\partial L}{\partial \boldsymbol{b}_2} &= \boldsymbol{\delta}_3 \\ \frac{\partial L}{\partial \boldsymbol{W}_1} &= \boldsymbol{x}^T \boldsymbol{\delta}_2 \\ \frac{\partial L}{\partial \boldsymbol{b}_1} &= \boldsymbol{\delta}_2 \end{align*} δ3δ2∂W2∂L∂b2∂L∂W1∂L∂b1∂L=y^−y=(1−tanh2(z1))×δ3W2T=a1Tδ3=δ3=xTδ2=δ2
实现损失函数和预测函数
model 字典中存储着网络中的权重参数和偏置参数,通过model 获取网络中的参数 w 1 , b 1 , w 2 , b 2 w_1,b_1,w_2,b_2 w1,b1,w2,b2,使用神经网络的前馈公式进行前馈计算。 前馈计算后得到预测的输出值 probs,再用 probs与真实的输出值y来计算损失值。
研究不同的隐层节点数(隐层中神经元的数量)对ANN模型的影响。使用 l i s t list list来记录被测试的不同隐层节点数,分别是 [ 1 , 2 , 3 , 4 , 5 , 15 , 30 , 50 ] [1, 2, 3, 4, 5, 15, 30, 50] [1,2,3,4,5,15,30,50],然后使用 f o r for for来迭代 P y t h o n Python Python的 e n u m e r a t e enumerate enumerate对象
# 定义输出图像的大小
plt.figure(figsize=(32,16))# 待输入的隐层节点数list
hidden_layer_dimensions =[1,2,3,4,30,50]for i, nn_hdim inenumerate(hidden_layer_dimensions):
plt.subplot(2,3, i +1)
plt.title('Hidden Layer size %d'% nn_hdim)
model = ann_model(X, y, nn_hdim)# 建立 nn_hdim 个神经元的隐层
plot_decision_boundary(lambda x: predict(model, x), X, y)# 输出 ANN 模型分类结果
plt.show()