一个神经网络类

我们在神经网络教程的前一章中学到了关于权重的最重要的事实。我们看到了它们的使用方式以及如何在 Python 中实现它们。我们看到,通过应用矩阵乘法,可以使用 Numpy 中的数组完成权重与输入值的乘法。

然而,我们没有做的是在真实的神经网络环境中测试它们。我们必须先创造这个环境。我们现在将在 Python 中创建一个类,实现一个神经网络。我们将分步进行,以便一切都易于理解。

我们班级需要的最基本的方法是:

  • __init__ 初始化一个类,即我们将设置每一层的神经元数量并初始化权重矩阵。
  • run:一种应用于我们想要分类的样本的方法。它将此样本应用于神经网络。我们可以说,我们“运行”网络以“预测”结果。此方法在其他实现中通常称为predict.
  • train: 该方法获取一个样本和对应的目标值作为输入。如有必要,它可以通过此输入调整重量值。这意味着网络从输入中学习。从用户的角度来看,我们“训练”了网络。在sklearn例如,这种方法被称为fit

我们将把trainandrun方法的定义推迟到以后。权重矩阵应该在__init__方法内部初始化。我们是间接这样做的。我们定义一个方法create_weight_matrices并在__init__. 这样,init 方法就清晰了。

我们还将推迟向层添加偏置节点。

以下 Python 代码包含应用我们在前一章中得出的知识的神经网络类的实现:

导入 numpy的  NP
 scipy.stats 导入 truncnormdef  truncated_normal ( mean = 0 ,  sd = 1 ,  low = 0 ,  upp = 10 ): return  truncnorm ( ( low  -  mean )  /  sd ,  ( upp  -  mean )  /  sd ,  loc = mean ,  scale = sd ) 神经网络def  __init__ ( self ,  no_of_in_nodes ,  no_of_out_nodes ,  no_of_hidden_​​nodes , learning_rate ): self 。no_of_in_nodes  =  no_of_in_nodes self 。no_of_out_nodes  =  no_of_out_nodes  self 。no_of_hidden_​​nodes  =  no_of_hidden_​​nodes self 。learning_rate  =  learning_rate   self . create_weight_matrices ()def  create_weight_matrices ( self ): rad  =  1  /  np 。SQRT (自我。no_of_in_nodes )X  =  truncated_normal (平均值= 0 , SD = 1 , 低= -弧度, UPP =弧度)自我。weights_in_hidden  =  X 。RVS ((自我。no_of_hidden_​​nodes , 自我。no_of_in_nodes )) rad  =  1  /  np 。SQRT (自我。no_of_hidden_​​nodes )X  =  truncated_normal (平均值= 0 , SD = 1 , 低= -弧度, UPP =弧度)自我。weights_hidden_​​out  =  X 。RVS ((自我。no_of_out_nodes , 自我。no_of_hidden_​​nodes ))def  train ( self ):通过def  run ( self ):通过

我们不能用这段代码做很多事情,但我们至少可以初始化它。我们也可以看看权重矩阵:

simple_network  =  NeuralNetwork (no_of_in_nodes  =  3 , no_of_out_nodes  =  2 , no_of_hidden_​​nodes  =  4 ,learning_rate  =  0.1 )
打印(simple_network 。weights_in_hidden )
打印(simple_network 。weights_hidden_​​out )

输出:

[[-0.38364195 0.22655694 0.08684721][ 0.2767437 0.28723294 -0.27309445][ 0.25638328 -0.34340133 -0.37399997][-0.1468639 0.54354951 0.08970088]]
[[ 0.34758695 0.41193854 -0.02512014 0.4407185 ][ 0.21963126 0.37803538 0.40223143 0.13695252]]

激活函数、Sigmoid 和 ReLU

在我们对run方法进行编程之前,我们必须处理激活函数。我们在神经网络的介绍章节中有下图:

感知器的输入值由求和函数处理,然后是激活函数,将求和函数的输出转换为所需的更合适的输出。求和函数意味着我们将有一个权重向量和输入值的矩阵乘法。

神经网络中使用了许多不同的激活函数。可以在 Wikipedia 上找到对可能的激活函数的最全面的概述之一。

sigmoid 函数是常用的激活函数之一。我们使用的 sigmoid 函数也称为 Logistic 函数。

它被定义为

