步骤
- 输入层的每个节点与隐藏层的每个节点做点对点计算,加权求和 + 激活函数
- 利用同样的方法,计算隐藏层到输出层
- 隐藏层对加权结合后的结果使用激活函数,本例使用Sigmoid
- 最终的输出值与样本值进行比较,计算出误差
网络结构
代码实现
import numpy as np
def _sigmoid(in_data):
return 1.0 / (1.0 + np.exp(-in_data))
def init_network():
network = {}
# 输入层到隐藏层的权重矩阵和bias
network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
network['b1'] = np.array([0.1, 0.2, 0.3])
# 第一个隐藏层到第二个隐藏层的权重矩阵和bias
network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
network['b2'] = np.array([0.1, 0.2])
# 第二个隐藏层到输出层的权重矩阵和bias
network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
network['b3'] = np.array([0.1, 0.2])
return network
def forward(network, x):
# x是输入
# network是初始化后的模型,已定义好权重矩阵和bias
# 提取模型初始化的权重、bias对象
w1, w2, w3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
# 前向传播
# 输入层到第一个隐藏层
# 输入:x,输出:z1
a1 = x.dot(w1) + b1 # 加权求和
z1 = _sigmoid(a1) # 激活,得到输出z1,作为进入下一层的输入
# 第一个隐藏层到第二个隐藏层
# 输入:z1,输出z2
a2 = z1.dot(w2) + b2 # 加权求和
z2 = _sigmoid(a2) # 激活,得到输出z2,作为进入下一层的输入
# 第二个隐藏层到输出层
a3 = z2.dot(w3) + b3 # 加权求和,得到输出a3
y = a3
return y
if __name__ == '__main__':
# 初始化网络
network = init_network()
# 输入
x = np.array([1.0, 0.5])
# 前向传播
y = forward(network, x)
# 打印输出
print(y)