文章目录

  • 一、向量化
  • 二、逻辑回归向量化
  • 三、广播
  • 四、 A note on python/numpy vectors
  • 五、逻辑回归损失函数的解释
  • 六、总结

一、向量化

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

向量化(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更强大一些。

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

二、逻辑回归向量化

在《神经网络与深度学习》课程笔记(2)中我们介绍过,整个训练样本构成的输入矩阵X的维度是(nx,m),权重矩阵w的维度是(nx,1),b是一个常数值,而整个训练样本构成的输出矩阵Y的维度为(1,m)。利用向量化的思想,所有m个样本的线性输出Z可以用矩阵表示:Z=wTX+b

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

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

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

对应的程序为:

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

三、广播

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

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

简而言之,就是python中可以对不同维度的矩阵进行四则混合运算,但至少保证有一个维度是相同的。

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

四、 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))

五、逻辑回归损失函数的解释


六、总结

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

《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化相关推荐

  1. 吴恩达深度学习课程笔记(初步认识神经网络)

    吴恩达深度学习课程笔记1 课程主要内容 1.神经网络与深度学习介绍 2.Improving Deep Neural Networks:超参数调整,正则化,优化方法 3.结构化机器学习工程:比如如何分割 ...

  2. 吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究

    吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究 吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究 2.1 为什么要进行实例探究 2.2 经典网络 LeNet-5 AlexNet VGG- ...

  3. 吴恩达-神经网络和深度学习课程-学习心得(一)

    前言: 陆陆续续学完了吴恩达老师在网易云课堂上开设的深度学习工程师微专业的部分内容(01.神经网络与深度学习,04.卷积神经网络,02.改善深层神经网络),在进一步应用实践之前,对之前的学习的内容做个 ...

  4. Deeplearning.ai深度学习课程笔记-在线版

    注意:请点击阅读原文 课程概述 课程视频离线版本可以到github:https://github.com/fengdu78/deeplearning_ai_books 查找下载. 课程地址:https ...

  5. 吴恩达老师的机器学习和深度学习课程笔记打印版

    注意:下载笔记.视频.代码:请点击"阅读原文" 我和同学将吴恩达老师机器学习和深度学习课程笔记做成了打印版,放在github上,下载后可以打印. 公布了深度学习笔记的word和ma ...

  6. 【深度学习】李宏毅2021/2022春深度学习课程笔记 - Deep Learning Task Tips

    文章目录 一.深度学习步骤回顾 二.常规指导 三.训练过程中Loss很大 3.1 原因1:模型过于简单 3.2 原因2:优化得不好 3.3 原因1 or 原因2 ? 四.训练过程Loss小.测试过程L ...

  7. deeplearing.ai 深度学习课程笔记

    deeplearing.ai 深度学习课程笔记 一.神经网络与机器学习 直观理解神经网络.随着神经网络层的加深,所提取的特征(函数)不断组合,最终得到更宏观.更复杂的所需要的特征.简单的例子比如房屋价 ...

  8. 【深度学习】李宏毅2021/2022春深度学习课程笔记 - Convolutional Neural NetWork(CNN)

    文章目录 一.图片分类问题 二.观察图片分类问题的特性 2.1 观察1 2.2 简化1:卷积 2.3 观察2 2.4 简化2:共享参数 - 卷积核 2.5 观察3 2.6 简化3:池化 2.6.1 M ...

  9. 【人工智能】AI技术人才成长路线图;深度学习课程笔记

    人工智能浪潮来袭,开发者应该怎么办?不久前,在"AI生态赋能2018论坛"上,CSDN副总裁孟岩重磅发布了AI技术职业升级指南--<AI技术人才成长路线图>(V1.0) ...

  10. 01.神经网络和深度学习 W3.浅层神经网络

    文章目录 1. 神经网络概览 2. 神经网络的表示 3. 神经网络的输出 4. 多样本向量化 5. 激活函数 6. 为什么需要 非线性激活函数 7. 激活函数的导数 8. 随机初始化 作业 参考: 吴 ...

最新文章

  1. Oracle系统表查询
  2. 在线绘图|差异分析——在线做时序分析
  3. 231 Power of Two 2的幂
  4. 面试字节跳动,我被怼了……
  5. BZOJ-1005-明明的烦恼
  6. 干货 | 仅需10分钟,开启你的机器学习之路!
  7. sklearn自学指南(part13)--贝叶斯回归
  8. java冒泡排序_Java专题(二):Java中常见的排序算法有哪些?---冒泡排序
  9. HDU 5970 CCPC2016合肥 求等差数列整除整数下取整求和
  10. Eclipse发布Web项目
  11. 拓扑量子计算机 超导 光,科学家发现新型拓扑超导材料 有望推动实现拓扑量子计算...
  12. vue2.0分页组件,
  13. 运算放大器分析----虚短和虚断简单计算
  14. 《童梦奇缘-梦幻般的羁绊》第七章-流火
  15. 饥荒控制台输入没用_饥荒控制台怎么用 控制台的使用方法以及代码说明解析...
  16. 这六大要素教会你挑选合适的酒店管理系统
  17. 苹果手机热点总断开怎么办?
  18. 点量云流化具有哪些特色
  19. html个人中心网页,个人中心页面.html
  20. Echache整合Spring缓存实例讲解(转)

热门文章

  1. wait(), notify(), notifyAll()等方法介绍
  2. [Pytorch]PyTorch Dataloader自定义数据读取
  3. 【MySQL】Unknown column 'column_name' in 'field list'
  4. VS 2015 搭建Google Test
  5. 第四章 consul cluster
  6. cocos2dx lua 打印和保存日志
  7. sql server 跨服务器查询数据
  8. [原]tornado源码分析系列(二)[网络层 IOLoop类]
  9. Linux上安装Oracle 10g 装后感
  10. Sharepoint学习笔记--- 快速确定VisualStudio2010当前Project的assembly name