σ(X)=11+电子-X

让我们看一下 sigmoid 函数的图形。我们使用 matplotlib 绘制 sigmoid 函数:

import  numpy  as  np 
import  matplotlib.pyplot  as  plt 
def  sigma ( x ): return  1  /  ( 1  +  np . exp ( - x ))X  =  np 。linspace ( - 5 ,  5 ,  100 )PLT 。绘图( X ,  sigma ( X ), 'b' )
plt 。xlabel ( 'X 轴' )
plt 。ylabel ( 'Y 轴' )
plt 。标题('Sigmoid 函数' )PLT 。网格()PLT 。文本( 2.3 ,  0.84 ,  r '$\sigma(x)=\frac {1} {1+e^{-x}}$' ,  fontsize = 16 )PLT 。显示()

查看图表,我们可以看到 sigmoid 函数将给定的数字映射x到 0 到 1 之间的数字范围内。不包括 0 和 1!随着 的值x变大,sigmoid 函数的值越来越接近 1,随着xsigmoid 函数的值越来越小,sigmoid 函数的值越来越接近 0。

除了我们自己定义 sigmoid 函数之外,我们还可以使用来自 的 expit 函数scipy.special,它是 sigmoid 函数的一个实现。它可以应用于各种数据类,如 int、float、list、numpy、ndarray 等。结果是一个与输入数据 x 形状相同的 ndarray。

 scipy.special 进口 expit
