从零开始用Python打造自己的神经网络 !

这是一份用于理解深度学习内部运作方式的初学者指南。作者根据自己从零开始学习用 Python 构建神经网络的经验,编写了一份攻略。内容涵盖神经网络定义、损失函数、前向传播、反向传播、梯度下降算法,对于想要了解深度学习运作原理的各位来说,内容精彩不可错过。

动机:为了深入了解深度学习,我决定从零开始构建神经网络,并且不使用类似 Tensorflow 的深度学习库。我相信,对于任何有理想的数据科学家而言,理解神经网络内部的运作方式都非常重要。

本文涵盖了我学到的所有东西,希望你也能从中获益!

什么是神经网络?

大多数介绍神经网络的文章在描述它们时都会提出大脑类比。在不深入研究大脑类比的情况下,我发现简单地将神经网络描述为将给定输入映射到输出的数学函数更容易。

神经网络由以下几个组件组成

  • 一个输入层,x
  • 任意数量的隐藏层
  • 一个输出层,ŷ
  • 每两层之间都有一组权重和偏置,W 和 b
  • 每个隐藏层都要选择一个激活函数 σ。在本文中,我们选用 Sigmoid 激活函数

下图显示了2层神经网络的架构(请注意,在计算神经网络中的层数时,通常会排除输入层)

从零开始用Python打造自己的神经网络 !

进群:960410445  即可获取数十套!

 

2层神经网络的体系结构

在Python中创建神经网络类很容易。

从零开始用Python打造自己的神经网络 !

训练神经网络

简单的2层神经网络的输出是:

从零开始用Python打造自己的神经网络 !

你可能会注意到,在上面的等式中,权重W和偏差b是影响输出的唯一变量ŷ。

当然,权重和偏差的正确值决定了预测的强度。 从输入数据微调权重和偏差的过程称为训练神经网络。

培训过程的每次迭代都包含以下步骤:

计算预测输出ŷ,称为前馈

更新权重和偏差,称为反向传播

下面的顺序图说明了该过程。

从零开始用Python打造自己的神经网络 !

前馈

正如我们在上面的顺序图中看到的,前馈只是简单的计算,对于一个基本的2层神经网络,神经网络的输出是:

从零开始用Python打造自己的神经网络 !

让我们在python代码添加一个前馈函数来做到这一点。 请注意,为简单起见,我们假设偏差为0。

从零开始用Python打造自己的神经网络 !

但是,我们仍然需要一种方法来评估我们预测的“好的程度”(即我们的预测有多好)? 而损失函数能让我们做到这一点。

损失函数

有许多可用的损失函数,我们的问题的性质应该决定了我们选择的损失函数。 在本教程中,我们将使用简单的平方和误差作为我们的损失函数

从零开始用Python打造自己的神经网络 !

也就是说,平方和误差仅仅是每个预测值与实际值之差的总和。 差值是平方的,因此我们测量的是差值的绝对值。

我们的训练目标是找到最佳的权重和偏差集,以最大限度地减少损失函数

反向传播

既然我们已经测量了预测的误差(损失),我们需要找到一种方法来传播误差,并更新权重和偏差。

为了知道调整权重和偏差的合适数量,我们需要知道损失函数相对于权重和偏差的导数。

回想一下微积分函数的导数就是函数的斜率。

从零开始用Python打造自己的神经网络 !

梯度下降算法

如果我们有导数,我们可以通过简单地增加/减少导数来更新权重和偏差(参见上图)。 这就是所谓的梯度下降。

但是,我们不能直接计算损失函数相对于权重和偏差的导数,因为损失函数的方程不包含权重和偏差。 因此,我们需要链规则来帮助我们计算它。

从零开始用Python打造自己的神经网络 !

用于计算损失函数相对于权重的导数的链式法则。注意,为了简单起见,我们只显示了假设1层神经网络的偏导数。

唷!这真难看,但它允许我们得到我们需要的东西——损失函数相对于权重的导数(斜率),以便我们可以相应地调整权重。

现在我们已经有了这个,让我们将反向传播函数添加到python代码中。

从零开始用Python打造自己的神经网络 !

为了更深入地理解微积分和链式法则在反向传播中的应用,我强烈推荐3 blue 1 brown的本教程。

把它们放在一起

现在我们已经有了完整的python代码来进行前馈和反向传播,让我们将神经网络应用到一个例子中,看看它表现如何。

从零开始用Python打造自己的神经网络 !

我们的神经网络应该学习理想的权重集来表示这个函数。请注意,仅仅通过检查来计算权重对我们来说并不是微不足道的。

让我们训练神经网络进行1500次迭代,看看会发生什么。观察下面的每次迭代损失图,我们可以清楚地看到损失单调递减到最小值。这与我们前面讨论的梯度下降算法是一致的。

从零开始用Python打造自己的神经网络 !

让我们看一下1500次迭代后神经网络的最终预测(输出)。

从零开始用Python打造自己的神经网络 !

1500次训练迭代后的预测

我们做到了!我们的前馈和反向传播算法成功地训练了神经网络,预测结果收敛于真实值。

请注意,预测值和实际值略有不同。这是可取的,因为它可以防止过度拟合,并允许神经网络更好地推广到看不见的数据。

下一步是什么?

幸运的是,我们的旅程还没有结束。关于神经网络和深度学习还有很多要学习的。例如:

除了Sigmoid函数,我们还能使用什么其他激活功能

在训练神经网络时使用学习率

使用卷积用于图像分类任务

我很快就会在这主题上写更多内容,所以请关注我的媒体并留意他们!

最后的想法

我从写自己的神经网络中学到了很多东西。

虽然如TensorFlow和Keras的深度学习库可以在不完全了解神经网络内部工作的情况下构建深度网络,但我发现,对于有抱负的数据科学家来说,加深对神经网络的理解是有益的。

这个练习对我来说是一次很大的投入,我希望它对你也有用!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实