推荐 :手把手教你用Python创建简单的神经网络-阿里云开发者社区

开发者社区> 技术小能手> 正文

推荐 :手把手教你用Python创建简单的神经网络

简介:
+关注继续查看

了解神经网络工作方式的最佳途径莫过于亲自创建一个神经网络,本文将演示如何做到这一点。

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

拥有五年以上经验的德国机器学习专家Andrey Bulezyuk声称:“神经网络正在彻底改变机器学习,因为它们能够在广泛的学科和行业中为抽象对象高效建模。”

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

输入层:接收并传递数据

隐藏层

输出层

各层之间的权重

每个隐藏层都有一个激活函数。在这个简单的神经网络Python教程中,我们将使用Sigmoid激活函数。

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

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

下面的图表显示了一个简单的神经网络的结构:
image
了解神经网络如何工作的最佳方法是学习如何从头开始构建神经网络(而不是采用任何库)。

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

问题

如下是一个展示问题的表格。

image
我们将提供一个新的数据集,利用它训练神经网络,从而能够预测正确的输出值。

正如上表所示,输出值总是等于输入部分中的第一个值。因此,我们期望输出的值为1。

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

创建一个NeuralNetwork类

我们将用Python创建一个NeuralNetwork类来训练神经元,以期给出准确的预测。这个类还会有其他的帮助函数。

即使我们不会在这个简单的神经网络示例中使用神经网络库,我们也将导入numpy库来辅助计算。

numpy库提供了以下四种重要方法:

exp—用于生成自然指数

array—用于生成矩阵

dot—用于矩阵相乘

random—用于生成随机数。请注意,我们将生成随机数,以确保它们的有效分布。

  1. 应用Sigmoid函数

我们将使用Sigmoid函数,来绘制一个特征“S”型曲线,作为神经网络的激活函数。
image
此函数可以将任何值映射到0到1之间的值,它将有助于我们对输入的加权和归一化。

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

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

  1. 训练模型

这是我们教神经网络做出准确预测的阶段。每个输入都有一个权重-可为正值或负值。这意味着:有较大的正权重或负权重的输入会对结果的输出产生更大的影响。请记住,我们最初是通过为每个随机数分配一个权重后开始的。

下面是这个神经网络示例的训练过程:

第一步:从训练数据集中提取输入,根据训练数据集的权重进行调整,并通过一种计算神经网络输出的方法对其进行筛选。

第二步:计算反向传播错误率。在这种情况下,它是神经元的预测输出与训练数据集的期望输出之间的差异。

第三步:利用误差加权导数公式,根据所得到的误差范围,进行了一些较小的权值调整。

第四步:对这一过程进行15000次迭代。在每次迭代中,整个训练集被同时处理。

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

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

打包运行

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

运行代码之后的输出:
image
这样,我们便成功地创建了一个简单的神经网络。

神经元首先给自己分配一些随机权重,接着,利用训练实例进行了自我训练。

之后,如果出现新的状态[1,0,0],则它得出的数值为0.9999584。

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

这个数值非常接近,Sigmoid函数输出值在0到1之间。

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

原文发布时间为:2018-12-18
本文作者:Michael Garbade
本文来自云栖社区合作伙伴“ 数据分析 ”,了解相关信息可以关注“
ecshujufenxi”微信公众号

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
尖叫连连!这是谷歌I/O带来的新惊喜:智能助手零延迟对话、3D鲨鱼「上舞台」
北京时间 5 月 8 日凌晨,一年一度的谷歌 I/O 大会在加州山景城如期开幕。今年的大会上,除了常规的安卓 Q 版本更新以外,新手机和「家庭智能设备中心」Nest Hub 显得更加引人注目。而去年惊艳的「能和人打电话的 AI」Duplex 也有了新升级。
6 0
赠V100算力卡 | 百度首次公开PaddlePaddle全景图,11项模块新发布
4 月 23 日,首届 WAVE SUMMIT 2019 深度学习开发者峰会在北京举办,现场超千位开发者与来自百度、英特尔、清华大学等的科学家,就框架与深度学习展开了详细的讨论。在 WAVE 上,百度从建模、训练到部署,首次对外公布了 PaddlePaddle 全景图。
5 0
SysML 2019论文解读:推理优化
推理优化是机器学习领域的核心问题之一,本文将解读 SysML 会议上两篇与推理优化有关的论文,其中一篇提出了准确高效的二位量化神经网络,另一篇则试图用宽松化图替代优化深度神经网络的计算过程。
5 0
旷视联合智源发布全球最大物体检测数据集Objects365,举办CVPR DIW2019挑战赛
4 月 16 日,北京智源人工智能研究院(Beijing Academy of Artificial Intelligence,BAAI,2018 年 11 月 14 日成立)在北京会议中心召开了「智源学者计划暨联合实验室发布会」。
4 0
OpML 2019提前看:模型表现预测与分布式机器学习
OpML 2019 全称是 2019 USENIX Conference on Operational Machine Learning,将于 2019 年 5 月 20 号在美国加州的 Santa Clara 举办。会议旨在提供科研人员和产业从业者一个交流合作的平台,为机器学习生产生命周期管理的普遍挑战开发并带来有影响力的研究进展和前沿解决方案。
3 0
OpenAI 2:0击败Dota2 TI8冠军OG(鱼腩队?),「菜鸡」小编上手体验
在 OpenAI Dota2 项目最终的决战中,OpenAI Five 2:0 战胜 Dota2 职业战队、TI 8 冠军 OG。此外,OpenAI还将在4月18-21日期间把OpenAI Five开放给玩家,注册就能体验。炫耀一下,小编现场体验了一把。
6 0
发展第三代人工智能:清华AI研究院基础理论研究中心成立,朱军任主任
人工智能正处在高速发展时期,而清华的研究人员却早已意识到了目前方法的局限,并放眼于下一代技术上了。5 月 6 日,清华大学成立了人工智能研究院基础理论研究中心,这一机构将成为「第三代人工智能」研究的发动机。
3 0
广义相对论与深度学习能够碰撞出什么火花?高通AI Research最新研发成果一览
内存单元可以执行计算吗?物理学与深度学习会碰撞出哪些火花?本文将介绍 Qualcomm AI Research 的最新 AI 研究成果。
3 0
关于 python 的缩进
python 对缩进是敏感的,而大多教程对缩进规则,往往就几句话带过,对于没有其他语言基础的初学者,十分不友好,本文就把python常见的缩进问题做了一些整理。
10 0
天生一对,硬核微分方程与深度学习的「联姻」之路
微分方程真的能结合深度神经网络?真的能用来理解深度神经网络、推导神经网络架构、构建深度生成模型?本文将从鄂维南、董彬和陈天琦等研究者的工作中,窥探微分方程与深度学习联袂前行的路径。
3 0
+关注
技术小能手
云栖运营小编~
5946
文章
9
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载