Vectorization

深度学习算法中,数据量很大,在程序中尽量减少使用loop循环语句,而可以使用向量运算来提高程序运行速度。

向量化(Vectorization)就是利用矩阵运算的思想,大大提高运算速度。例如下面所示在Python中使用向量化要比使用循环计算速度快得多。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21import numpy as np

import time

a = np.random.rand(1000000)

b = np.random.rand(1000000)

tic = time.time()

c = np.dot(a,b)

toc = time.time()

print(c)

print("Vectorized version:" + str(1000*(toc-tic)) + "ms")

c = 0

tic = time.time()

for i in range(1000000):

c += a[i]*b[i]

toc = time.time()

print(c)

print("for loop:" + str(1000*(toc-tic)) + "ms")

输出结果类似于:1

2

3

4250286.989866

Vectorized version:1.5027523040771484ms

250286.989866

For loop:474.29513931274414ms

从程序运行结果上来看,该例子使用for循环运行时间是使用向量运算运行时间的约300倍。因此,深度学习算法中,使用向量化矩阵运算的效率要高得多。

为了加快深度学习神经网络运算速度,可以使用比CPU运算能力更强大的GPU。事实上,GPU和CPU都有并行指令(parallelization instructions),称为Single Instruction Multiple Data(SIMD)。SIMD是单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。SIMD能够大大提高程序运行速度,例如python的numpy库中的内建函数(build-in function) 就是使用了SIMD指令。相比而言,GPU的SIMD要比CPU更强大一些。

More Vectorization Examples

尽量避免使用for循环而使用向量化矩阵运算。在python的numpy库中,我们通常使用np.dot()函数来进行矩阵运算。

我们将向量化的思想使用在逻辑回归算法,尽可能减少for循环,而只使用矩阵运算。值得注意的是,算法最顶层的迭代训练的for循环是不能替换的。而每次迭代过程对J,dw,b的计算是可以直接使用矩阵运算。

Vectorizing Logistic Regression

整个训练样本构成的输入矩阵X的维度是$(n_X,1)$,b是一个常数值,而整个训练忘本构成的输出矩阵Y的维度是(1,m)。利用向量化的思想,所有m个样本的线性输出Z可以用矩阵表示:

在python的numpy库中可以表示为:1

2Z = np.dot(w.T,X) + b

A = sigmoid(Z)

其中,w,T表示w的转置

这样,我们就能够使用向量化矩阵运算代替for循环,对所有m个样本同时运算,大大提高了运算速度。

Vectorizing Logistic Regression’s Gradient Output

再来看逻辑回归中的梯度下降算法如何转化为向量化的矩阵形式。对于所有m个样本,db可表示为:

db可表示为:

对应的程序为:1db=1/m*np.sum(dZ)

dw课表示为:

对应的程序为1dw=1/m*np.dot(X,dZ,T)

这样,我们把整个逻辑回归中的for循环尽可能用矩阵运算代替,对于单次迭代,梯度下降算法流程如下所示:1

2

3

4

5

6

7

8Z=np.dot(w.T,X)+b

A= sigmoid(Z)

dZ= A-Y

dw = 1/m*np.dot(X,dZ.T)

db = 1/m*np.sum(dZ)

w = w - alpha*dw

b = b - alpha*db

其中,alpha是学习因子,决定w和b的更新速度。上述代码只是单次训练更新而言的,外层还需要一个for循环,代表迭代次数。

Broadcasting in Python

下面介绍使用python的另一种技巧:广播(Broadcasting).python中的广播机制可以由下面四条表示:

·让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐

·输出数组的shape是输入数组shape的各轴上的最大值

·如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错

·当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值

简而言之,就是用python中可以对不同维度的矩阵进行四则混合运算,但至少保证有一个维度是相同的。下面给出几个广播的例子,具体细节可参阅python的相关手册,这里就不赘述了。

在python程序中为了保证矩阵运算正确,可以使用reshape()函数来对矩阵设定所需的维度。这是一个很好且有用的习惯。

A note on python/numpy vectors

总结一些python的小技巧,避免不必要的code bug

python中,如果我们用下列语句来定义一个变量:1a = np.random.randn(5)

这条语句生成的a维度是(5, )。它既不是行向量也不是列向量,我们把a叫做rank 1 array。这种定义会带来一些问题。例如我们对a进行转置,还会得到a本身。所以,如果我们要定义(5,1)的列向量,最好使以下标准语句,避免使用rank 1 array。1

2a = np.random.randn(5,1)

b = np.random.randn(1,5)

除此之外,我们还可以使用assert语句对向量或者数组的维度进行判断,例如:1assert(a.shape == (5,1))

assert语句会对内嵌语句进行判断,即判断a的维度是不是(5,1)的。如果不是,则程序在此处停止。使用assert语句也是一种很好的习惯,能够帮我们及时检查、发现语句是否正确。

另外,还可以使用reshape函数对数组设定所需的维度:1a.shape((5,1))

Quick tour of Jupyter/iPython Notebooks

Jupyter notebook是一个交互笔记本,支持运行40中编程语言,本课程所有的编程练习题都将在Jupyter notebook上进行,使用语言是python。

Explanation of logistic regression cost function(optional)

接下来简要介绍逻辑回归的Cost function是怎么来的

首先,预测输出$hat{y}$的表达式可以写成:

其中,$sigma(z)=frac{1}{1+exp(-z)}$。$hat{y}$可以看成是预测输出为正类(+1)的概率:

那么,当y=1时:

当y= 0时:

我们把上面两个式子整合到一个式子中,得到:

由于log函数的单调性,可以对上式P(y|x)进行log处理

我们希望上述概率P(y|x)越大越好,对上式加上负号,则转化成额单个样本的Loss function,越小越好,也iu得到了我们之前介绍的逻辑回归的Loss function形式

