赞
踩
g ( z ) = z g(z) = z g(z)=z
g
(
z
)
=
max
(
0
,
z
)
=
{
0
,
z
<
0
z
,
z
≥
0
g(z) = \max (0, z) =
g ( z ) = 1 1 + e − z = P ( y ^ = 1 ∣ x ⃗ ) g(z) = \frac{1}{1+e^{-z}} = P(\hat{y} = 1 | \vec{x}) g(z)=1+e−z1=P(y^=1∣x )
g ( z i ) = e z i ∑ j = 1 N e z j = P ( y ^ = i ∣ x ⃗ ) g(z_{i}) = \frac{e^{z_i}}{\sum_{j=1}^{N}e^{z_j}} = P(\hat{y} = i | \vec{x}) g(zi)=∑j=1Nezjezi=P(y^=i∣x )
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
′
为防止溢出,一般 C ′ C' C′ 取输入信号的最大值。
继续以上图为例(设神经元的激活函数为 g ( z ) g(z) g(z)):
以上图为例:
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_a return 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_a return 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 1 A2 = dense(A1, W2, B2, sigmoid_function) # layer 2 A3 = dense(A2, W3, B3, sigmoid_function) # layer 3 A4 = dense(A3, W4, B4, linear_activation_function) # layer 4 return A4 # 从这里开始执行 if __name__ == '__main__': network = init_network() # 配置神经网络的参数 X = np.array([[1.0, 0.5]]) # 输入层(layer 0) Y = predict(network, X) # 输出层(layer 4) print(Y)
/dataset/mnist.py
# 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
,内容为已学习好的神经网络参数(至于如何学习到这些参数会在下一篇介绍)predict
,用上述参数构建神经网络,对该图像进行推理(具体是对 0 到 9 依次给出一个概率,概率最高的数字 x 说明图像最有可能是数字 x)代码实现:
# coding: utf-8 import 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_a return 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_a return 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 1 A2 = dense(A1, W2, B2, sigmoid_function) # layer 2 A3 = dense(A2, W3, B3, softmax_function_trick) # layer 3 return A3 # 获取训练集和测试集 def get_data(): # 训练集数据和结果,测试集数据和结果 # 参数说明:展开为一维数组,不使用归一化,不使用 one-hot 标签(直接使用 7,2 这样简单保存正确解标签) # 详细参数说明见代码仓库内的 dataset/mnist.py (x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=True, one_hot_label=False) 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) # axis=0:返回每一列最大值的索引;axis=1:返回每一行最大值的索引 # axis=None:降为一维数组后,返回最大值的索引 p = np.argmax(Y, axis=None) # 返回概率最大的索引 if p == T[i]: # 如果推理结果与测试集结果相同,说明推理正确 accuracy_cnt += 1 print(f"accuracy: {float(accuracy_cnt) / X.shape[0]}") # 精度结果:93.52%
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。