使用python创建自己的第一个神经网络模型吧!

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

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

  • 接收数据并传递数据的输入层(input layer);
  • 隐藏层(hidden layer);
  • 输出层(output layer);
  • 层与层之间的权重(weight);
  • 每个隐藏层使用的激活函数(activation function);

       在本文教程中,使用的是简单的Sigmoid激活函数,但注意一点,在深层神经网络模型中, sigmoid激活函数一般不作为首选,原因是其易发生梯度弥散现象。
       此外,人工神经网络有几种不同类型的神经网络,比如前馈神经网络、卷积神经网络及递归神经网络等。本文将以简单的前馈或感知神经网络为例,这种类型的人工神经网络是直接从前到后传递数据的,简称前向传播过程。
       而训练前馈神经元通常需要反向传播算法,这就需要为网络提供相应的输入和输出集。当输入数据被传输到神经元时,它会经过相应的处理,并将产生的输出传输给下一层。
下图简单展示了一个神经网络结构:

1


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

问题

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

2


       我们将训练神经网络,以便在提供一组新数据时可以预测出正确的输出值。
       从表中看到,输出的值始终等于输入节中的第一个值。因此,我们可以期望新情形的输出(?)值为1。
       下面让我们看看是否可以使用一些Python代码来得到相同的结果。

创建神经网络类|NeuralNetwork Class

       我们将在Python中创建一个NeuralNetwork类来训练神经元以提供准确的预测,该类还包含其他辅助函数。我们不会将神经网络库用于创建这个简单的神经网络示例中,但会导入基本的Numpy库来协助计算。
       Numpy库是处理数据的一种基本库,它具有以下四种重要的计算方法:

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

应用Sigmoid函数

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

3


       此函数可以将任何值映射到0到1之间,并能帮助我们规范化输入的加权和。
       此后,我们将创建Sigmoid函数的导数,以帮助计算权重的基本调整。
       可以使用Sigmoid函数的输出来生成其导数。例如,如果输出变量是“x”,那么它的导数将是x *(1-x)。

训练模型

       训练模型意味着我们将教导神经网络进行准确预测的阶段。每个输入都有一个权重(weights)——正或负的,这意味着具有大值正权重或大值负权重的输入将多所得到的输出有更大地影响。
       注意,模型训练最初时,每个权重的初始化都是随机数。
       以下是本文构建的神经网络示例问题中训练过程:

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

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

4


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

封装

       最后,初始化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!")

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

5

       以上是我们设法创建的一个简单的神经网络。首先神经网络开始为自己分配一些随机权,此后,它使用训练样例训练自身。
       因此,如果出现新的样本输入[1,0,0],则其输出值为0.9999584。而期望的的正确答案是1,可以说二者是非常接近了,考虑到Sigmoid函数是非线性函数,这点误差是可以接受的。
       此外,本文只使用了一层神经网络来执行简单的任务。如果我们将数千个这些人工神经网络集合在一起会发生什么情况呢?我们可以100%模仿人类思维吗?答案是肯定的,但是目前实现起来是比较困难的,只能说是十分相近。对此感兴趣的读者可以阅读与深度学习相关的资料。

作者信息

Michael J. Garbade,LiveEdu公司的首席执行官
本文由阿里云云栖社区组织翻译。
文章原标题《How to Create a Simple Neural Network in Python》,译者:海棠,审校:Uncle_LLD。
文章为简译,更为详细的内容,请查看原文

相关文章
|
3天前
|
机器学习/深度学习 算法 算法框架/工具
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
23 0
|
3天前
|
机器学习/深度学习 存储 计算机视觉
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-4
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
35 11
|
22小时前
|
存储 NoSQL Linux
Redis入门到通关之Redis5种网络模型详解
Redis入门到通关之Redis5种网络模型详解
|
1天前
|
机器学习/深度学习 存储 监控
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
|
1天前
|
机器学习/深度学习 数据采集 算法
Python信贷风控模型:Adaboost,XGBoost,SGD, SVC,随机森林, KNN预测信贷违约支付|数据分享
Python信贷风控模型:Adaboost,XGBoost,SGD, SVC,随机森林, KNN预测信贷违约支付|数据分享
Python信贷风控模型:Adaboost,XGBoost,SGD, SVC,随机森林, KNN预测信贷违约支付|数据分享
|
1天前
|
数据采集 机器学习/深度学习 搜索推荐
使用Python实现推荐系统模型
使用Python实现推荐系统模型
12 1
|
2天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
2天前
|
人工智能 自然语言处理 Python
使用Python实现自然语言处理模型
使用Python实现自然语言处理模型
12 1
|
2天前
|
机器学习/深度学习 算法 搜索推荐
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
30 12
|
2天前
|
机器学习/深度学习 算法 Python
Python用RNN神经网络:LSTM、GRU、回归和ARIMA对COVID19新冠疫情人数时间序列预测
Python用RNN神经网络:LSTM、GRU、回归和ARIMA对COVID19新冠疫情人数时间序列预测
47 12