神经网络基础之Python与向量化

1. 向量化

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

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

numpy中的函数

1.np.random.rand 是 NumPy 库中用于生成随机数的函数,它会生成一个给定形状的数组,数组中的值是从均匀分布 [0, 1)(即 0 到 1 之间,不包括 1)中随机抽取的。

以下是 np.random.rand 的用法说明:

numpy.random.rand(d0, d1, ..., dn)

参数

  • d0, d1, ..., dn:这些是整数参数,表示生成数组的维度大小。如果不传入任何参数,则返回一个随机浮点数。

返回值

  • 返回一个形状为 (d0, d1, ..., dn) 的数组,数组中的元素是从 [0, 1) 均匀分布中随机抽取的浮点数。

2.np.dot 是 NumPy 库中用于计算两个数组的点积(或矩阵乘法)的函数。它是一个非常强大的工具,广泛应用于线性代数、机器学习和数据科学中。

以下是 np.dot 的详细用法和一些示例。

numpy.dot(a, b, out=None)

参数:

  • a:第一个输入数组。
  • b:第二个输入数组。
  • out:可选参数,指定输出数组的存储位置。如果省略,则返回一个新的数组。

返回值:

  • 返回两个输入数组的点积结果。返回值的形状取决于输入数组的形状。

点积的定义

  • 对于一维数组,np.dot 计算的是两个数组的内积(标量积)。
  • 对于二维数组,np.dot 计算的是两个矩阵的乘积。
  • 对于多维数组,np.dot 计算的是最后一个维度的内积。

In [3]:

import numpy as np
import time as t a = np.random.rand(1000000)
b = np.random.rand(1000000) tic = t.time()
c = np.dot(a,b)
toc = t.time()
print(c)
print("向量版本:"+str(1000*(toc-tic))+"ms") c = 0
tic = t.time()
for i in range(100000):
c += a[i]*b[i]
toc = t.time()
print(c)
print("for循环版本:"+str(1000*(toc-tic))+"ms")
249795.201309535
向量版本:0.9977817535400391ms
25059.948516792043
for循环版本:73.84777069091797ms

③ 从程序运行结果上来看,该例子使用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循环而使用向量化矩阵运算。在python的numpy库中,我们通常使用np.dot()函数来进行矩阵运算。

② 我们将向量化的思想使用在逻辑回归算法上,尽可能减少for循环,而只使用矩阵运算。

③ 值得注意的是,算法最顶层的迭代训练的for循环是不能替换的。而每次迭代过程对J,dw,b的计算是可以直接使用矩阵运算。

2. 逻辑回归向量化

① 我们前面介绍过,整个训练样本构成的输入矩阵X的维度是(\(n\_{x}\),m),权重矩阵w的维度是(\(n\_{x}\),1),b是一个常数值,而整个训练样本构成的输出矩阵Y的维度为(1,m)。

② 利用向量化的思想,所有m个样本的线性输出Z可以用矩阵表示:

③ 在python的numpy库中可以如下表示,其中,w.T表示w的转置。

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

3. 逻辑回归向量化梯度下降

① 再来看逻辑回归中的梯度下降算法如何转化为向量化的矩阵形式。

② 对于所有m个样本,dZ的维度是(1,m),可表示为:

③ db可表示为:

④ 对应的程序为:

⑤ dw可表示为:

⑥ 对应的程序为:

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

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

4. Python广播

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

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

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

③ 下面给出几个广播的例子,具体细节可参阅python的相关手册,这里就不赘述了。

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

5. Python小技巧

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

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

③ 这条语句生成的a的维度是(5,)。它既不是行向量也不是列向量,我们把a叫做rank 1 array。

④ 这种定义会带来一些问题。例如我们对a进行转置,还是会得到a本身。

⑤ 所以,如果我们要定义(5,1)的列向量或者(1,5)的行向量,最好使用下来标准语句,避免使用rank 1 array。

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

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

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

6. 逻辑回归损失函数

① 我们介绍过逻辑回归的Cost function。接下来我们将简要解释这个Cost function是怎么来的。

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

③ 那么,当y=1时:

④ 当y=0时:

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

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

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

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

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

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

7. 总结

① 本节课我们主要介绍了神经网络基础——python和向量化。

② 在深度学习程序中,使用向量化和矩阵运算的方法能够大大提高运行速度,节省时间。

③ 以逻辑回归为例,我们将其算法流程包括梯度下降转换为向量化的形式。

④ 同时,我们也介绍了python的相关编程方法和技巧。

