作者|Vivek Patel 编译|Flin 来源|towardsdatascience

除非你能学习到一些东西,否则不要重复造轮子。

强大的库已经存在了,如:TensorFlow,PyTorch,Keras等等。我将介绍在Python中创建多层感知器(MLP)神经网络的基本知识。

感知器是神经网络的基本组成部分。感知器的输入函数是权重,偏差和输入数据的线性组合。具体来说:in_j = weight input + bias.(in_j =权重输入+偏差)。在每个感知器上,我们都可以指定一个激活函数g。

激活函数是一种确保感知器“发射”或仅在达到一定输入水平后才激活的数学方法。常见的非线性激活函数为S型,softmax,整流线性单位(ReLU)或简单的tanH。

激活函数有很多选项,但是在本文中我们仅涉及Sigmoid和softmax。

图1:感知器

对于有监督的学习,我们稍后将输入的数据通过一系列隐藏层转发到输出层。这称为前向传播。在输出层,我们能够输出预测y。通过我们的预测y*,我们可以计算误差| y-y | 并使误差通过神经网络向后传播。这称为反向传播。通过随机梯度下降(SGD)过程,将更新隐藏层中每个感知器的权重和偏差。

图2:神经网络的基本结构

现在我们已经介绍了基础知识,让我们实现一个神经网络。我们的神经网络的目标是对MNIST数据库中的手写数字进行分类。我将使用NumPy库进行基本矩阵计算。

在我们的问题中,MNIST数据由 [748,1] 矩阵中的8位颜色通道表示。从本质上讲,我们有一个 [748,1] 的数字矩阵,其始于[0,1,.... 255],其中0表示白色,255表示黑色。

结果

MNIST手写数字数据库包含60,000个用于训练目的的手写示例和10,000个用于测试目的的示例。在对60,000个示例进行了30个epoch的训练之后,我在测试数据集上运行了经过训练的神经网络,并达到了93.2%的准确性。甚至可以通过调整超参数来进一步优化。

它是如何工作的?

本文分为5个部分。这些部分是:

(1)激活函数 (2)权重初始化 (3)偏差初始化 (4)训练算法 (5)进行预测

1. 激活函数

Sigmoid是由等式1 /(1+ exp(-x))定义的激活函数,将在隐藏层感知器中使用。

Softmax是一个激活函数,当我们要将输入分为几类时,它通常在输出层中使用。在我们的例子中,我们希望将一个数字分成10个bucket[0,1,2,…,9]中的一个。它计算矩阵中每个条目的概率;概率将总计为1。具有最大概率的条目将对应于其预测,即0,1,…,9。Softmax定义为exp(x)/ sum(exp(x))。

图3:激活函数的实现

2. 权重初始化

对于我们的每个隐藏层,我们将需要初始化权重矩阵。有几种不同的方法可以做到这一点,这里是4。

  1. 零初始化-初始化所有权重= 0。

  2. 随机初始化-使用随机数初始化权重,而不是完全随机。我们通常使用标准正态分布(均值0和方差1)中的随机数。

  3. Xavier初始化-使用具有设定方差的正态分布中的随机数初始化权重。我们将基于上一层的大小设置方差。

如上所述,进入感知器的边缘乘以权重矩阵。关键的一点是,矩阵的大小取决于当前图层的大小以及它之前的图层。明确地,权重矩阵的大小为[currentLayerSize,previousLayerSize]。

如上所述,进入感知器的边缘乘以权重矩阵。关键的一点是,矩阵的大小取决于当前图层的大小以及它之前的图层。明确地,权重矩阵的大小为[currentLayerSize,previousLayerSize]。

假设我们有一个包含100个节点的隐藏层。我们的输入层的大小为[748,1],而我们所需的输出层的大小为[10,1]。输入层和第一个隐藏层之间的权重矩阵的大小为[100,748]。隐藏层之间的每个权重矩阵的大小为[100,100]。最后,最终隐藏层和输出层之间的权重矩阵的大小为[10,100]。

出于教育目的,我们将坚持使用单个隐藏层;在最终模型中,我们将使用多层。

图4:权重初始化实现

3. 偏差初始化

像权重初始化一样,偏置矩阵的大小取决于图层大小,尤其是当前图层大小。偏置初始化的一种方法是将偏置设置为零。

对于我们的实现,我们将需要为每个隐藏层和输出层提供一个偏差。偏置矩阵的大小为[100,1],基于每个隐藏层100个节点,而输出层的大小为[10,1]。

