对于神经网络上一篇文章,可见:https://blog.csdn.net/Raine_Yang/article/details/128473486?spm=1001.2014.3001.5501
神经网络各层信号传递的实现:
对于全连接网络,连接权重的个数为(前一层神经元总数 * 后一次神经元总数),偏置量(即图中的1)连接权重个数为后一次神经元个数
对于上图,a1的值即为:
如果要计算第一层加权和,可以使用矩阵的乘法运算。注意保证相乘的矩阵X的列数和W的行数相同。
程序实现如下(使用sigmoid作为激活函数):
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
X = np.array([1.0, 0.5])
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])
A1 = np.dot(X, W1) + B1
Z1 = sigmoid(A1)
print(Z1)
第一层到第二层的信号传递:
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
B2 = np.array([0.1, 0.2])
A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)
print(Z2)
第二层到输出层的信号传递:
输出层实现和之前的实现基本相同,不过最后得出的激活函数和之前隐藏层不同。一般使用h(x)代表隐藏层激活函数,而使用σ(x)代表输出层激活函数。
输出层激活函数选取和问题性质相关,一般来说回归问题使用恒等函数,二分类问题可以使用sigmoid,多元分类可以使用softmax
def identity_function(x):
return x
W3 = np.array([[0.1, 0.3], [0.2, 0.4]])
B3 = np.array([0.1, 0.2])
A3 = np.dot(Z2, W3) + B3
Y = identity_function(A3)
print(Y)
这里我们使用identity_function,称为恒等函数,作为输出层的激活函数
三层神经网络前向传播代码实现小结
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def identity_function(x):
return x
def init_network():
network = {}
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])
network["W2"] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
network["b2"] = np.array([0.1, 0.2])
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):
W1, W2, W3 = network["W1"], network["W2"], network["W3"]
b1, b2, b3 = network["b1"], network["b2"], network["b3"]
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2, W3) + b3
y = identity_function(a3)
return y
network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)
该程序定义了init_network和forward两个方法。init_network初始化权重和偏置,并保存到一个字典里。forward则实现了加权运算的过程