第2周2_神经网络基础之Python与向量化的更多相关文章

  1. 吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 2 - Neural Network Basics(第二周测验 - 神经网络基础)

    Week 2 Quiz - Neural Network Basics(第二周测验 - 神经网络基础) 1. What does a neuron compute?(神经元节点计算什么?) [ ] A ...

  2. Andrew Ng - 深度学习工程师 - Part 1. 神经网络和深度学习(Week 2. 神经网络基础)

     =================第2周 神经网络基础=============== ===2.1  二分分类=== ===2.2  logistic 回归=== It turns out, whe ...

  3. 2017寒假零基础学习Python系列之 印子

    今日为2017年2月6日,据在慕课网上学习廖雪峰Python教程也快一周左右了,完全是零基础入门Python,大一上学期粗浅的接触学习了C语言,早就听说过Python语言的大名,又想把Python的爬 ...

  4. D05——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D05 20180815内容纲要: 1 模块 2 包 3 import的本质 4 内置模块详解 (1)time&datetime (2)datetime ...

  5. 深层神经网络框架的python实现

    概述 本文demo非常适合入门AI与深度学习的同学,从最基础的知识讲起,只要有一点点的高等数学.统计学.矩阵的相关知识,相信大家完全可以看明白.程序的编写不借助任何第三方的深度学习库,从最底层写起. ...

  6. 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程

    点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...

  7. 动手学习Pytorch(6)--卷积神经网络基础

    卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充.步幅.输入通道和输出通道的含义.   二维卷积层 本节介绍的是最常见的二维卷积层,常用于处理图像数据.   二维 ...

  8. L15卷积神经网络基础

    卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充.步幅.输入通道和输出通道的含义. 二维卷积层 本节介绍的是最常见的二维卷积层,常用于处理图像数据. 二维互相关运 ...

  9. <-0基础学python.第一课->

    初衷:我电脑里面的歌曲很久没换了,我想听一下新的歌曲,把他们下载下来听,比如某个榜单的,但是一首一首的点击下载另存为真的很恶心 所以我想有没有办法通过程序的方式来实现,结果还真的有,而且网上已经有有人 ...

  10. AI学习---数据IO操作&神经网络基础

    数据IO操作 TF支持3种文件读取:    1.直接把数据保存到变量中    2.占位符配合feed_dict使用    3. QueueRunner(TF中特有的) 文件读取流程 文件读取流程(多线 ...

随机推荐

  1. StringBuilder的介绍、构造方法及成员方法

    1.StringBuilder的介绍 1.StringBuilder是字符串缓冲区,可以认为是一种容器,能装任何类型的数据,但被装入的数据都会变为字符串 如图 无论是什么类型的数据,被装入字符串缓冲区 ...

  2. 可横竖控制的Text bg Control

    using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; [RequireComponent(typeof(Co ...

  3. 使用注解的方式编写:@Aspect运用

    列子. public interface Calculator { // 加 public int add(int i,int j); // 减 public int sub(int i,int j) ...

  4. CentOS linux 安装openssl(openssl拒绝服务漏洞【CVE-2022-0778】解决)

    一.安装 1.下载相关openssl包 下载地址: https://www.openssl.org/source/ 2.将下载好的压缩包放到 /app/server/nginx 路径下(根据自己实际需 ...

  5. Asp.net mvc基础(十四)Entity Framework

    一.EntityFramework介绍 1.ORM:Object Relation Mapping,用操作对象的方式来操作数据库 2.ORM工具有很多,其中Dapper.PetaPoco.NHiber ...

  6. 康谋分享 | ADTF过滤器全面解析:构建、配置与数据处理应用

    在ADTF (Automotive Data and Time-Triggered Framework)中,过滤器(Filter)扮演着数据处理的核心角色.过滤器是处理数据流的基本单元,它们接收.处理 ...

  7. 如何使用 MySQL 的 EXPLAIN 语句进行查询分析?

    如何使用 MySQL 的 EXPLAIN 语句进行查询分析? EXPLAIN 是 MySQL 提供的分析 SQL 查询执行计划的工具,用于了解查询语句的执行过程,帮助优化查询性能. 1. EXPLAI ...

  8. Sentinel——系统规则(系统自适应保护)

    目录 系统自适应保护 系统规则 系统自适应保护 Sentinel 系统自适应保护从整体维度对应用入口流量进行控制,结合应用的 Load.总体平均 RT.入口 QPS 和线程数等几个维度的监控指标,让系 ...

  9. 工具 | todesk最新版设备代码、连接密码读取工具,附下载链接

    工具介绍: todesk最新版读取设备代码.连接密码 工具 下载链接: 下载链接: todesk最新版读取设备代码.连接密码 工具下载 使用说明 工具使用效果如图

  10. K8s新手系列之Secret资源

    概述 官方文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/ 在Kubernetes(k8s)中,Secret是一种用 ...