如何用Python创建一个多层神经网络

英文原文:https://medium.com/technology-invention-and-more/how-to-build-a-multi-layered-neural-network-in-python-53ec3d1d326a

在之前的博文里, 我们学习了如何创建一个神经网络。不过,如果我们面临一个更复杂的问题,如何识别“?”是什么?

  Input output
Example 1 0     0     1 0
Example 2 0     1     1 1
Example 3 1     0     1 1
Example 4 0     1     0 1
Example 5 1     0     0 1
Example 6 1     1     1 0
Example 7 0     0     0 0
New situation   1     1     0                 ?

仔细观察会发现,input3是一个无关项。前两列通过“异或”运算后得到output。 因此,我们知道,“?”的值应该是0.

不过,单层神经网络已经处理不了这样的逻辑了。在input和output之间不存在“一对一”的关系,这种情况被称为“非线性模式”。

我们必须创建一个隐藏层,比如有4个神经元(Layer1)。这可以使得神经网络来思考input的组合情况。

蓝色线是神经元之间的链接。这个图是由 https://github.com/miloharper/visualise-neural-network 工具自动生成的。

图中可以看到,Layer1是Layer2的输入。现在,我们可以从训练数据中寻找Layer1和output的关系。在神经网络的训练过程中,通过调整两层的权重,相关性会得到放大。

实际上,图像识别跟这个很相似。像素和苹果之间没有直接的关联。但是,像素的组合与苹果存在一个直接的关联。

给神经网络增加更多层,它就会做更复杂的思考。

Python源码地址: https://github.com/miloharper/multi-layer-neural-network

这个神经网络是从之前文章中修改而来的。总和解释参见文章《Python代码搭建简单的神经网络》

不同之处是现在有多层。当神经网络计算Layer2的error时,它会反向把它传播回Layer1, 然后调整Layer1到权重。这被称为“反向传播(back propagation)”

在命令行运行代码

python main.py

结果

Stage 1) Random starting synaptic weights: 
    Layer 1 (4 neurons, each with 3 inputs): 
[[-0.16595599  0.44064899 -0.99977125 -0.39533485]
 [-0.70648822 -0.81532281 -0.62747958 -0.30887855]
 [-0.20646505  0.07763347 -0.16161097  0.370439  ]]
    Layer 2 (1 neuron, with 4 inputs):
[[-0.5910955 ]
 [ 0.75623487]
 [-0.94522481]
 [ 0.34093502]]
Stage 2) New synaptic weights after training: 
    Layer 1 (4 neurons, each with 3 inputs): 
[[ 0.3122465   4.57704063 -6.15329916 -8.75834924]
 [ 0.19676933 -8.74975548 -6.1638187   4.40720501]
 [-0.03327074 -0.58272995  0.08319184 -0.39787635]]
    Layer 2 (1 neuron, with 4 inputs):
[[ -8.18850925]
 [ 10.13210706]
 [-21.33532796]
 [  9.90935111]]
Stage 3) Considering a new situation [1, 1, 0] -> ?: 
[ 0.0078876]

首先,神经网络随机为神经链接分配权重,然后使用训练集进行训练。 

然后,它会对之前没有遇到过到新情况 [1, 1, 0]进行思考,并做出预测。预测值是0.0078876。正确答案是0,已经非常接近。

很酷!不过计算机在背后做了很多看不见的矩阵运算。

代码解析

#神经元层
class NeuronLayer():
    # number_of_neurons:神经元数量; number_of_inputs_per_neuron:每个神经元的输入数
    def __init__(self, number_of_neurons, number_of_inputs_per_neuron):
        self.synaptic_weights = 2 * random.random((number_of_inputs_per_neuron, number_of_neurons)) - 1

new 一个NeuronLayer生成一层神经元。比如layer1 = NeuronLayer(4, 3)就是生成layer 1,有4个神经元,每个神经元有3个输入。

猜你喜欢

转载自my.oschina.net/stanleysun/blog/1812421