本节课我们将来探讨Python和向量化的相关知识。

1. Vectorization

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

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

import numpy as np
import timea = 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")

输出结果类似于:

250286.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库中的内建函数(built-in function)就是使用了SIMD指令。相比而言,GPU的SIMD要比CPU更强大一些。

2. More Vectorization Examples

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

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

3. Vectorizing Logistic Regression

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

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

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

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

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

4. Vectorizing Logistic Regression’s Gradient Output

逻辑回归中的梯度下降算法如何转化为向量化的矩阵形式。对于所有m个样本,dZ的维度是(1,m),可表示为:

db可表示为:

对应的程序为:

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

dw可表示为:

对应的程序为:

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

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

Z = 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循环,表示迭代次数。

5. Broadcasting in Python

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

  1. 让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
  2. 输出数组的shape是输入数组shape的各个轴上的最大值
  3. 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
  4. 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值

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

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

6. A note on python/numpy vectors

接下来我们将总结一些python的小技巧,避免不必要的code bug。

python中,如果我们用下列语句来定义一个向量:

a = np.random.randn(5)

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

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

除此之外,我们还可以使用assert语句对向量或数组的维度进行判断,例如:

assert(a.shape == (5,1))

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

另外,还可以使用reshape函数对数组设定所需的维度:

a.reshape((5,1))

7. Quick tour of Jupyter/iPython Notebooks

Jupyter notebook(又称IPython notebook)是一个交互式的笔记本,支持运行超过40种编程语言。本课程所有的编程练习题都将在Jupyter notebook上进行,使用的语言是python。

8. Explanation of logistic regression cost function(optional)

在上一节课的笔记中,我们介绍过逻辑回归的Cost function。接下来我们将简要解释这个Cost function是怎么来的。

首先,预测输出y^y^的表达式可以写成:

其中,

y^可以看成是预测输出为正类(+1)的概率:

那么,当y=1时:

当y=0时:

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

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

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

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

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


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

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

第二周:神经网络的编程基础之Python与向量化相关推荐

  1. 深度学习笔记第一门课第二周:神经网络的编程基础(上)

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

  2. 第一节课-第二周:神经网络的编程基础(Basics of Neural Network programming)

    二.神经网络的编程基础(Basics of Neural Network programming) 2.1 二分类(Binary Classification) 2.2 逻辑回归(Logistic R ...

  3. 神经网络的编程基础(转自吴恩达)

    第二周:神经网络的编程基础(Basics of Neural Network programming) 文章目录 第二周:神经网络的编程基础(Basics of Neural Network prog ...

  4. 《吴恩达深度学习》学习笔记002_神经网络的编程基础(Basics of Neural Network programming)

    http://www.ai-start.com/dl2017/html/lesson1-week2.html 神经网络的编程基础(Basics of Neural Network programmin ...

  5. 深度学习入门笔记(五):神经网络的编程基础

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  6. c语言从键盘输入千米数,第二章 C语言编程基础.ppt

    第二章 C语言编程基础 习题2 P51-7.8.13.14.16 2.4.8break 语句和continue语句 [例2.19] 输出100 - 200 之间不能被3整除的数. P44 2.4.9循 ...

  7. python可以从大到小循环嘛_无需编程基础,Python从入门到进阶大法

    原标题:无需编程基础,Python从入门到进阶大法

  8. 1.2)深度学习笔记------神经网络的编程基础

    目录 1)Binary Classification 2)Logistic Regression 3)Logistic Regression Cost Function 4)Gradient Desc ...

  9. Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了逻辑回归,以输出概率的形式来处理二分类问题.我们介绍了逻辑回归的Cost function表达式,并使用梯度下降算法来计算最小 ...

最新文章

  1. django2 快速安装指南
  2. CLASS ALV Event
  3. 做百度AI工程师,还要会“相牛”?
  4. JEPaas代码_((列表,表单)刷新列表||刷新表单数据
  5. 前端常见浏览器兼容性问题及解决办法
  6. 水果图像识别:基于 Arduino 和 TensorFlow Lite Micro
  7. HBase数据模型解析和基本的表设计分析
  8. NUC1100 Biorhythms【中国剩余定理】
  9. pspice仿真笔记——spice模型转化
  10. testbench通用模板
  11. Android基础入门教程——9.1 使用SoundPool播放音效(Duang~)
  12. 对西方国家的智能制造研究综述:过去现在和未来
  13. font标签及其属性
  14. 雷达图分析法(转载)
  15. python实现批量图片格式转换
  16. App 抓包提示网络异常怎么破?
  17. 分析力学复习笔记(更新中)
  18. 不推荐二周目跑重复剧情 不推荐开混10,建议开混11,游戏文本的奖励减半并没有生效. 混10=混11+混乱词条 1.经济获取(学自大佬:小小银Salmon【B站号】) 金币获取:刚通关开混乱11,拿主
  19. python办公笔记分享
  20. 《Dreamweaver CS6 完全自学教程》笔记 第十章:表单的使用

热门文章

  1. linux 脚本 整数 赋值,shell基础!!熟悉编程规范与变量
  2. php传中文给Java_完美解决PHP中文乱码(转) - - JavaEye技术网站
  3. kafka 日志相关配置
  4. python 爬虫 包_python爬虫学习之路-抓包分析
  5. *args, **kwargs的用法
  6. 综合素质计算机考点,教师资格证小学综合素质考点及考试真题:信息处理能力...
  7. 双目视觉几何框架详解(玉米专栏8篇汇总)
  8. Python 快速入门
  9. 转:有关常量的知识点
  10. 字符串类型、结构体、共用体、枚举、container宏、内存来源