翻译:四分钟建立一个神经网络--佛爷带你快速入门机器学习神经网络算法

佛爷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),则最终输出将更接近。
    原文作者:神经网络算法
    原文地址: https://blog.csdn.net/Tong_T/article/details/78935805
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