图5:偏置初始化实现

4. 训练算法

前面已经说过,训练是基于随机梯度下降(SGD)的概念。在SGD中,我们一次只考虑一个训练点。

在我们的示例中,我们将在输出层使用softmax激活。将使用“交叉熵损失”公式来计算损失。对于SGD,我们将需要使用softmax来计算交叉熵损失的导数。也就是说,此导数减少为y* -y,即预测y*减去期望值y。

图6:关于softmax激活的交叉熵损失及其导数

我们还需要编写S型激活函数的导数。在图7中,我定义了S型函数及其衍生函数

图7:Sigmoid函数(上)及其导数(下)

通常,神经网络将允许用户指定几个“超参数”。在我们的实施中,我们将着重于允许用户指定epoch,批处理大小,学习率和动量。还有其他优化技术!

  1. 学习率(LR):学习率是一个参数,用户可以通过它指定网络允许我们学习和更新其参数的速度。选择一个好的学习率是一门艺术。如果LR太高,我们可能永远不会收敛于良好的可接受的训练错误。如果LR太低,我们可能会浪费大量的计算时间。

  2. epoch:epoch是整个训练集中的一个迭代。为了确保我们不会过度拟合早期样本中的数据,我们会在每个时期之后对数据进行随机排序。

  3. 批次大小:通过Epoc2h的每次迭代,我们将分批训练数据。对于批次中的每个训练点,我们将收集梯度,并在批次完成后更新权重/偏差。

  4. 动量:这是一个参数,我们将通过收集过去的梯度的移动平均值并允许在该方向上的运动来加速学习。在大多数情况下,这将导致更快的收敛。典型值范围从0.5到0.9。

下面,我编写了一些通用的伪代码来模拟反向传播学习算法的概况。为了便于阅读,已将诸如计算输出和将训练数据分成批次之类的任务作为注释编写。

现在,我们将展示伪代码的实现.

5. 做出预测

现在,我们仅缺少此实现的一个关键方面。预测算法。在编写反向传播算法的过程中,我们已经完成了大部分工作。我们只需要使用相同的前向传播代码即可进行预测。输出层的softmax激活函数将计算大小为[10,1]的矩阵中每个条目的概率。

我们的目标是将数字分类为0到9。因此,aj2矩阵的索引将与预测相对应。概率最大的索引将由np.argmax()选择,并将作为我们的预测。

结论

这就对了!我们结束了。我们已经用Python编写了神经网络的实现。

但是,我们如何选择最佳参数?我们可以使用算法的一般知识来选择有意义的超参数。我们需要选择能概括但不能过度拟合数据的超参数。我们可以调整动量,学习率,时期数,批处理大小和隐藏节点的数量,以实现我们的目标。向前迈出一步,我们可以编写更多算法来为我们做这件事!

遗传算法是一种AI算法,可用于选择最佳参数。遗传算法的思想是创建一组具有不同参数的子代,并让他们产生与参数相关的测试错误。我们可以对具有最佳超参数的神经网络进行繁殖和变异,以找到性能更好的参数。花费大量时间后,我们将能够学习有关超参数情况的大量知识,并找到新的最佳超参数值。

我们还可以采取其他措施来减少测试错误吗?是的,我们可以缩放输入数据。像许多算法一样,数量更多会对算法的结果产生重大影响。在我们的示例中,数字范围为[0到255]。如果我们按比例缩放数字,使它们的范围从[0到1],则可以减少该偏差。

感谢你的阅读!

原文链接:https://towardsdatascience.com/implementing-a-multi-layer-perceptron-neural-network-in-python-b22b5a3bdfa3

欢迎关注磐创AI博客站: http://panchuang.net/

sklearn机器学习中文官方文档: http://sklearn123.com/

欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

