动手用 Python 创建一个人工神经网络

2019-11-24 22:02:27 来源: www.kdnuggets.com 发布人:

理解神经网络的最好方法是:自己动手构建一个神经网络。
The best way to understand how neural networks work is  to create one yourself. 

神经网络(NN)又称人工神经网络(ANN),是机器学习领域中基于生物神经网络概念的学习算法的一个子集。

安德烈·布列日克他是一位德国的机器学习专家,有五年多的经验,他说:“神经网络正在彻底改变机器学习,因为它们能够在广泛的学科和行业中高效地建模复杂的抽象。”

基本上,人工神经网络由以下组件组成:

  • 接收并传递数据的输入层。
  • 隐藏层
  • 输出层
  • 层间重量
  • 对每个隐藏层都有一个刻意的激活功能。在这个简单的神经网络Python教程中,我们将使用Sigmoid激活函数。

有几种类型的神经网络。在这个项目中,我们将创建前馈或感知神经网络。这种类型的ANN直接将数据从前向后中继。

前馈神经元的训练往往需要反向传播,这为网络提供了相应的输入和输出集。当输入数据被传送到神经元时,它被处理,并产生一个输出。

下面的图表显示了一个简单的神经网络的结构:

Simple Neural Network

而且,了解神经网络如何工作的最好方法是学习如何从头开始构建神经网络(而不使用任何库)。

在本文中,我们将演示如何使用Python编程语言创建一个简单的神经网络。

问题

这是一个显示问题的表格。

输入输出量
培训数据10010
培训数据21111
培训数据31011
培训数据40110
新形势100?

我们将训练神经网络,使它能够预测正确的输出值时,提供一套新的数据。

正如您在表上看到的那样,输出的值总是等于输入部分中的第一个值。因此,我们期望输出的值(?)1岁。

让我们看看是否可以使用一些Python代码来提供相同的结果(您可以在本文末尾仔细阅读这个项目的代码,然后再继续阅读)。

创建一个NeuralNetwork类

我们将创建一个神经网络类来训练神经元来给出准确的预测。该类还将具有其他帮助函数。

尽管我们不会在这个简单的神经网络示例中使用神经网络库,但我们将导入蒙皮库以协助计算。

图书馆提供了以下四种重要方法:

  1. exp-生成自然指数
  2. 列阵-生成矩阵
  3. 网点-矩阵相乘
  4. 随机-产生随机数。请注意,我们将种子随机数,以确保它们的有效分布。
  • 应用Sigmoid函数

我们会用Sigmoid函数,绘制特征“S”型曲线,作为神经网络的激活函数。

Sigmoid Function

这个函数可以将任意值映射为0到1之间的值,它将帮助我们对输入的加权和进行规范化。

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

可以利用Sigmoid函数的输出来生成它的导数。例如,如果输出变量为“x”,则其导数为x*(1-x)。

  • 训练模型

这是我们教神经网络做出准确预测的阶段。每个输入都有一个权重--无论是正的还是负的。

这意味着,具有大量正权重或大量负重的输入将更多地影响结果输出。

记住,我们一开始就是把每个权重分配给一个随机数。

下面是我们在这个神经网络示例问题中使用的训练过程:

  1. 我们从训练数据集中提取输入,根据它们的权重进行一些调整,并通过一种计算人工神经网络输出的方法对它们进行筛选。
  2. 我们计算了反向传播的错误率。在这种情况下,它是神经元的预测输出与训练数据集的预期输出之间的差异。
  3. 根据错误的程度,我们使用误差加权导数公式.
  4. 我们重复了这个过程15,000次。在每次迭代中,整个训练集被同时处理。

我们使用“.T”函数将矩阵从水平位置转换为垂直位置。因此,数字将以如下方式存储:

T Function

最终,神经元的权重将根据所提供的训练数据进行优化。因此,如果让神经元考虑一个新的情况,这是相同的前一个,它可以作出一个准确的预测。这就是反向传播的方式。

包起来

最后,我们初始化了NeuralNetwork类并运行了代码。

下面是如何在Python项目中创建神经网络的全部代码:

 
import numpy as np

class NeuralNetwork():
    
    def __init__(self):
        # seeding for random number generation
        np.random.seed(1)
        
        #converting weights to a 3 by 1 matrix with values from -1 to 1 and mean of 0
        self.synaptic_weights = 2 * np.random.random((3, 1)) - 1

    def sigmoid(self, x):
        #applying the sigmoid function
        return 1 / (1 + np.exp(-x))

    def sigmoid_derivative(self, x):
        #computing derivative to the Sigmoid function
        return x * (1 - x)

    def train(self, training_inputs, training_outputs, training_iterations):
        
        #training the model to make accurate predictions while adjusting weights continually
        for iteration in range(training_iterations):
            #siphon the training data via  the neuron
            output = self.think(training_inputs)

            #computing error rate for back-propagation
            error = training_outputs - output
            
            #performing weight adjustments
            adjustments = np.dot(training_inputs.T, error * self.sigmoid_derivative(output))

            self.synaptic_weights += adjustments

    def think(self, inputs):
        #passing the inputs via the neuron to get output   
        #converting values to floats
        
        inputs = inputs.astype(float)
        output = self.sigmoid(np.dot(inputs, self.synaptic_weights))
        return output


if __name__ == "__main__":

    #initializing the neuron class
    neural_network = NeuralNetwork()

    print("Beginning Randomly Generated Weights: ")
    print(neural_network.synaptic_weights)

    #training data consisting of 4 examples--3 input values and 1 output
    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

    #training taking place
    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!")

 

下面是运行代码的输出:

Code Output

我们成功地建立了一个简单的神经网络。

神经元首先给自己分配一些随机权重。此后,它利用培训实例进行了自我培训。

Consequently, if it was presented with a new situation [1,0,0], it gave the value of 0.9999584.

你还记得我们想要的正确答案是1吗?

然后,这非常接近-考虑到Sigmoid函数输出0到1之间的值。

当然,我们只使用一个神经元网络来完成简单的任务。如果我们把几千个人工神经网络连接在一起呢?我们能不能完全模仿人类的思维方式呢?

你有什么问题或评论吗?

请在下面提供。

作者介绍Michael J.Garbade博士是洛杉矶区块链教育公司的创始人和首席执行官。LiveEdu...它是世界领先的平台,使人们具备实用技能,在未来的技术领域创造完整的产品,包括机器学习。


阅读次数: 2058

下一篇: 与GNSSer相关的论文,欢迎引用,将不定期更新,后续上传原文
上一篇: 《北斗卫星导航系统建设与发展》报告

尚无评论!

返回上一页面