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

webchat.jpg

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的相关编程方法和技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL server 数据库面试题及答案(实操2)

使用你的名字创建一个数据库 创建表: 数据库中有三张表,分别为student,course,SC(即学生表,课程表,选课表) 问题: --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

python电子相册制作软件_电子相册怎么做

电子相册制作 本文来自#千兆网络有什么用#征稿活动&#xff0c;不断提速的网络给你的生活带来了什么变化&#xff1f;快来参与活动&#xff0c;聊聊你玩转互联网&#xff0c;高速网上冲浪的经历&#xff01;>点击这里查看活动详情< 现在手机的拍照功能日趋强大&#xff0…

java list 范围删除_JAVA中循环删除list中元素(移除list两时间范围外的元素)

印象中循环删除list中的元素使用for循环的方式是有问题的&#xff0c;但是可以使用增强的for循环&#xff0c;然后今天在使用时发现报错了&#xff0c;然后去科普了一下&#xff0c;再然后发现这是一个误区。下面就来讲一讲。。伸手党可直接跳至文末。看总结。。JAVA中循环遍历…

python reduce函数_Python reduce()函数的用法小结

reduce()函数也是Python内置的一个高阶函数。 reduce() 格式&#xff1a; reduce (func, seq[, init()]) reduce()函数即为化简函数&#xff0c;它的执行过程为&#xff1a;每一次迭代&#xff0c;都将上一次的迭代结果&#xff08;注&#xff1a;第一次为init元素&#xff0c;…

Php获取id并提交表单,提交表单后 PHP获取提交内容的实现方法

提交表单后 PHP获取提交内容的实现方法2020-06-14 15:35:24问题&#xff1a;网页上提交表单之后&#xff0c;PHP为什么不能获取提交的内容&#xff1f;然而在老版本的PHP上运行却正常。新版的PHP已经废弃了原来的表单内容处理方式&#xff0c;即不再把提交的表单的内容直接复制…

idea查看一个类的所有子类_java new一个对象的过程中发生了什么

java在new一个对象的时候&#xff0c;会先查看对象所属的类有没有被加载到内存&#xff0c;如果没有的话&#xff0c;就会先通过类的全限定名来加载。加载并初始化类完成后&#xff0c;再进行对象的创建工作。我们先假设是第一次使用该类&#xff0c;这样的话new一个对象就可以…

stringbuilder删除最后一个字符_Java类-StingBuffer,StringBuilder

Java提供了String,StringBuffr,StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法.他们的相同点都是封装字符串;都实现了CharSeqence接口.public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable,CharSequncepublic f…

docker 删除所有镜像_Docker常用命令

&#xfeff;docker 常用命令#查看 Docker 版本 docker version #从 Docker 文件构建 Docker 镜像 docker build -t image-name docker-file-location#运行 Docker 镜像 docker run -d image-name#查看可用的 Docker 镜像 docker images#查看最近的运行容器 docker ps -l#查看所…

php制作学生卡片,PHP基础案例一:展示学生资料卡

一、需求分析&#xff1a;请利用PHP的变量保存学生的姓名、出生日期、所属学科以及学号&#xff0c;最后将该学生的信息输出到网页中显示。其中&#xff0c;在定义学生的出生日期和学号时候&#xff0c;必须满足以下两个条件。1、出生日期为公历&#xff0c;填写格式为YYYY-MM-…

element label动态赋值_基于Element封装可拖动放大缩小的弹窗

ElementUI 自带的对话框组件(el-dialog)没有拖动和最小化的处理&#xff0c;目前业务遇到呼叫弹屏处理&#xff0c;基于el-dialog 再次进行封装下&#xff0c;上篇文章有人说图片换成代码就好了&#xff0c;下面代码部分我就直接放代码了&#xff0c;不再用图片处理了。先看看效…

eeg数据集_运动想象,情绪识别等公开数据集汇总