打印(expit (3.4 ))
打印(expit ([ 3 , 4 , 1 ))
打印(expit (NP 。阵列([ 0.8 , 2.3 , 8 ])))

输出:

0.9677045353015494
[0.95257413 0.98201379 0.73105858]
[0.68997448 0.90887704 0.99966465]

在神经网络中经常使用逻辑函数来在模型中引入非线性并将信号映射到指定的范围,即 0 和 1。它也很受欢迎,因为在反向传播中需要的导数很简单。

σ(X)=11+电子-X

及其衍生物:

σ′(X)=σ(X)(1-σ(X))

import  numpy  as  np 
import  matplotlib.pyplot  as  plt 
def  sigma ( x ): return  1  /  ( 1  +  np . exp ( - x ))X  =  np 。linspace ( - 5 ,  5 ,  100 )PLT 。绘图(X , 西格玛(X ))
plt 。绘图( X ,  sigma ( X )  *  ( 1  -  sigma ( X )))PLT 。xlabel ( 'X 轴' )
plt 。ylabel ( 'Y 轴' )
plt 。标题('Sigmoid 函数' )PLT 。网格()PLT 。文本( 2.3 ,  0.84 ,  r '$\sigma(x)=\frac {1} {1+e^{-x}}$' ,  fontsize = 16 )
plt 。文本( 0.3 ,  0.1 ,  r '$\sigma \' (x) = \sigma(x)(1 - \sigma(x))$' ,  fontsize = 16 )PLT 。显示()

我们还可以使用来自 numpy 的装饰器 vectorize 定义我们自己的 sigmoid 函数:

@np 。矢量化
DEF 乙状结肠(X ):返回 1  /  (1  +  NP 。ë  **  - X )#sigmoid = np.vectorize(sigmoid) 
sigmoid ([ 3 ,  4 ,  5 ])

输出:

数组([0.95257413,0.98201379,0.99330715])

另一个易于使用的激活函数是 ReLU 函数。ReLU 代表整流线性单元。它也称为斜坡函数。它被定义为其论点的积极部分,即是=最大限度(0,X). 这是“目前,最成功和最广泛使用的激活函数是整流线性单元 (ReLU)” 1 ReLu 函数在计算上比 Sigmoid 类函数更高效,因为 Relu 意味着只选择 0 和参数 之间的最大值x。而 Sigmoids 需要执行昂贵的指数运算。

# 替代激活函数
def  ReLU ( x ): return  np . 最大值( 0.0 ,  x )# relu 的推导
def  ReLU_derivation ( x ): if  x  <=  0 : return  0 else : return  1
导入 numpy 作为 np
导入 matplotlib.pyplot 作为 pltX  =  np 。linspace (- 5 , 6 , 100 )
PLT 。绘图( X ,  ReLU ( X ), 'b' )
plt 。xlabel ( 'X 轴' )
plt 。ylabel ( 'Y 轴' )
plt 。标题('ReLU 函数' )
plt 。网格()
plt 。文本( 0.8 ,  0.4 , r '$ReLU(x)=max(0, x)$' ,  fontsize = 14 )
plt 。显示()

添加运行方法

我们现在拥有一切来实现我们的神经网络类的run(或predict)方法。我们将scipy.special用作激活函数并将其重命名为activation_function

from  scipy.special  import  expit  as  activation_function

我们在该run方法中要做的所有事情包括以下内容。

  1. 输入向量和 weights_in_hidden 矩阵的矩阵乘法。
  2. 将激活函数应用于步骤 1 的结果
  3. 步骤 2 的结果向量和 weights_in_hidden 矩阵的矩阵乘法。
  4. 得到最终结果:将激活函数应用于 3 的结果
 scipy.special import expit as activation_function from scipy.stats import truncnorm导入numpy 作为 npdef  truncated_normal ( mean = 0 ,  sd = 1 ,  low = 0 ,  upp = 10 ): return  truncnorm ( ( low  -  mean )  /  sd ,  ( upp  -  mean )  /  sd ,  loc = mean ,  scale = sd ) 神经网络def  __init__ ( self ,  no_of_in_nodes ,  no_of_out_nodes ,  no_of_hidden_​​nodes , learning_rate ): self 。no_of_in_nodes  =  no_of_in_nodes self 。no_of_out_nodes  =  no_of_out_nodes self 。no_of_hidden_​​nodes  =  no_of_hidden_​​nodes self 。learning_rate  =  learning_rate  self . create_weight_matrices ()def  create_weight_matrices ( self ): """ 一种初​​始化神经网络权重矩阵的方法""" rad  =  1  /  np . SQRT (自我。no_of_in_nodes )X  =  truncated_normal (平均值= 0 , SD = 1 , 低= -弧度, UPP =弧度)自我。weights_in_hidden  =  X 。房车((自我。no_of_hidden_​​nodes , self 。no_of_in_nodes )) rad  =  1  /  np 。SQRT (自我。no_of_hidden_​​nodes )X  =  truncated_normal (平均值= 0 , SD = 1 , 低= -弧度, UPP =弧度)自我。weights_hidden_​​out  =  X 。RVS ((自我。no_of_out_nodes , 自我。no_of_hidden_​​nodes ))def  train ( self ,  input_vector ,  target_vector ):通过def  run ( self ,  input_vector ): """
        使用输入向量 'input_vector' 运行网络
        。'input_vector' 可以是元组、列表或 ndarray 
        """ # 将输入向量转换为列向量input_vector  =  np 。数组(input_vector , ndmin = 2 )。T input_hidden  =  activation_function ( self . weights_in_hidden  @  input_vector ) output_vector  =  activation_function( self . weights_hidden_​​out  @  input_hidden )返回 output_vector

我们可以实例化这个类的一个实例,这将是一个神经网络。在以下示例中,我们创建了一个具有两个输入节点、四个隐藏节点和两个输出节点的网络。

simple_network  =  NeuralNetwork (no_of_in_nodes = 2 , no_of_out_nodes = 2 , no_of_hidden_​​nodes = 4 ,learning_rate = 0.6 )

我们可以将 run 方法应用于所有形状为 (2,) 的数组,以及具有两个数字元素的列表和元组。调用的结果由权重的随机值定义:

simple_network 。运行([( 3 ,  4 )])

输出:

数组([[0.62128186],[0.58719777]])

脚注

1拉马钱德兰,普拉吉特;巴雷特,佐夫;Quoc, V. Le(2017 年 10 月 16 日)。

用 Python 运行神经网络相关推荐

  1. python 神经网络_推荐 :用Python实现神经网络(附完整代码)!

    Datawhale干货   作者:[美]霍布森·莱恩,科尔·霍华德 在学习神经网络之前,我们需要对神经网络底层先做一个基本的了解.我们将在本节介绍感知机.反向传播算法以及多种梯度下降法以给大家一个全面 ...

  2. python跑神经网络_程序员深夜用Python跑神经网络,只为用中二动作关掉台灯!

    原标题:程序员深夜用Python跑神经网络,只为用中二动作关掉台灯! 关注 文章源于网络,如有侵权请联系删除. 对于上了床就再也不想下来的人来说,关灯成为睡觉前面临的最大挑战! 然而这一届网友永远不会 ...

  3. python实现简单的神经网络,python实现神经网络算法

    如何用9行Python代码编写一个简易神经网络 学习人工智能时,我给自己定了一个目标--用Python写一个简单的神经网络.为了确保真得理解它,我要求自己不使用任何神经网络库,从头写起.多亏了Andr ...

  4. 转:用Psyco让Python运行得像C一样快

    Python 的设计在很多方面都类似于 Java 的设计.两者都利用了解释专门的伪编译字节码的虚拟机.JVM 比 Python 更高级的一个方面在于优化了字节码的执行.Psyco,一种 Python ...

  5. 用Python实现神经网络(附完整代码)!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:[美]霍布森·莱恩,科尔·霍华德 在学习神经网络之前,我们需要对神 ...

  6. python手机代码识别数字_利用python构建神经网络识别手写数字(附源代码)

    一.运行环境配置 本次实验的运行环境win10(bit64),采用python环境为3.7.6,安装Python环境推荐使用Anaconda.Anaconda是一个免费开源的Python和R语言的发行 ...

  7. Python运行的17个时新手常见错误小结

    Python运行的17个时新手常见错误小结 1 发布时间:『 2017-11-04 11:20 』     帖子类别:『人工智能』  阅读次数:8803 (本文『Python运行的17个时新手常见错误 ...

  8. python制作神经网络_python_deeplearning02_使用python制作神经网络

    20180421 qzd ch02 - 使用python制作神经网络 构建框架 初始化函数 -- 设定输入层节点.隐藏层节点和输出层节点的数量. 训练 -- 学习给定训练集样本后,优化权重(权重--网 ...

  9. 深度学习与计算机视觉:基于Python的神经网络的实现

    在前面两篇文章介绍了深度学习的一些基本概念,本文则使用Python实现一个简单的深度神经网络,并使用MNIST数据库进行测试. 神经网络的实现,包括以下内容: 神经网络权值的初始化 正向传播 误差评估 ...

最新文章

  1. linux-xargs
  2. UI-- Empty Application 新建空工程
  3. 涌之势,智造未来, 戴尔科技集团携新一代信息技术解决方案赋能“新基建”
  4. WinRAR(WinZip)压缩与解压实现(C#版Window平台)
  5. 沉淀再出发:PHP的中级内容
  6. lincode 题目记录6
  7. 服务器安装rabbitmq教程
  8. 在Windows 10中使用TortoiseGit进程gitlab仓库的管理
  9. SIP Servlet开发环境配置
  10. 迷宫(Maze)项目实现
  11. 全球各大主流卫星拍摄到的苏伊士运河货轮画面,看看哪个最清晰
  12. 各省数字普惠金融指数(2015-2019年)
  13. 东南大学提出条件自监督小样本学习方法,显著提升小样本分类准确率
  14. 番茄看看 阅读微信公众号文章赚钱任务
  15. 电子学会2022年6月青少年软件编程(图形化)等级考试试卷(二级)答案解析
  16. python 银行_python 银行系统
  17. python pop() ,如何在Python的列表或数组中移除元素
  18. 活字格低代码开发平台怎么样?靠谱吗?
  19. [转]latex插入参考文献出现错误Missing $ inserted,Missing } inserted
  20. 【Python】写一个程序,判断给定年份是否为闰年。

热门文章

  1. Tensorrtx+yolov5+windows10+vs2015+cuda11.1关键问题及步骤记录
  2. ACC自适应巡航和定速巡航的区别
  3. fni matlab,使用Matlab求解Van Der Pol方程的方法研究
  4. python中的map什么意思啊_python中的map怎么使用(方法详解)
  5. 【11年华科计算机考研经验】追梦华中大-我的漫漫考研路
  6. React之HOC(高阶组件)
  7. 【Vue】组件间传值的三种方式:父传子,子传父,非父子传值
  8. 鸿蒙3部曲先看哪部,“斗罗”有四作,那当年齐名的“鸿蒙”系列到底有“几部曲”?...
  9. 东南大学和南京大学的计算机哪个好考,江苏最好的5所211除了南京大学和东南大学2所985,谁是第五有争议...
  10. param name=allowScriptAccess value=never/是什么意思