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

本节课我们将来探讨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的相关编程方法和技巧。

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

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

相关文章

U-boot移槙

1、我是照着这里去移植的 http://blog.chinaunix.net/uid-26306203-id-3716785.html 2、然后make 出现问题,到这里去有解决办法:http://blog.csdn.net/zjt289198457/article/details/6854177 : http://blog.csdn.net/zjt289198457/article/details/68…

不动产中心考试计算机测试题,2005年全国计算机二级考试VFP笔试模拟题

一、选择题(每小题 2 分,共 70分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。(1)下列选项不符合良好程序设计风格的是________。A)源程序要文档化B)数据说明的…

第三周:浅层神经网络

1. 神经网络综述 首先,我们从整体结构上来大致看一下神经网络模型。 前面的课程中,我们已经使用计算图的方式介绍了逻辑回归梯度下降算法的正向传播和反向传播两个过程。如下图所示。神经网络的结构与逻辑回归类似,只是神经网络的层数比逻辑…

嵌入式工程师应该知道的C语言

收集的一些嵌入式软件工程师面试题目 1、将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少bit被置1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数转换为字符串 …

使用二分查找向一个有序数组中插入一个数据

折半查找法找到一个元素在数组中的下标* param arr 数组* param key 要查找的元素* return 找到则返回元素在数组中的下标,如果没找到,则返回这个元素在有序数组中的位置* 如:[1,4,6,7,10,11,15],查找8在数组中的位置,…

西北大学计算机考试,西北大学计算机技术

一、培养目标本专业是为培养适合国家建设需要的、具有严谨科学态度和敬业精神的计算机应用技术人才,通过硕士阶段的培养,应具备扎实的计算机系统的专业知识,了解相关领域的研究动态,熟悉现代化计算机应用技术和软硬件环境及工具。…

智慧交通day00-项目简介

汽车的日益普及在给人们带来极大便利的同时,也导致了拥堵的交通路况,以及更为频发的交通事故。智能交通技术已成为推动现代技术交通技术发展的重要力量,智能交通不仅能够提供实时的交通路况信息,帮助交通管理者规划管理策略&#…

Moblin MID开发学习笔记 - application launcher安装过程

(参照http://test.moblin.org/projects/application-launcher)a) 安装git:在Target下打开Terminal:# apt-get install git-coreb) 安装Genesis:(http://test.moblin.org/projects/genesis-application-lifecycle-manager)在Target下打开Terminal:# cd /usr/src/# git…

智慧交通day01-算法库01:numba

1 numba介绍 numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。 numba使用LLVM编译器架构将纯Python代码生成优化过的机器码,通过一些添加简单的注解,将面向数组和使用大量…

链表c++实现一

#include <iostream>using namespace std; typedef char nodeEntry; struct Node{ //数据成员 nodeEntry data; Node* next; //构建函数 Node(); Node(nodeEntry item,Node* link NULL);}; Node::Node(){ next NULL;} Node::Node(nodeEntry item,Node* link){ data it…

计算机语言恢复,win10系统找回消失不见语言栏的恢复方法

win10系统使用久了&#xff0c;好多网友反馈说关于对win10系统找回消失不见语言栏设置的方法&#xff0c;在使用win10系统的过程中经常不知道如何去对win10系统找回消失不见语言栏进行设置&#xff0c;有什么好的办法去设置win10系统找回消失不见语言栏呢&#xff1f;在这里小编…

MID开发笔记

RK:1 服务器&#xff1a;192.168.1.402 登录服务器命令:ssh softwin192.168.1.40 softwincn&#xff1b;界面在places ->connect to server,选择ssh&#xff0c;输入地址跟密钥即可。3 git中删除分支 git branch -D xxx&#xff0c;git log可以查看更新的信…

智慧交通day01-算法库02:imutils

1.imutils功能简介 imutils是在OPenCV基础上的一个封装&#xff0c;达到更为简结的调用OPenCV接口的目的&#xff0c;它可以轻松的实现图像的平移&#xff0c;旋转&#xff0c;缩放&#xff0c;骨架化等一系列的操作。 安装方法&#xff1a; pip install imutils在安装前应确…

linux 常用操作指令(随时更新)

ls: 查看当前目录下文件列表 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录&#xff0c;包括隐藏的a(all) mkdir 创建目录 -p 创建目录&#xff0c;若无父目录&#xff0c;则创建p(parent) cd 切换目录 touch 创建…

北京中软国际软件测试面试,中软国际软件测试面试题 2012年中软国际软件测试笔试题...

一&#xff0e;简答题&#xff1a;(60分)1. 写出软件测试的基本流程。(2. 分别用等价类划分和边界值方法设计测试用例测试密码域。要求密码必须是数字或字母且必须大于6位小于15位。(6分)3. 用SQL语句查询前十条记录&#xff1f;(6分)4. 什么是唯一索引&#xff0c;非唯一索引&…

16进制数组转字符串

修改函数原型&#xff0c;确保每次malloc后可以释放堆控件 char * HexToString(char *str,unsigned char Hex[],unsigned char lenth) {unsigned char i0,j0;unsigned char tema,temp;//char *str(char*)malloc(lenth*2);for(i0;i<lenth;i){tema(Hex[i]>>4)&0x0F;…

智慧交通day01-算法库03:cv.dnn

1.DNN模块 1.1. 模块简介 OpenCV中的深度学习模块&#xff08;DNN&#xff09;只提供了推理功能&#xff0c;不涉及模型的训练&#xff0c;支持多种深度学习框架&#xff0c;比如TensorFlow&#xff0c;Caffe,Torch和Darknet。 OpenCV那为什么要实现深度学习模块&#xff1f;…

高标清硬盘播出服务器,高标清4通道SDI硬盘播出服务器 XUAPX4000HD

原标题&#xff1a;高标清4通道SDI硬盘播出服务器 XUAPX4000HDXUAP多通道硬盘自动播出系全系统设计 IP/TS/SDI多种播出模式XUAP系统采用先进硬件译码技术的自动播出系统&#xff0c;可依设定时间自动化切换影片与触发连动外围设备&#xff0c;如 矩阵、录像机、切换器 等&#…

行为科学统计第3章

行为科学统计 Statistics for the Behavioral Sciences 人生很累&#xff0c;现在不累&#xff0c;以后更累啦&#xff5e; 第3章 集中趋势 引言&#xff1a;一个平均数最主要的优势是它提供了单个数字&#xff0c;这个数字可以描述整个分布&#xff0c;并且可以被用于与其他分…

linux驱动层获取当前的系统时间

#include <linux/timer.h> #include <linux/timex.h> #include <linux/rtc.h>/*添加到合适位置*/struct timex txc; struct rtc_time tm;do_gettimeofday(&(txc.time));rtc_time_to_tm(txc.time.tv_sec,&tm);printk("UTC time :%d-%d-%d %d:%d…