搜索
首页后端开发Python教程带你简单了解python创建神经网络模型的内容
带你简单了解python创建神经网络模型的内容Oct 08, 2018 pm 05:18 PM
pythonrandom函数神经网络

本篇文章给大家带来的内容是关于带你简单了解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%模仿人类思维吗?答案是肯定的,但是目前实现起来是比较困难的,只能说是十分相近。对此感兴趣的读者可以阅读与深度学习相关的资料。

以上是带你简单了解python创建神经网络模型的内容的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:segmentfault思否。如有侵权,请联系admin@php.cn删除
GNN的基础、前沿和应用GNN的基础、前沿和应用Apr 11, 2023 pm 11:40 PM

近年来,图神经网络(GNN)取得了快速、令人难以置信的进展。图神经网络又称为图深度学习、图表征学习(图表示学习)或几何深度学习,是机器学习特别是深度学习领域增长最快的研究课题。本次分享的题目为《GNN的基础、前沿和应用》,主要介绍由吴凌飞、崔鹏、裴健、赵亮几位学者牵头编撰的综合性书籍《图神经网络基础、前沿与应用》中的大致内容。一、图神经网络的介绍1、为什么要研究图?图是一种描述和建模复杂系统的通用语言。图本身并不复杂,它主要由边和结点构成。我们可以用结点表示任何我们想要建模的物体,可以用边表示两

一文通览自动驾驶三大主流芯片架构一文通览自动驾驶三大主流芯片架构Apr 12, 2023 pm 12:07 PM

当前主流的AI芯片主要分为三类,GPU、FPGA、ASIC。GPU、FPGA均是前期较为成熟的芯片架构,属于通用型芯片。ASIC属于为AI特定场景定制的芯片。行业内已经确认CPU不适用于AI计算,但是在AI应用领域也是必不可少。 GPU方案GPU与CPU的架构对比CPU遵循的是冯·诺依曼架构,其核心是存储程序/数据、串行顺序执行。因此CPU的架构中需要大量的空间去放置存储单元(Cache)和控制单元(Control),相比之下计算单元(ALU)只占据了很小的一部分,所以CPU在进行大规模并行计算

扛住强风的无人机?加州理工用12分钟飞行数据教会无人机御风飞行扛住强风的无人机?加州理工用12分钟飞行数据教会无人机御风飞行Apr 09, 2023 pm 11:51 PM

当风大到可以把伞吹坏的程度,无人机却稳稳当当,就像这样:御风飞行是空中飞行的一部分,从大的层面来讲,当飞行员驾驶飞机着陆时,风速可能会给他们带来挑战;从小的层面来讲,阵风也会影响无人机的飞行。目前来看,无人机要么在受控条件下飞行,无风;要么由人类使用遥控器操作。无人机被研究者控制在开阔的天空中编队飞行,但这些飞行通常是在理想的条件和环境下进行的。然而,要想让无人机自主执行必要但日常的任务,例如运送包裹,无人机必须能够实时适应风况。为了让无人机在风中飞行时具有更好的机动性,来自加州理工学院的一组工

对比学习算法在转转的实践对比学习算法在转转的实践Apr 11, 2023 pm 09:25 PM

1 什么是对比学习1.1 对比学习的定义1.2 对比学习的原理1.3 经典对比学习算法系列2 对比学习的应用3 对比学习在转转的实践3.1 CL在推荐召回的实践3.2 CL在转转的未来规划1 什么是对比学习1.1 对比学习的定义对比学习(Contrastive Learning, CL)是近年来 AI 领域的热门研究方向,吸引了众多研究学者的关注,其所属的自监督学习方式,更是在 ICLR 2020 被 Bengio 和 LeCun 等大佬点名称为 AI 的未来,后陆续登陆 NIPS, ACL,

python random库如何使用demopython random库如何使用demoMay 05, 2023 pm 08:13 PM

pythonrandom库简单使用demo当我们需要生成随机数或者从一个序列中随机选择元素时,可以使用Python内置的random库。下面是一个带有注释的例子,演示了如何使用random库:#导入random库importrandom#生成一个0到1之间的随机小数random_float=random.random()print(random_float)#生成一个指定范围内的随机整数(包括端点)random_int=random.randint(1,10)print(random_int)#

Michael Bronstein从代数拓扑学取经,提出了一种新的图神经网络计算结构!Michael Bronstein从代数拓扑学取经,提出了一种新的图神经网络计算结构!Apr 09, 2023 pm 10:11 PM

本文由Cristian Bodnar 和Fabrizio Frasca 合著,以 C. Bodnar 、F. Frasca 等人发表于2021 ICML《Weisfeiler and Lehman Go Topological: 信息传递简单网络》和2021 NeurIPS 《Weisfeiler and Lehman Go Cellular: CW 网络》论文为参考。本文仅是通过微分几何学和代数拓扑学的视角讨论图神经网络系列的部分内容。从计算机网络到大型强子对撞机中的粒子相互作用,图可以用来模

Java使用Random类的nextDouble()函数生成随机的双精度浮点数Java使用Random类的nextDouble()函数生成随机的双精度浮点数Jul 25, 2023 am 09:06 AM

Java使用Random类的nextDouble()函数生成随机的双精度浮点数Java中的Random类是一个伪随机数生成器,可以用来生成不同类型的随机数。其中,nextDouble()函数用于生成一个随机的双精度浮点数。在使用Random类之前,我们需要先导入java.util包。接下来我们可以创建一个Random对象,然后使用nextDouble()函数

微软提出自动化神经网络训练剪枝框架OTO,一站式获得高性能轻量化模型微软提出自动化神经网络训练剪枝框架OTO,一站式获得高性能轻量化模型Apr 04, 2023 pm 12:50 PM

OTO 是业内首个自动化、一站式、用户友好且通用的神经网络训练与结构压缩框架。 在人工智能时代,如何部署和维护神经网络是产品化的关键问题考虑到节省运算成本,同时尽可能小地损失模型性能,压缩神经网络成为了 DNN 产品化的关键之一。DNN 压缩通常来说有三种方式,剪枝,知识蒸馏和量化。剪枝旨在识别并去除冗余结构,给 DNN 瘦身的同时尽可能地保持模型性能,是最为通用且有效的压缩方法。三种方法通常来讲可以相辅相成,共同作用来达到最佳的压缩效果。然而现存的剪枝方法大都只针对特定模型,特定任务,且需要很

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),