前向传播 (Forward Propagation)
前向传播通过对一层的结点以及对应的连接权值进行加权和运算,结果加上一个偏置项,然后通过一个非线性函数(即激活函数),如ReLu,sigmoid等函数,得到的结果就是下一层结点的输出。从第一层(输入层)开始不断的通过这种方法一层层的运算,最后得到输出层结果。
下面是一个简单的例子,暂不考虑偏置项和激活函数。输入层有结点A,B;隐藏层有结点C,D;输出层是结点E。
结点的计算公式可以是
, 这里激活函数用的是sigmoid,根据需要可以用其他函数。
如不考虑偏置项和激活函数,公式就简化成。由此可以得出,结点C的值就是:3x1 + 4x2 = 11; 同理结点D的值就是:3x2 + 4x1 = 10; 结点E的值就是:11x3 + 10x(-1) = 23。
PYTHON实现的程序是:
import numpy as np # 输入层数据 input_data = np.array([3, 4]) # 计算隐藏层 weight1 = np.array([[1, 2], [2, 1]]) hidden_layer_values = input_data.dot(weight1) print(hidden_layer_values) # 计算输出 weight2 = np.array([3, -1]) output = (hidden_layer_values * weight2).sum() print(output)
下面程序考虑了激活函数:
import numpy as np def sigmoid(x): # 计算sigmoid return 1/(1+np.exp(-x)) # 网络尺寸 input_node = 5 hidden_node = 3 output_node = 2 np.random.seed(42) # 产生随机输入数据 X = np.random.randn(input_node) # 用高斯分布产生随机权重数据 weights_input_to_hidden = np.random.normal(0, scale=0.1, size=(input_node, hidden_node)) weights_hidden_to_output = np.random.normal(0, scale=0.1, size=(hidden_node, output_node)) # 计算前向传播 hidden_layer_in = np.dot(X, weights_input_to_hidden) hidden_layer_out = sigmoid(hidden_layer_in) output_layer_in = np.dot(hidden_layer_out, weights_hidden_to_output) output_layer_out = sigmoid(output_layer_in) # 显示输出 print('Output-layer Output:') print(output_layer_out) output_layer_out = sigmoid(output_layer_in) print('Output-layer Output:') print(output_layer_out)