如果对于所有m个训练样本,假设样本之间是独立同分布的(iid),我们希望总的概率越大越好:

同样引入log函数,加上负号,将上式转化为Cost function:

上式中,$frac{1}{m}$表示对所有m个样本的Cost function求平均,是缩放因子。

Summary

本节课我们主要介绍了神经网络基础————python和向量话。在深度学习程序中,使用向量化和矩阵运算的方法能够大大提高运行速度,节省时间。以逻辑回归威力,我们将算法流程包括梯度下降转化为向量化的形式,同时,我们也介绍了python的相关编程方法和技巧。

python向量化编程技巧_神经网络基础之Python与向量化相关推荐

  1. python语言有几种编程方式_零基础自学python语言,有哪几种方法?龟叔说:这套教程带你入门...

    第一我要说的是:你应该先了解python语言的起源,这句话对于自学python的小白来说,本身就是耍流氓. 我们从根源上分析这个问题,这个问题是(从零基础如何自学python编程)? 我的提取关键字: ...

  2. python脚本编程实例_面向ArcGIS的Python脚本编程.pdf

    [实例简介] 面向ArcGIS的Python脚本编程,最实用的教程. 面向ArcGIS的Python脚本编程,最实用的教程. 面向ArcGIS的Python脚本编程,最实用的教程. 目录 第一部分Py ...

  3. python培训一般多久_零基础学python需要多久

    一:明确自己的学习目标.不管我们学习什么样的知识,都要对自己的学习目标有一个明确的认识.只有这样才能朝着目标持续的前进,少走弯路,从而在学习的过程中得到提升,享受整个学习的乐趣. 二:基础的Pytho ...

  4. python赋值运算符难理解_零基础学 Python(8)运算符 — 算术、比较、赋值、逻辑...

    Python 的运算符有:算术运算符.比较运算符.赋值运算符.逻辑运算符.成员运算符.位运算符.身份运算符.本章主要讲解 Python 的算术运算符.比较运算符.赋值运算符.逻辑运算符. 算术运算符 ...

  5. python派森编程软件_《派森》(Python)

    Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务.它的语法非 ...

  6. python积木编程软件_最新海龟编辑器(Python编辑器)v0.6.1 官方版下载地址电脑版-锐品软件...

    海龟编辑器是编程猫推出的一款Python编辑器,专门针对少儿Python学习,让孩子通过简单的方式,爱上Python,学会Python,软件界面简洁,使用方便,想要快速学习Python的用户,不妨试试 ...

  7. python 少儿趣味编程下载_零基础学Python编程(少儿趣味版)

    本书是一本少儿编程入门书,适合零基础的读者.本书以"派森号"飞船和西西船长等人的童话故事为载体,从头开始介绍了Python语言的基础语法.全书共有6个章节.每章都有约十个独立的内容 ...

  8. python高级编程知识点_(转)python 高级编程技巧学习笔记

    转自https://www.jianshu.com/p/104cec085611,部分图出不来,mark一下,关键时候供查看. 第二章 数据结构相关话题 2.1.筛选数据 两种方式 filter函数: ...

  9. python最简易入门_零基础入门python,用最简单的方式即可入门python,没有那么复杂...

    python已经开始被越来越多的人喜欢,其中有很多是从未学习过编程的人,那么,如果是从零开始学python的话,会很难吗? 其实从零开始学python并不会很难,最简单的方法,往往最有效果,无论你是否 ...

最新文章

  1. AI 被当做炒作工具?
  2. windows 连Linux,Windows下访问Linux资源
  3. 什么是折线图?怎样用Python绘制?怎么用?终于有人讲明白了(附代码)
  4. 中国AI创新者论坛将于3月21日在清华大学举办
  5. Python 技巧篇-如何避免python报错导致强制关闭窗口
  6. 汇编 debug调试没有执行对应文件源码指令---》失灵---》正确使用debug第一步
  7. Idea:新版本Idea底部工具栏Git中没有Local Changes
  8. C#语言对AutoCAD二次开发(二)
  9. 前端对页面中的 checked 选中状态的展示
  10. 影响中国信息化全面预算管理的十大案例
  11. 以前的我们——那年大一
  12. Mac邮件客户端(Edison Mail)的功能特点
  13. 如何去掉复制mobi文件代码里的一些符号
  14. 名品极选联合大牌美妆,全面拓展消费需求
  15. chapter3 转录组学
  16. 6-7 学生成绩比高低
  17. Android 个人中心界面实现
  18. nextdate函数 c语言,【Nextdate|Nextdate函数的黑盒测试】
  19. CentOS8部署多版本共存Python开发环境
  20. shopapi总显示服务器异常,Shopee虾皮官方资料:打开API、串接API的常见问题与解答...

热门文章

  1. SpringBoot整合阿里云OSS文件上传、下载、查看、删除
  2. rmi远程反序列化rce漏洞_Apache Dubbo Provider默认反序列化远程代
  3. 频率统计表用c语言_空间矢量脉宽调制建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)...
  4. python爬虫和八爪鱼哪个快_【后端开发】python爬虫和八爪鱼哪个快
  5. ubuntu系统下Jenkins和tomcat的安装与配置
  6. ubuntu安装mysql5.7.17_ubuntu 16.04安装mysql-server_5.7.17
  7. sdp ddp内存怎么分_旗舰手机跑分66万+,缩短与PC差距,手机成生产力工具也许不是梦...
  8. 计算机核心手稿,梁思成建筑手稿曝光:在没有计算机的年代,他的认真细致令人敬佩...
  9. 从sqlite 迁移 mysql_将 Ghost 从 SQLite3 数据库迁移到 MySQL 数据库
  10. 解决win10使用GPU跑程序遇到的一系列报错