本文来自脑机接口社区运动影像数据Left/Right Hand MI: http://gigadb.org/dataset/100295Motor Movement/Imagery Dataset: https://www.physionet.org/physiobank/database/eegmmidb/Grasp and Lift EEG Challenge: https://www.kaggle.com/c/grasp-and-lift-eeg-detection/d…

excel批量删除公式保留数据_Excel实用tips(17) – 批量删除隐藏的工作表

大家可能遇到过这种情况&#xff1a;一个几经易手的远古 Excel 表&#xff0c;文件巨大无比&#xff0c;运行极慢&#xff0c;删除数据和公式也无济于事。反复查找原因&#xff0c;才发现表格中有好几十个隐藏的 worksheet&#xff0c;这些 worksheet 大多都是一些草稿表&#…

docker 修改阿里镜像源_使用阿里云容器镜像服务托管私有Docker镜像

一个只用markdown语法编写文章的90后野路子Web架构师&#xff0c;每天都分享一些有用的知识点&#xff0c;欢迎关注&#xff5e;前言概述本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上&#xff0c;以及如何使用镜像加速器来提升获取Docker官方镜像的速度。名…

java 把图片插入窗体,JAVA JFrame窗体添加背景图像的两种方法

首先还是要了解框架JFrame中的层次结构。JFrame中的层次分布及相对关系是:最底层是&#xff1a;JRootPane&#xff1b;第二层是&#xff1a;JlayerPane&#xff1b;最上层就是ContentPane,也正是我们常说的内容面板。所以一般我们拖放的控件就是在ContentPane层上。有了这些常识…

图像识别开源代码_灰度图像着色开源代码

Victory组近期整理了灰度图像着色开源代码&#xff0c;文章刊登于《中国计算机学会计算机视觉专委会简报》2019年第2期上。灰度图像(gray image)是每个像素只有一个采样颜色的图像&#xff0c;即单通道图像&#xff0c;这类图像通常显示为从最暗黑色到最亮的白色的灰度&#xf…

【adb】电脑通过ADB向手机传输文件

具体步骤如下&#xff1a; Step1 下载ADB工具 下载最新版本的 ADB工具 !!! 注意&#xff1a;一定要是最新版本的ADB&#xff0c;否则很可能导致无法识别到手机。 将下载的ADB解压以后的文件如下图所示&#xff1a; Step2 添加环境变量 将 ADB的路径 D:\platformtools &…

git 提交文件_GIT不小心提交了大文件导致提交失败怎么办?

出现问题的原因在commit的时候&#xff0c;我们之前提交的版本里面已经包含了些大文件了&#xff0c;虽然后来在新的提交里面删除了这些大文件&#xff0c;但是之前commit的记录还是存在&#xff0c;所以之后提交还是会失败1) 模拟一下环境&#xff1a;新建仓库并且添加一个 te…

ztree 标准得json数据格式_酷站推荐 - json-c.github.io/json-c - json-c API

json-c.github.io/json-c/http://json-c.github.io/json-c/JSON&#xff1a;JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;。 JSON 是存储和交换文本信息的语法。类似 XML。 JSON 比 XML 更小、更快&#xff0c;更易解析。JSON(JavaScript Object …

qt弹框输入密码_Android仿支付宝密码输入框

实现效果图&#xff1a;实现流程&#xff1a;1、定义6位密码输入View思路&#xff1a;要绘制边框矩形&#xff0c;绘制分割线&#xff0c;绘制圆点。绘制圆的数目要与字符串的长度有关&#xff0c;添加或者删除都要修改字符串&#xff0c;输入6位后就是要关闭弹框&#xff0c;拿…

esc指令检查打印状态_Z.115 胶片自助打印设备

一、概述病人在完成影像检查后&#xff0c;需要快速获取结果&#xff0c;传统的方式是向病人发放胶片和诊断报告&#xff0c;随着大型医院病人检查量的快速增加&#xff0c;这种方式有诸多弊病。自助打印机将胶片和诊断报告打印集成起来&#xff0c;消除时空障碍&#xff0c;实…