热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一篇文章教你用

雷锋网按:本文作者陶言祺,原文载于作者个人博客,雷锋网(公众号:雷锋网)已获授权。声明:本文是根据英文教程 ANeuralNetworkin11linesofPython(用11行

雷锋网按:本文作者陶言祺,原文载于作者个人博客,雷锋网(公众号:雷锋网)已获授权。

声明:本文是根据英文教程 A Neural Network in 11 lines of Python(用 11 行 Python 代码实现的神经网络)学习总结而来,关于更详细的神经网络的介绍可以参考我的另一篇博客:从感知机到人工神经网络。

如果你读懂了下面的文章,你会对神经网络有更深刻的认识,有任何问题,请多指教。

  Very simple Neural Network

首先确定我们要实现的任务:

一篇文章教你用 11 行 Python 代码实现神经网络

输出的为样本为 X 为 4*3,有 4 个样本 3 个属性,每一个样本对于这一个真实值 y,为 4*1 的向量,我们要根据 input 的值输出与 y 值损失最小的输出。

  Two Layer Neural Network

首先考虑最简单的神经网络,如下图所示:

一篇文章教你用 11 行 Python 代码实现神经网络

输入层有3个神经元(因为有3个属性),输出为一个值,w1,w2,w3为其权重。输出为: 

一篇文章教你用 11 行 Python 代码实现神经网络

这里的f为sigmoid函数: 

一篇文章教你用 11 行 Python 代码实现神经网络

一个重要的公式: 

一篇文章教你用 11 行 Python 代码实现神经网络

神经网络的优化过程是:

1. 前向传播求损失 
2. 反向传播更新w

简单是实现过程如下所示:

import numpy as np

# sigmoid function

# deriv=ture 是求的是导数

def nonlin(x,deriv=False):

    if(deriv==True):

        return x*(1-x)

    return 1/(1+np.exp(-x))

# input dataset

X = np.array([  [0,0,1],

                [1,1,1],

                [1,0,1],

                [0,1,1] ])

# output dataset            

y = np.array([[0,1,1,0]]).T

# seed random numbers to make calculation

np.random.seed(1)

# initialize weights randomly with mean 0

syn0 = 2*np.random.random((3,1)) - 1

# 迭代次数

for iter in xrange(10000):

    # forward propagation

    # l0也就是输入层

    l0 = X

    l1 = nonlin(np.dot(l0,syn0))

    # how much did we miss?

    l1_error = y - l1

    # multiply how much we missed by the 

    # slope of the sigmoid at the values in l1

    l1_delta = l1_error * nonlin(l1,True)

    # update weights

    syn0 += np.dot(l0.T,l1_delta)

print "Output After Training:"

print l1

注意这里整体计算了损失,X(4*3) dot w(3*1) = 4*1 为输出的 4 个值,所以 
l1_error = y - l1 同样为一个 4*1 的向量。

重点理解:

   # slope of the sigmoid at the values in l1

   #nonlin(l1,True),这里是对sigmoid求导

   #前向计算,反向求导

   l1_delta = l1_error * nonlin(l1,True)  

  # update weights

   syn0 += np.dot(l0.T,l1_delta)

下面看一个单独的训练样本的情况,真实值y==1,训练出来的为0.99已经非常的接近于正确的值了,因此这时应非常小的改动syn0的值,因此:

一篇文章教你用 11 行 Python 代码实现神经网络

一篇文章教你用 11 行 Python 代码实现神经网络

运行输出结果为,可以看到其训练的不错:

Output After Training:
Output After Training:[[ 0.00966449]
[ 0.99211957]
[ 0.99358898]
[ 0.00786506]]123456123456

  Three Layer Neural Network

我们知道,两层的神经网络即为一个小的感知机(参考:感知机到人工神经网络),它只能出来线性可分的数据,如果线性不可分,则其出来的效果较差,如下图所示的数据:

 一篇文章教你用 11 行 Python 代码实现神经网络

如果仍用上述的代码(2层的神经网络)则其结果为:

Output After Training:[[ 0.5]
[ 0.5]
[ 0.5]
[ 0.5]]1234512345

因为数据并不是线性可分的,因此它是一个非线性的问题,神经网络的强大之处就是其可以搭建更多的层来对非线性的问题进行处理。

下面我将搭建一个含有5个神经元的隐含层,其图形如下,(自己画的,略丑),这来要说下神经网络其实很简单,只要你把层次的结果想清楚。

一篇文章教你用 11 行 Python 代码实现神经网络

要搞清楚w的维度:第一层到第二层的w为3*5,第二层到第三层的W为5*1,因此还是同样的两个步骤,前向计算误差,然后反向求导更新w。 

完整的代码如下:

import numpy as np

def nonlin(x,deriv=False):

    if(deriv==True):

        return x*(1-x)

    return 1/(1+np.exp(-x))

X = np.array([[0,0,1],

            [0,1,1],

            [1,0,1],

            [1,1,1]])

y = np.array([[0],

            [1],

            [1],

            [0]])

np.random.seed(1)

# randomly initialize our weights with mean 0

syn0 = 2*np.random.random((3,5)) - 1

syn1 = 2*np.random.random((5,1)) - 1

for j in xrange(60000):

    # Feed forward through layers 0, 1, and 2

    l0 = X

    l1 = nonlin(np.dot(l0,syn0))

    l2 = nonlin(np.dot(l1,syn1))

    # how much did we miss the target value?

    l2_error = y - l2

    if (j% 10000) == 0:

        print "Error:" + str(np.mean(np.abs(l2_error)))

    # in what direction is the target value?

    # were we really sure? if so, don't change too much.

    l2_delta = l2_error*nonlin(l2,deriv=True)

    # how much did each l1 value contribute to the l2 error (according to the weights)?

    l1_error = l2_delta.dot(syn1.T)

    # in what direction is the target l1?

    # were we really sure? if so, don't change too much.

    l1_delta = l1_error * nonlin(l1,deriv=True)

    syn1 += l1.T.dot(l2_delta)

    syn0 += l0.T.dot(l1_delta)

print l2

运行的结果为:

Error:0.500628229093

Error:0.00899024507125

Error:0.0060486255435

Error:0.00482794013965

Error:0.00412270116481

Error:0.00365084766242

# 这一部分是最后的输出结果

[[ 0.00225305]
[ 0.99723356]
[ 0.99635205]
[ 0.00456238]]

如果上面的代码看懂了,那么你就可以自己搭建自己的神经网络了,无论他是多少层,或者每个层有多少个神经元,都能很轻松的完成。当然上面搭建的神经网络只是一个很简单的网络,同样还有许多的细节需要学习,比如说反向传回来的误差我们可以用随机梯度下降的方法去更新W,同时还可以加上偏置项b,还有学习率 α 等问题。

雷锋网相关文章:

不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)

如何在 i5 上实现 20 倍的 Python 运行速度?

详解 Kaggle 房价预测竞赛优胜方案:用 Python 进行全面数据探索

雷锋网版权文章,未经授权禁止转载。详情见。


一篇文章教你用 11 行 Python 代码实现神经网络


推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • 很多时候在注册一些比较重要的帐号,或者使用一些比较重要的接口的时候,需要使用到随机字符串,为了方便,我们设计这个脚本需要注意 ... [详细]
  • 假设我有两个数组A和B,其中A和B都是mxn.我现在的目标是,对于A和B的每一行,找到我应该在B的相应行中插入A的第i行元素的位置.也就是说,我希望将np.digitize或np. ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
author-avatar
叶子美容美体养生馆os
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有