首 页 行业热点 新车 试驾评测 养车用车 车型库

从零开始用Python构建神经网络

发布网友 发布时间:2022-04-20 11:41

我来回答

2个回答

懂视网 时间:2022-05-10 10:22

本篇文章给大家带来的内容是关于带你简单了解python创建神经网络模型的内容,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

摘要: 对神经网络的工作原理感到好奇?动手实践一下吧,了解神经网络是如何工作的最好方法是自己创建一个简单神经网络。

神经网络(NN),也被称为人工神经网络(ANN),是机器学习领域中学习算法的子集,大体上借鉴了生物神经网络的概念。目前,神经网络在计算机视觉、自然语言处理等领域应用广泛。德国资深机器学习专家Andrey Bulezyuk说到,“神经网络正在彻底改变机器学习,因为它们能够有效地模拟各种学科和行业的复杂抽象,且无需太多人工参与。”
大体上,人工神经网络基本包含以下组件:

  • 接收数据并传递数据的输入层(input layer);

  • 隐藏层(hidden layer);

  • 输出层(output layer);

  • 层与层之间的权重(weight);

  • 每个隐藏层使用的激活函数(activation function);

  • 在本文教程中,使用的是简单的Sigmoid激活函数,但注意一点,在深层神经网络模型中, sigmoid激活函数一般不作为首选,原因是其易发生梯度弥散现象。

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

    而训练前馈神经元通常需要反向传播算法,这就需要为网络提供相应的输入和输出集。当输入数据被传输到神经元时,它会经过相应的处理,并将产生的输出传输给下一层。
    下图简单展示了一个神经网络结构:

    2345截图20181008171635.png

    此外,理解神经网络如何工作的最好方法是学习如何在不使用任何工具箱的前提下从头开始构建一个。在本文中,我们将演示如何使用Python创建一个简单的神经网络。

    问题

    下表显示了我们将解决的问题:

    我们将训练神经网络,以便在提供一组新数据时可以预测出正确的输出值。

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

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

    创建神经网络类|NeuralNetwork Class

    我们将在Python中创建一个NeuralNetwork类来训练神经元以提供准确的预测,该类还包含其他辅助函数。我们不会将神经网络库用于创建这个简单的神经网络示例中,但会导入基本的Numpy库来协助计算。

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

  • EXP——用于产生所述自然指数;

  • array——用于生成矩阵;

  • dot——用于矩阵相乘;

  • random——用于生成随机数;

  • 应用Sigmoid函数

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

    985088249-5bbab961318ea_articlex.png

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

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

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

    训练模型

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

    注意,模型训练最初时,每个权重的初始化都是随机数。
    以下是本文构建的神经网络示例问题中训练过程:

  • 1.从训练数据集中获取输入,根据它们的权重进行一些调整,并通过计算神经网络输出的方法来一层一层的传输;

  • 2.计算反向传播的错误率。在这种情况下,它是神经元预测得到的输出与训练数据集的预期输出之间的误差;

  • 3.根据得到的误差范围,使用误差加权导数公式进行一些小的权重调整;

  • 4.将此过程重复15,000次,在每次迭代过程中,同时处理整个训练集;

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

    3147077886-5bbab9a79b767_articlex.png

    最终,神经元的权重将针对所提供的训练数据进行优化。因此,如果神经网络的输出与期望的输出一致时,说明训练完成,可以进行准确的预测,这就是反向传播的方式。

    封装

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

    import numpy as np
    
    class 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 output if __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!")

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

    3298101012-5bbab9d15a029_articlex.png

    以上是我们设法创建的一个简单的神经网络。首先神经网络开始为自己分配一些随机权,此后,它使用训练样例训练自身。

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

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

    热心网友 时间:2022-05-10 07:30

    从零开始用Python构建神经网络
    动机:为了更加深入的理解深度学习,我们将使用 python 语言从头搭建一个神经网络,而不是使用像 Tensorflow 那样的封装好的框架。我认为理解神经网络的内部工作原理,对数据科学家来说至关重要。
    这篇文章的内容是我的所学,希望也能对你有所帮助。
    神经网络是什么?
    介绍神经网络的文章大多数都会将它和大脑进行类比。如果你没有深入研究过大脑与神经网络的类比,那么将神经网络解释为一种将给定输入映射为期望输出的数学关系会更容易理解。
    神经网络包括以下组成部分
    ? 一个输入层,x
    ? 任意数量的隐藏层
    ? 一个输出层,?
    ? 每层之间有一组权值和偏置,W and b
    ? 为隐藏层选择一种激活函数,σ。在教程中我们使用 Sigmoid 激活函数
    下图展示了 2 层神经网络的结构(注意:我们在计算网络层数时通常排除输入层)

    2 层神经网络的结构
    用 Python 可以很容易的构建神经网络类

    训练神经网络
    这个网络的输出 ? 为:

    你可能会注意到,在上面的等式中,输出 ? 是 W 和 b 函数。
    因此 W 和 b 的值影响预测的准确率. 所以根据输入数据对 W 和 b 调优的过程就被成为训练神经网络。
    每步训练迭代包含以下两个部分:
    ? 计算预测结果 ?,这一步称为前向传播
    ? 更新 W 和 b,,这一步成为反向传播
    下面的顺序图展示了这个过程:

    前向传播
    正如我们在上图中看到的,前向传播只是简单的计算。对于一个基本的 2 层网络来说,它的输出是这样的:

    我们在 NeuralNetwork 类中增加一个计算前向传播的函数。为了简单起见我们假设偏置 b 为0:

    但是我们还需要一个方法来评估预测结果的好坏(即预测值和真实值的误差)。这就要用到损失函数。
    损失函数
    常用的损失函数有很多种,根据模型的需求来选择。在本教程中,我们使用误差平方和作为损失函数。
    误差平方和是求每个预测值和真实值之间的误差再求和,这个误差是他们的差值求平方以便我们观察误差的绝对值。
    训练的目标是找到一组 W 和 b,使得损失函数最好小,也即预测值和真实值之间的距离最小。
    反向传播
    我们已经度量出了预测的误差(损失),现在需要找到一种方法来传播误差,并以此更新权值和偏置。
    为了知道如何适当的调整权值和偏置,我们需要知道损失函数对权值 W 和偏置 b 的导数。
    回想微积分中的概念,函数的导数就是函数的斜率。

    梯度下降法
    如果我们已经求出了导数,我们就可以通过增加或减少导数值来更新权值 W 和偏置 b(参考上图)。这种方式被称为梯度下降法。
    但是我们不能直接计算损失函数对权值和偏置的导数,因为在损失函数的等式中并没有显式的包含他们。因此,我们需要运用链式求导发在来帮助计算导数。

    链式法则用于计算损失函数对 W 和 b 的导数。注意,为了简单起见。我们只展示了假设网络只有 1 层的偏导数。
    这虽然很简陋,但是我们依然能得到想要的结果—损失函数对权值 W 的导数(斜率),因此我们可以相应的调整权值。
    现在我们将反向传播算法的函数添加到 Python 代码中

    为了更深入的理解微积分原理和反向传播中的链式求导法则,我强烈推荐 3Blue1Brown 的如下教程:
    Youtube:https://youtu.be/tIeHLnjs5U8
    整合并完成一个实例
    既然我们已经有了包括前向传播和反向传播的完整 Python 代码,那么就将其应用到一个例子上看看它是如何工作的吧。

    神经网络可以通过学习得到函数的权重。而我们仅靠观察是不太可能得到函数的权重的。
    让我们训练神经网络进行 1500 次迭代,看看会发生什么。 注意观察下面每次迭代的损失函数,我们可以清楚地看到损失函数单调递减到最小值。这与我们之前介绍的梯度下降法一致。

    让我们看看经过 1500 次迭代后的神经网络的最终预测结果:

    经过 1500 次迭代训练后的预测结果
    我们成功了!我们应用前向和方向传播算法成功的训练了神经网络并且预测结果收敛于真实值。
    注意预测值和真实值之间存在细微的误差是允许的。这样可以防止模型过拟合并且使得神经网络对于未知数据有着更强的泛化能力。
    下一步是什么?
    幸运的是我们的学习之旅还没有结束,仍然有很多关于神经网络和深度学习的内容需要学习。例如:
    ? 除了 Sigmoid 以外,还可以用哪些激活函数
    ? 在训练网络的时候应用学习率
    ? 在面对图像分类任务的时候使用卷积神经网络
    我很快会写更多关于这个主题的内容,敬请期待!
    最后的想法
    我自己也从零开始写了很多神经网络的代码
    虽然可以使用诸如 Tensorflow 和 Keras 这样的深度学习框架方便的搭建深层网络而不需要完全理解其内部工作原理。但是我觉得对于有追求的数据科学家来说,理解内部原理是非常有益的。
    这种练习对我自己来说已成成为重要的时间投入,希望也能对你有所帮助

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com