佛爷Neural Network注释示例
此代码来自YouTube视频https://youtu.be/h3l4qz76JhQ的演示NN程序。该程序创建一个神经网络模拟两个输入和一个输出的异或功能。
import numpy as np #注意:视频中的这一行有一个错字
以下是sigmoid函数的函数定义,它是为这个神经网络选择的非线性类型。它不是唯一可以选择的非线性类型,但具有很好的分析功能,并且易于教学。在实践中,大规模的深度学习系统使用分段线性函数,因为它们的评估成本要低得多。
这个功能的实现是双重责任。如果传入了deriv = True标志,则该函数会计算函数的导数,该函数在错误反向传播步骤中使用。
def nonlin(x, deriv=False): # Note: there is a typo on this line in the video
if(deriv==True):
return (x*(1-x))
return 1/(1+np.exp(-x)) # Note: there is a typo on this line in the video
以下代码创建输入矩阵。尽管视频中没有提到,但第三列是为了适应偏见术语,而不是输入的一部分。
#input data
X = np.array([[0,0,1], # Note: there is a typo on this line in the video [0,1,1], [1,0,1], [1,1,1]])
异或功能的输出如下。
#output data
y = np.array([[0], [1], [1], [0]])
随机发生器的种子被设置为每次都会返回相同的随机数,这有时用于调试。
np.random.seed(1)
现在我们初始化权值为随机值。syn0是输入层和隐藏层之间的权重。这是一个3×4矩阵,因为有两个输入权重加上一个偏置项(= 3)和四个隐藏层节点(= 4)。syn1是隐藏层和输出层之间的权重。这是一个4×1的矩阵,因为隐藏层中有4个节点和一个输出。请注意,在这个例子中没有提供输出层的偏差项。权重最初是随机生成的,因为当所有权重从相同的值开始时,优化趋于不能正常工作。请注意,视频中显示的神经网络都不能描述这个例子。
#synapses
syn0 = 2*np.random.random((3,4)) - 1 # 3x4 matrix of weights ((2 inputs + 1 bias) x 4 nodes in the hidden layer)
syn1 = 2*np.random.random((4,1)) - 1 # 4x1 matrix of weights. (4 nodes x 1 output) - no bias term in the hidden layer.
这是主要的训练循环。输出显示模型与期望之间的误差的演变。错误稳步减少。
#training step
# Python2 Note: In the follow command, you may improve
# performance by replacing 'range' with 'xrange'.
for j in range(60000):
# Calculate forward through the network.
l0 = X
l1 = nonlin(np.dot(l0, syn0))
l2 = nonlin(np.dot(l1, syn1))
# Back propagation of errors using the chain rule.
l2_error = y - l2
if(j % 10000) == 0: # Only print the error every 10000 steps, to save time and limit the amount of output.
print("Error: " + str(np.mean(np.abs(l2_error))))
l2_delta = l2_error*nonlin(l2, deriv=True)
l1_error = l2_delta.dot(syn1.T)
l1_delta = l1_error * nonlin(l1,deriv=True)
#update weights (no learning rate term)
syn1 += l1.T.dot(l2_delta)
syn0 += l0.T.dot(l1_delta)
print("Output after training")
print(l2)
Error: 0.496410031903
Error: 0.00858452565325
Error: 0.00578945986251
Error: 0.00462917677677
Error: 0.00395876528027
Error:0.00351012256786
Output after training [[ 0.00260572] [ 0.99672209] [ 0.99701711] [ 0.00386759]]
看看最终的输出如何接近真实的输出[0,1,1,0]。如果增加训练循环中的交互次数(当前为60000),则最终输出将更接近。