1. 神经网络简介
神经网络由输入层、输出层和之间若干层(一层或多层)隐含层构成,每一层可以有若干个节点。层与层之间节点的连接状态通过权重来体现。
下面介绍一下单个神经元:
输入节点:x1,x2
权重:w1,w2
偏置:b
激活函数:h()
输出结果:y
a = x1*w1 + x2*w2 + b
2. 代码解释
这段代码是在GitHub上找到的,链接如下:
https://github.com/miloharper/simple-neural-network
作者这样描述这段代码:
A neural network written in Python, consisting of a single neuron that uses gradient descent to learn.
一种用Python编写的神经网络,它是由一个使用梯度下降学习的神经元组成。
from numpy import exp, array, random, dot
training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
training_set_outputs = array([[0, 1, 1, 0]]).T
random.seed(1)
synaptic_weights = 2 * random.random((3, 1)) - 1
for iteration in range(10000):
output = 1 / (1 + exp(-(dot(training_set_inputs, synaptic_weights))))
synaptic_weights += dot(training_set_inputs.T, (training_set_outputs - output) * output * (1 - output))
print( 1 / (1 + exp(-(dot(array([1, 0, 0]), synaptic_weights)))))
① from numpy import exp, array, random, dot
#从Numpy库中调用exp(指数函数)、array(数组)、random(随机函数)、dot(矩阵相乘函数)
② training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
#神经网络训练部分的输入
③ training_set_outputs = array([[0, 1, 1, 0]]).T
#神经网络训练部分的输出,.T表示矩阵转置
④ random.seed(1)
#使用随机函数生成随机数(这一行代码可以省略,目的只是保证测试结果与作者一致)
⑤ synaptic_weights = 2 * random.random((3, 1)) – 1
⑥ for iteration in range(10000):
⑦ output = 1 / (1 + exp(-(dot(training_set_inputs, synaptic_weights))))
#使用for语句循环10000次,将训练集的输入和权重采用.dot进行矩阵相乘,将相乘得到的结果输入到sigmoid函数,然后将得到的结果赋值给output
⑧ synaptic_weights += dot(training_set_inputs.T, (training_set_outputs - output) * output * (1 - output))
#权重的调整采用“误差加权导数”公式(梯度下降)
⑨ print (1 / (1 + exp(-(dot(array([1, 0, 0]), synaptic_weights))))) #[0.99993704]
#synaptic_weights是调整之后的最终权重,数组(矩阵)[1,0,0]与这个权重矩阵通过dot函数进行相乘,将相乘的结果作为输入引入到sigmoid函数,得到最终的结果
这段代码的模型如下图所示,有三个输入,一个输出,简单来说,神经网络就是一个通过训练集输入的数据不断地迭代更新权重的模型,使之输出更接近“标准答案”,这里推荐看一下B站上的一个有关神经网络的短视频:
一分钟告诉你什么是神经网络
这9行代码就是把上图的1~4组数据作为训练集进行模型训练,不断地更新权重使其输出更接近训练集中给出的输出标签(标准答案),然后将最后一组数据当做测试集来检测模型的准确度,它最后的结果输出是0.99993704,也是约等于1,其实不难发现,4组测试数据的输出都与第一个输入数据相同,所以说神经网络模型测试得到了正确的结果,这也是说明神经网络有预测结果的作用。