神经网络(NN),也被称为人工神经网络(ANN),是机器学习领域中学习算法的子集,大体上借鉴了生物神经网络的观点。
目前,神经网络在打算机视觉、自然措辞处理等领域运用广泛。
德国资深机器学习专家Andrey Bulezyuk说到,“神经网络正在彻底改变机器学习,由于它们能够有效地仿照各种学科和行业的繁芜抽象,且无需太多人工参与。

大体上,人工神经网络基本包含以下组件:

神经收集模子建筑设计 公共建筑设计

吸收数据并通报数据的输入层(input layer);隐蔽层(hidden layer);输出层(output layer);层与层之间的权重(weight);每个隐蔽层利用的激活函数(activation function);

在本文教程中,利用的是大略的Sigmoid激活函数,但把稳一点,在深层神经网络模型中, sigmoid激活函数一样平常不作为首选,缘故原由是其易发生梯度弥散征象。

此外,人工神经网络有几种不同类型的神经网络,比如前馈神经网络、卷积神经网络及递归神经网络等。
本文将以大略的前馈或感知神经网络为例,这种类型的人工神经网络是直接从前到后通报数据的,简称前向传播过程。

演习前馈神经元常日须要反向传播算法,这就须要为网络供应相应的输入和输出集。
当输入数据被传输到神经元时,它会经由相应的处理,并将产生的输出传输给下一层。

下图大略展示了一个神经网络构造:

此外,理解神经网络如何事情的最好方法是学习如何在不该用任何工具箱的条件下从头开始构建一个。
在本文中,我们将演示如何利用Python创建一个大略的神经网络。

问题

下标显示了我们将办理的问题:

我们将演习神经网络,以便在供应一组新数据时可以预测出精确的输出值。

从表中看到,输出的值始终即是输入节中的第一个值。
因此,我们可以期望新环境的输出(?)值为1。

下面让我们看看是否可以利用一些Python代码来得到相同的结果。

创建神经网络类|NeuralNetwork Class

我们将在Python中创建一个NeuralNetwork类来演习神经元以供应准确的预测,该类还包含其他赞助函数。
我们不会将神经网络库用于创建这个大略的神经网络示例中,但会导入基本的Numpy库来帮忙打算。

Numpy库是处理数据的一种基本库,它具有以下四种主要的打算方法:

EXP——用于产生所述自然指数;array——用于天生矩阵;dot——用于矩阵相乘;random——用于天生随机数;

运用Sigmoid函数

我们将利用Sigmoid函数,它绘制出一个“S”形曲线,将其作为本文创建的神经网络的激活函数。

此函数可以将任何值映射到0到1之间,并能帮助我们规范化输入的加权和。

此后,我们将创建Sigmoid函数的导数,以帮助打算权重的基本调度。

可以利用Sigmoid函数的输出来天生其导数。
例如,如果输出变量是“x”,那么它的导数将是x (1-x)。

演习模型

演习模型意味着我们将教导神经网络进行准确预测的阶段。
每个输入都有一个权重(weights)——正或负的,这意味着具有大值正权重或大值负权重的输入将多所得到的输出有更大地影响。

把稳,模型演习最初时,每个权重的初始化都是随机数。

以下是本文构建的神经网络示例问题中演习过程:

1.从演习数据集中获取输入,根据它们的权重进行一些调度,并通过打算神经网络输出的方法来一层一层的传输;2.打算反向传播的缺点率。
在这种情形下,它是神经元预测得到的输出与演习数据集的预期输出之间的偏差;3.根据得到的偏差范围,利用偏差加权导数公式进行一些小的权重调度;4.将此过程重复15,000次,在每次迭代过程中,同时处理全体演习集;

在这里,我们利用“.T”函数对矩阵求偏置。
因此,数字将以这种办法存储:

终极,神经元的权重将针对所供应的演习数据进行优化。
因此,如果神经网络的输出与期望的输出同等时,解释演习完成,可以进行准确的预测,这便是反向传播的办法。

封装

末了,初始化NeuralNetwork类后并运行全体程序,以下是如何在Python项目中创建神经网络的完全代码:

import numpy as npclass NeuralNetwork(): def __init__(self): # 设置随机数种子 np.random.seed(1) # 将权重转化为一个3x1的矩阵,其值分布为-1~1,并且均值为0 self.synaptic_weights = 2 np.random.random((3, 1)) - 1 def sigmoid(self, x): # 运用sigmoid激活函数 return 1 / (1 + np.exp(-x)) def sigmoid_derivative(self, x): #打算Sigmoid函数的偏导数 return x (1 - x) def train(self, training_inputs, training_outputs, training_iterations): # 演习模型 for iteration in range(training_iterations): # 得到输出 output = self.think(training_inputs) # 打算偏差 error = training_outputs - output # 微调权重 adjustments = np.dot(training_inputs.T, error self.sigmoid_derivative(output)) self.synaptic_weights += adjustments def think(self, inputs): # 输入通过网络得到输出 # 转化为浮点型数据类型 inputs = inputs.astype(float) output = self.sigmoid(np.dot(inputs, self.synaptic_weights)) return outputif __name__ == \"大众__main__\公众: # 初始化神经类 neural_network = NeuralNetwork() print(\"大众Beginning Randomly Generated Weights: \公众) print(neural_network.synaptic_weights) #演习数据 training_inputs = np.array([[0,0,1], [1,1,1], [1,0,1], [0,1,1]]) training_outputs = np.array([[0,1,1,0]]).T # 开始演习 neural_network.train(training_inputs, training_outputs, 15000) print(\"大众Ending Weights After Training: \"大众) print(neural_network.synaptic_weights) user_input_one = str(input(\"大众User Input One: \公众)) user_input_two = str(input(\公众User Input Two: \"大众)) user_input_three = str(input(\"大众User Input Three: \"大众)) print(\"大众Considering New Situation: \公众, user_input_one, user_input_two, user_input_three) print(\"大众New Output data: \"大众) print(neural_network.think(np.array([user_input_one, user_input_two, user_input_three]))) print(\公众Wow, we did it!\公众)

以下是运行代码后产生的输出:

以上是我们设法创建的一个大略的神经网络。
首先神经网络开始为自己分配一些随机权,此后,它利用演习样例演习自身。

因此,如果涌现新的样本输入[1,0,0],则其输出值为0.9999584。
而期望的的精确答案是1,可以说二者是非常靠近了,考虑到Sigmoid函数是非线性函数,这点偏差是可以接管的。

此外,本文只利用了一层神经网络来实行大略的任务。
如果我们将数千个这些人工神经网络凑集在一起会发生什么情形呢?我们可以100%模拟人类思维吗?答案是肯定的,但是目前实现起来是比较困难的,只能说是十分附近。
对此感兴趣的读者可以阅读与深度学习干系的资料。

作者信息

Michael J. Garbade,LiveEdu公司的首席实行官

本文由阿里如斯栖社区组织翻译。

文章原标题《How to Create a Simple Neural Network in Python》,译者:海棠,审校:Uncle_LLD。