用Python实现多层感知器神经网络相关推荐

  1. keras从入门到放弃(六)多层感知器(神经网络)

    多层感知器(神经网络) 从线性回归模型和对数几率回归模型本质上都是单个神经元 计算输入特征的加权 使用一个激活函数计算输出 单个神经元(二分类) 多和神经元(多分类) 但是单层神经元有缺陷 无法拟合& ...

  2. Python实现多层感知器网络

    资源下载地址:https://download.csdn.net/download/sheziqiong/85657028 神经网络-大作业1:实现多层感知器网络 网络设计 网络结构为单隐层神经网络. ...

  3. Python实现多层感知器MLP(基于双月数据集)

    1.加载必要的库,生成数据集 import math import random import matplotlib.pyplot as plt import numpy as np class mo ...

  4. 使用多层感知器进行图片分类

    文章目录 实验目标 实验要求 实验原理 实验步骤 实验分析 源代码 实验目标 多层感知器(Multi-Layer Perceptron,MLP)也叫人工神经网络(Artificial Neural N ...

  5. 数据代码分享|Python用NLP自然语言处理LSTM神经网络Twitter推特灾难文本数据、词云可视化与SVM,KNN,多层感知器,朴素贝叶斯,随机森林,GBDT对比

    作者:Yunfan Zhang Twitter是一家美国社交网络及微博客服务的网站,致力于服务公众对话.迄今为止,Twitter的日活跃用户达1.86亿.与此同时,Twitter也已成为突发紧急情况时 ...

  6. 神经网络入门回顾(感知器、多层感知器)

    神经网络属于"联结主义",和统计机器学习的理论基础区别还是很不一样. 以我自己的理解,统计机器学习的理论基于统计学,理论厚度足够强,让人有足够的安全感:而神经网络的理论更侧重于代数 ...

  7. 多层感知器用实际例子和Python代码进行解释情绪分析

    多层感知器用实际例子和Python代码进行解释情绪分析 多层感知器是一种学习线性和非线性数据之间关系的神经网络. 这是专门介绍深度学习系列的第一篇文章,深度学习是一组机器学习方法,其根源可以追溯到20 ...

  8. 深度学习(一)多层感知器MLP/人工神经网络ANN

    目录 一.定义和公式 1. 多层感知器 Multi Layer Perceptron MLP 2. MLP实现非线性分类 3. Keras介绍 二. 代码实战 1. 建立MLP模型实现二分类 1.1  ...

  9. 神经网络与机器学习 笔记—多层感知器(MLP)

    多层感知器(MLP) Rosenblatt感知器和LMS算法,都是单层的并且是单个神经元构造的神经网络,他们的局限性是只能解决线性可分问题,例如Rosenblatt感知器一直没办法处理简单异或问题.然 ...

最新文章

  1. 8086为什么不用c语言,现代汇编教材还是基于8086,对理解当今CPU(如i9)有帮助吗,还是教程太滞...
  2. 简单两步就能将 Laravel Log 信息发到其他平台上
  3. Nginx-02:Nginx基本概念
  4. Python中os与sys两模块的区别
  5. Golang类型转化方法汇总
  6. java类怎么实例化_Java类的定义及其实例化
  7. Windows安装梯度提升开发库LightGBM
  8. vue 滑动置顶功能_VUE 实现滚动监听 导航栏置顶的方法_蜡烛_前端开发者
  9. JAR文件句柄:烦恼后清理!
  10. 物体检测的过去、现在和未来
  11. 华为主题包hwt下载_华为主题太丑?修改方式它来了
  12. 制作windows7系统的U盘启动盘
  13. 采样频率,采样率,转换速率
  14. Windows 10家庭版也能共享打印机(上)启用Guest账户
  15. Rasa原文--训练NLU数据
  16. mysql url查找_Superl-url:一款开源、强大的关键词URL采集工具
  17. Laravel—Purifier扩展包防止XSS攻击
  18. 不同的负载电容对晶振的影响
  19. ros语音识别:pocketsphinx_continuous工作正常而gst-pocketsphinx不能识别相同语音的问题。
  20. 中国房地产还能火多久?

热门文章

  1. 2017-2018 2 20179214《网络实践攻防》第三周作业(一)
  2. PPTV智能电视喊来各电视品牌,要用百亿体育IP覆盖1亿终端
  3. 江苏科技大学计算机科学与工程,江苏科技大学
  4. java 剔除节假日_使用java 排除 两个日期段中的 休息日和节假日 。在线等待中十万火急,求大牛帮忙,多谢了。。。。...
  5. 关于orientation
  6. 被动套接字 主动套接字_了解网络套接字及其可能性
  7. iPhone浏览器会把类似手机号或者电话号的一串数字的样式字体改为灰色
  8. 单片机•CPLD/FPGA开发综合实验装置
  9. 2020年煤矿采煤机(掘进机)操作多少分及格及煤矿采煤机(掘进机)操作新版试题
  10. 【2022年4月1日 经验】Microsoft AZ-900 微软认证 网上考试 攻略