接网站建站公司,wordpress网站会员太多,网站做贷款许可证,赣州做建材的网站文章目录 神经网络#xff08;neural network#xff09;的结构神经元中常用的激活函数#xff08;activation function#xff09;神经网络的表示神经网络的代码实现使用已学习完毕的神经网络进行推理#xff08;inference#xff09; 源代码文件请点击此处#xff01;… 文章目录 神经网络neural network的结构神经元中常用的激活函数activation function神经网络的表示神经网络的代码实现使用已学习完毕的神经网络进行推理inference 源代码文件请点击此处
神经网络neural network的结构 输入层input layer第 0 层layer 0隐藏层hidden layer第 1 层layer 1、第 2 层layer 2、······、第 l − 1 l-1 l−1 层layer l − 1 l-1 l−1输出层output layer第 l l l 层layer l l l
神经元中常用的激活函数activation function
线性激活函数linear activation function用于线性回归输出可正可负相当于没有使用激活函数所以不能使用该函数作为激活函数 g ( z ) z g(z) z g(z)z
ReLUrectified linear unit函数用于线性回归输出为非负常用于神经网络的隐藏层 g ( z ) max ( 0 , z ) { 0 , z 0 z , z ≥ 0 g(z) \max (0, z) \begin{cases} 0, z 0 \\ z, z \geq 0 \end{cases} g(z)max(0,z){0,z0z,z≥0
sigmoid 函数用于二元分类/逻辑回归输出只能为正常用于神经网络的输出层 g ( z ) 1 1 e − z P ( y ^ 1 ∣ x ⃗ ) g(z) \frac{1}{1e^{-z}} P(\hat{y} 1 | \vec{x}) g(z)1e−z1P(y^1∣x )
softmax 函数用于多元分类常用于神经网络的输出层 g ( z i ) e z i ∑ j 1 N e z j P ( y ^ i ∣ x ⃗ ) g(z_{i}) \frac{e^{z_i}}{\sum_{j1}^{N}e^{z_j}} P(\hat{y} i | \vec{x}) g(zi)∑j1NezjeziP(y^i∣x )
改良的 softmax 函数指数运算的结果容易过大而导致溢出因此可进行如下改进 g ( z i ) e z i ∑ j 1 N e z j C e z i C ∑ j 1 N e z j e z i ln C ∑ j 1 N e z j ln C e z i C ′ ∑ j 1 N e z j C ′ \begin{aligned} g(z_{i}) \frac{e^{z_i}}{\sum_{j1}^{N}e^{z_j}} \\ \frac{Ce^{z_i}}{C\sum_{j1}^{N}e^{z_j}} \\ \frac{e^{z_i \ln C}}{\sum_{j1}^{N}e^{z_j \ln C}} \\ \frac{e^{z_i C}}{\sum_{j1}^{N}e^{z_j C}} \\ \end{aligned} g(zi)∑j1NezjeziC∑j1NezjCezi∑j1NezjlnCezilnC∑j1NezjC′eziC′
为防止溢出一般 C ′ C C′ 取输入信号的最大值。
神经网络的表示
继续以上图为例设神经元的激活函数为 g ( z ) g(z) g(z)
输入层 x ⃗ a ⃗ [ 0 ] ( a 1 [ 0 ] , a 2 [ 0 ] ) \vec{x} \vec{a}^{[0]} (a^{[0]}_1, a^{[0]}_2) x a [0](a1[0],a2[0])第 1 层输入 a ⃗ [ 0 ] ( a 1 [ 0 ] , a 2 [ 0 ] ) \vec{a}^{[0]} (a^{[0]}_1, a^{[0]}_2) a [0](a1[0],a2[0])输出 a ⃗ [ 1 ] ( a 1 [ 1 ] , a 2 [ 1 ] , a 3 [ 1 ] , a 4 [ 1 ] ) \vec{a}^{[1]} (a^{[1]}_1, a^{[1]}_2, a^{[1]}_3, a^{[1]}_4) a [1](a1[1],a2[1],a3[1],a4[1]) a 1 [ 1 ] g ( w ⃗ 1 [ 1 ] ⋅ a ⃗ [ 0 ] b 1 [ 1 ] ) a^{[1]}_1 g(\vec{w}^{[1]}_1 \cdot \vec{a}^{[0]} b^{[1]}_1) a1[1]g(w 1[1]⋅a [0]b1[1]) a 2 [ 1 ] g ( w ⃗ 2 [ 1 ] ⋅ a ⃗ [ 0 ] b 2 [ 1 ] ) a^{[1]}_2 g(\vec{w}^{[1]}_2 \cdot \vec{a}^{[0]} b^{[1]}_2) a2[1]g(w 2[1]⋅a [0]b2[1]) a 3 [ 1 ] g ( w ⃗ 3 [ 1 ] ⋅ a ⃗ [ 0 ] b 3 [ 1 ] ) a^{[1]}_3 g(\vec{w}^{[1]}_3 \cdot \vec{a}^{[0]} b^{[1]}_3) a3[1]g(w 3[1]⋅a [0]b3[1]) a 4 [ 1 ] g ( w ⃗ 4 [ 1 ] ⋅ a ⃗ [ 0 ] b 4 [ 1 ] ) a^{[1]}_4 g(\vec{w}^{[1]}_4 \cdot \vec{a}^{[0]} b^{[1]}_4) a4[1]g(w 4[1]⋅a [0]b4[1])矩阵形式令 W [ 1 ] ( w ⃗ 1 [ 1 ] , w ⃗ 2 [ 1 ] , w ⃗ 3 [ 1 ] , w ⃗ 4 [ 1 ] ) 2 × 4 W^{[1]} (\vec{w}^{[1]}_1, \vec{w}^{[1]}_2, \vec{w}^{[1]}_3, \vec{w}^{[1]}_4)_{2 \times 4} W[1](w 1[1],w 2[1],w 3[1],w 4[1])2×4 B [ 1 ] ( b 1 [ 1 ] , b 2 [ 1 ] , b 3 [ 1 ] , b 4 [ 1 ] ) 1 × 4 B^{[1]} (b^{[1]}_1, b^{[1]}_2, b^{[1]}_3, b^{[1]}_4)_{1 \times 4} B[1](b1[1],b2[1],b3[1],b4[1])1×4则 a ⃗ [ 1 ] g ( a ⃗ [ 0 ] W [ 1 ] B [ 1 ] ) \vec{a}^{[1]} g(\vec{a}^{[0]} W^{[1]} B^{[1]}) a [1]g(a [0]W[1]B[1]) 第 2 层输入 a ⃗ [ 1 ] ( a 1 [ 1 ] , a 2 [ 1 ] , a 3 [ 1 ] , a 4 [ 1 ] ) \vec{a}^{[1]} (a^{[1]}_1, a^{[1]}_2, a^{[1]}_3, a^{[1]}_4) a [1](a1[1],a2[1],a3[1],a4[1])输出 a ⃗ [ 2 ] ( a 1 [ 2 ] , a 2 [ 2 ] , a 3 [ 2 ] , a 4 [ 2 ] , a 5 [ 2 ] ) \vec{a}^{[2]} (a^{[2]}_1, a^{[2]}_2, a^{[2]}_3, a^{[2]}_4, a^{[2]}_5) a [2](a1[2],a2[2],a3[2],a4[2],a5[2]) a 1 [ 2 ] g ( w ⃗ 1 [ 2 ] ⋅ a ⃗ [ 1 ] b 1 [ 2 ] ) a^{[2]}_1 g(\vec{w}^{[2]}_1 \cdot \vec{a}^{[1]} b^{[2]}_1) a1[2]g(w 1[2]⋅a [1]b1[2]) a 2 [ 2 ] g ( w ⃗ 2 [ 2 ] ⋅ a ⃗ [ 1 ] b 2 [ 2 ] ) a^{[2]}_2 g(\vec{w}^{[2]}_2 \cdot \vec{a}^{[1]} b^{[2]}_2) a2[2]g(w 2[2]⋅a [1]b2[2]) a 3 [ 2 ] g ( w ⃗ 3 [ 2 ] ⋅ a ⃗ [ 1 ] b 3 [ 2 ] ) a^{[2]}_3 g(\vec{w}^{[2]}_3 \cdot \vec{a}^{[1]} b^{[2]}_3) a3[2]g(w 3[2]⋅a [1]b3[2]) a 4 [ 2 ] g ( w ⃗ 4 [ 2 ] ⋅ a ⃗ [ 1 ] b 4 [ 2 ] ) a^{[2]}_4 g(\vec{w}^{[2]}_4 \cdot \vec{a}^{[1]} b^{[2]}_4) a4[2]g(w 4[2]⋅a [1]b4[2]) a 5 [ 2 ] g ( w ⃗ 5 [ 2 ] ⋅ a ⃗ [ 1 ] b 5 [ 2 ] ) a^{[2]}_5 g(\vec{w}^{[2]}_5 \cdot \vec{a}^{[1]} b^{[2]}_5) a5[2]g(w 5[2]⋅a [1]b5[2])矩阵形式令 W [ 2 ] ( w ⃗ 1 [ 2 ] , w ⃗ 2 [ 2 ] , w ⃗ 3 [ 2 ] , w ⃗ 4 [ 2 ] , w ⃗ 5 [ 2 ] ) 4 × 5 W^{[2]} (\vec{w}^{[2]}_1, \vec{w}^{[2]}_2, \vec{w}^{[2]}_3, \vec{w}^{[2]}_4, \vec{w}^{[2]}_5)_{4 \times 5} W[2](w 1[2],w 2[2],w 3[2],w 4[2],w 5[2])4×5 B [ 2 ] ( b 1 [ 1 ] , b 2 [ 1 ] , b 3 [ 1 ] , b 4 [ 1 ] , b 5 [ 1 ] ) 1 × 5 B^{[2]} (b^{[1]}_1, b^{[1]}_2, b^{[1]}_3, b^{[1]}_4, b^{[1]}_5)_{1 \times 5} B[2](b1[1],b2[1],b3[1],b4[1],b5[1])1×5则 a ⃗ [ 2 ] g ( a ⃗ [ 1 ] W [ 2 ] B [ 2 ] ) \vec{a}^{[2]} g(\vec{a}^{[1]} W^{[2]} B^{[2]}) a [2]g(a [1]W[2]B[2]) 第 3 层输入 a ⃗ [ 2 ] ( a 1 [ 2 ] , a 2 [ 2 ] , a 3 [ 2 ] , a 4 [ 2 ] , a 5 [ 2 ] ) \vec{a}^{[2]} (a^{[2]}_1, a^{[2]}_2, a^{[2]}_3, a^{[2]}_4, a^{[2]}_5) a [2](a1[2],a2[2],a3[2],a4[2],a5[2])输出 a ⃗ [ 3 ] ( a 1 [ 3 ] , a 2 [ 3 ] , a 3 [ 3 ] ) \vec{a}^{[3]} (a^{[3]}_1, a^{[3]}_2, a^{[3]}_3) a [3](a1[3],a2[3],a3[3]) a 1 [ 3 ] g ( w ⃗ 1 [ 3 ] ⋅ a ⃗ [ 2 ] b 1 [ 3 ] ) a^{[3]}_1 g(\vec{w}^{[3]}_1 \cdot \vec{a}^{[2]} b^{[3]}_1) a1[3]g(w 1[3]⋅a [2]b1[3]) a 2 [ 3 ] g ( w ⃗ 2 [ 3 ] ⋅ a ⃗ [ 2 ] b 2 [ 3 ] ) a^{[3]}_2 g(\vec{w}^{[3]}_2 \cdot \vec{a}^{[2]} b^{[3]}_2) a2[3]g(w 2[3]⋅a [2]b2[3]) a 3 [ 3 ] g ( w ⃗ 3 [ 3 ] ⋅ a ⃗ [ 2 ] b 3 [ 3 ] ) a^{[3]}_3 g(\vec{w}^{[3]}_3 \cdot \vec{a}^{[2]} b^{[3]}_3) a3[3]g(w 3[3]⋅a [2]b3[3])矩阵形式令 W [ 3 ] ( w ⃗ 1 [ 3 ] , w ⃗ 2 [ 3 ] , w ⃗ 3 [ 3 ] ) 5 × 3 W^{[3]} (\vec{w}^{[3]}_1, \vec{w}^{[3]}_2, \vec{w}^{[3]}_3)_{5 \times 3} W[3](w 1[3],w 2[3],w 3[3])5×3 B [ 3 ] ( b 1 [ 3 ] , b 2 [ 3 ] , b 3 [ 3 ] ) 1 × 3 B^{[3]} (b^{[3]}_1, b^{[3]}_2, b^{[3]}_3)_{1 \times 3} B[3](b1[3],b2[3],b3[3])1×3则 a ⃗ [ 3 ] g ( a ⃗ [ 2 ] W [ 3 ] B [ 3 ] ) \vec{a}^{[3]} g(\vec{a}^{[2]} W^{[3]} B^{[3]}) a [3]g(a [2]W[3]B[3]) 第 4 层输入 a ⃗ [ 3 ] ( a 1 [ 3 ] , a 2 [ 3 ] , a 3 [ 3 ] ) \vec{a}^{[3]} (a^{[3]}_1, a^{[3]}_2, a^{[3]}_3) a [3](a1[3],a2[3],a3[3])输出 a ⃗ [ 4 ] ( a 1 [ 4 ] ) \vec{a}^{[4]} (a^{[4]}_1) a [4](a1[4]) a 1 [ 4 ] g ( w ⃗ 1 [ 4 ] ⋅ a ⃗ [ 3 ] b 1 [ 4 ] ) a^{[4]}_1 g(\vec{w}^{[4]}_1 \cdot \vec{a}^{[3]} b^{[4]}_1) a1[4]g(w 1[4]⋅a [3]b1[4])矩阵形式令 W [ 4 ] ( w ⃗ 1 [ 4 ] ) 3 × 1 W^{[4]} (\vec{w}^{[4]}_1)_{3 \times 1} W[4](w 1[4])3×1 B [ 4 ] ( b 1 [ 3 ] , ) 1 × 1 B^{[4]} (b^{[3]}_1,)_{1 \times 1} B[4](b1[3],)1×1则 a ⃗ [ 4 ] g ( a ⃗ [ 3 ] W [ 4 ] B [ 4 ] ) \vec{a}^{[4]} g(\vec{a}^{[3]} W^{[4]} B^{[4]}) a [4]g(a [3]W[4]B[4]) 第 l l l 层输入 a ⃗ [ l − 1 ] ( . . . , a j [ l − 1 ] , . . . ) \vec{a}^{[l-1]} (..., a^{[l-1]}_j, ...) a [l−1](...,aj[l−1],...)输出 a ⃗ [ l ] ( . . . , a j [ l ] , . . . ) \vec{a}^{[l]} (..., a^{[l]}_j, ...) a [l](...,aj[l],...) a j [ l ] g ( w ⃗ j [ l ] ⋅ a ⃗ [ l − 1 ] b j [ l ] ) a^{[l]}_j g(\vec{w}^{[l]}_j \cdot \vec{a}^{[l-1]} b^{[l]}_j) aj[l]g(w j[l]⋅a [l−1]bj[l])
神经网络的代码实现
以上图为例
import numpy as np# sigmoid 函数
def sigmoid_function(x):return 1 / (1 np.exp(-x))# softmax 函数
def softmax_function(a):exp_a np.exp(a)sum_exp_a np.sum(exp_a)y exp_a / sum_exp_areturn y# 改良的 softmax 函数防止在指数运算时发生溢出
def softmax_function_trick(a):c np.max(a)exp_a np.exp(a - c)sum_exp_a np.sum(exp_a)y exp_a / sum_exp_areturn y# ReLU 函数
def relu_function(x):return np.maximum(0, x)# 线性激活函数恒等函数
def linear_activation_function(x):return x# 初始化配置各个神经元的参数
def init_network():network {} # 字典类型# 隐藏层第 1 层layer 1一共 4 个神经元network[W1] np.array([[0.1, 0.2, 0.3, 0.4],[0.5, 0.6, 0.7, 0.8]])network[B1] np.array([[0.1, 0.2, 0.3, 0.4]])# 隐藏层第 2 层layer 2一共 5 个神经元network[W2] np.array([[0.1, 0.2, 0.3, 0.4, 0.5],[0.6, 0.7, 0.8, 0.9, 1.0],[0.1, 0.2, 0.3, 0.4, 0.5],[0.6, 0.7, 0.8, 0.9, 1.0]])network[B2] np.array([[0.1, 0.2, 0.3, 0.4, 0.5]])# 隐藏层第 3 层layer 3一共 3 个神经元network[W3] np.array([[0.1, 0.2, 0.3],[0.4, 0.5, 0.6],[0.7, 0.8, 0.9],[0.6, 0.7, 0.8],[0.1, 0.2, 0.3]])network[B3] np.array([[0.1, 0.2, 0.3]])# 隐藏层第 4 层layer 4一共 1 个神经元network[W4] np.array([[0.1],[0.2],[0.3]])network[B4] np.array([[0.1]])return network# 神经元的内部实现输入A权重W偏置B激活函数g()输出A_out
def dense(A, W, B, g):Z np.matmul(A, W) B # 这里是矩阵乘法而非点乘A_out g(Z)return A_out# 神经网络的搭建
def predict(network, X):W1, W2, W3, W4 network[W1], network[W2], network[W3], network[W4]B1, B2, B3, B4 network[B1], network[B2], network[B3], network[B4]A1 dense(X, W1, B1, sigmoid_function) # layer 1A2 dense(A1, W2, B2, sigmoid_function) # layer 2A3 dense(A2, W3, B3, sigmoid_function) # layer 3A4 dense(A3, W4, B4, linear_activation_function) # layer 4return A4# 从这里开始执行
if __name__ __main__:network init_network() # 配置神经网络的参数X np.array([[1.0, 0.5]]) # 输入层layer 0Y predict(network, X) # 输出层layer 4print(Y)使用已学习完毕的神经网络进行推理inference
测试集源自 MNIST 数据集研究手写数字识别的数据集数据集的下载脚本位于代码仓库的 /dataset/mnist.pyone-hot 表示将正确解标签表示为 1其他错误解标签表示为 0 的表示方法例如
# y: 图像数据经过神经网络计算后的输出结果对应数字 0~9 的概率即“0”的概率为 0.1“2”的概率最高为 0.6
y [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
# t: 监督数据将正确解标签表示为 1其他错误解标签表示为 0这里正确解对应数字“2”
t [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]代码执行流程 第一次调用函数 load_mnist 时会自动下载 MNIST 数据集并转换为字典类型的数据并创建文件 mnist.pkl以后再调用时会直接读入该文件节省时间调用函数 init_network这里读入文件 sample_weight.pkl内容为已学习好的神经网络参数至于如何学习到这些参数会在下一篇介绍对 MNIST 中的每个图像数据调用函数 predict用上述参数构建神经网络对该图像进行推理具体是对 0 到 9 依次给出一个概率概率最高的数字 x 说明图像最有可能是数字 x与正确解标签进行对比统计正确分类的个数并得出精度结果 代码实现
# coding: utf-8import sys, os
sys.path.append(os.pardir) # 为了导入父目录的文件而进行的设定
import numpy as np
import pickle
from dataset.mnist import load_mnist# activation functions # sigmoid 函数
def sigmoid_function(x):return 1 / (1 np.exp(-x))# softmax 函数
def softmax_function(a):exp_a np.exp(a)sum_exp_a np.sum(exp_a)y exp_a / sum_exp_areturn y# 改良的 softmax 函数防止在指数运算时发生溢出
def softmax_function_trick(a):c np.max(a)exp_a np.exp(a - c)sum_exp_a np.sum(exp_a)y exp_a / sum_exp_areturn y# ReLU 函数
def relu_function(x):return np.maximum(0, x)# 线性激活函数恒等函数
def linear_activation_function(x):return x# neural network # 神经元的内部实现输入A权重W偏置B激活函数g()输出A_out
def dense(A, W, B, g):Z np.matmul(A, W) B # 这里是矩阵乘法而非点乘A_out g(Z)return A_out# 初始化配置各个神经元的参数可直接导入记录了神经网络参数的pickle文件
def init_network(filename):with open(filename, rb) as f:network pickle.load(f)return network# 神经网络的搭建
def predict(network, X):W1, W2, W3 network[W1], network[W2], network[W3]B1, B2, B3 network[b1], network[b2], network[b3]A1 dense(X, W1, B1, sigmoid_function) # layer 1A2 dense(A1, W2, B2, sigmoid_function) # layer 2A3 dense(A2, W3, B3, softmax_function_trick) # layer 3return A3# 获取训练集和测试集
def get_data():# 训练集数据和结果测试集数据和结果# 参数说明展开为一维数组不使用归一化不使用 one-hot 标签直接使用 72 这样简单保存正确解标签# 详细参数说明见代码仓库内的 dataset/mnist.py(x_train, t_train), (x_test, t_test) load_mnist(flattenTrue, normalizeTrue, one_hot_labelFalse)return x_train, t_train, x_test, t_test# 模型评估
def assessment():pass# main if __name__ __main__:network init_network(sample_weight.pkl) # 配置神经网络的参数_, _, X, T get_data() # X测试集数据T测试集正确结果accuracy_cnt 0 # 记录推理正确的个数for i in range(X.shape[0]): # X.shape[0] 即为测试集数据个数Y predict(network, X[i]) # 对测试集每个数据进行推理得到 10 个概率数值的一维数组# print(Y)# axis0返回每一列最大值的索引axis1返回每一行最大值的索引# axisNone降为一维数组后返回最大值的索引p np.argmax(Y, axisNone) # 返回概率最大的索引if p T[i]: # 如果推理结果与测试集结果相同说明推理正确accuracy_cnt 1print(faccuracy: {float(accuracy_cnt) / X.shape[0]}) # 精度结果93.52%