神经网络基础之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. Pydantic根校验器:构建跨字段验证系统

    title: Pydantic根校验器:构建跨字段验证系统 date: 2025/3/24 updated: 2025/3/24 author: cmdragon excerpt: Pydantic根 ...

  2. Fetch 别名查找

       if (PlanClass.Attributes.Contains("new_excelcolor_avg"))                                ...

  3. C# Socket教程入门,Socket的使用方法,附可执行Demo

    核心: 在服务器端和客户端的两个Socket实例,共同维持一个连接,而我们还需要一个服务端绑定了特定端口号的固定的serverSocket,用来监听远方clientSocket的申请,并为这个申请建立 ...

  4. Maven导包报错Could not resolve dependencies for projectXXX was cached in the local repository....

    问题 将项目和maven仓库一起拿到了内网环境,一直报错无法解析依赖was cached in the local repository, resolution will not be reattem ...

  5. 基于大模型的 RAG 核心开发——详细介绍 DeepSeek R1 本地化部署流程

    前言 自从 DeepSeek 发布后,对 AI 行业产生了巨大的影响,以 OpenAI.Google 为首的国际科技集团为之震惊,它的出现标志着全球AI竞争进入新阶段.从以往单纯的技术比拼转向效率.生 ...

  6. python获取日期(今日、昨日),及格式化日期的方法(datetime)

    在写爬虫的过程中发现,很多网站的信息均以当天日期为链接组成部分,但是格式又不相同 有些是20210328,有些是2021-03-28,还有些2021/03/28 如果一次爬取来源不同网站的信息,需要对 ...

  7. python,循环中通过判断条件中止循环的方法(braek 语句)

    直接对下方代码进行解析 for a in range(5): print(a) if a == 2: break 依次读取range内的数字,并答应出来.当读取出来的数字是2时,结束循环,执行后入下图 ...

  8. 如何在 Java 中进行内存泄漏分析?

    如何在 Java 中进行内存泄漏分析? 内存泄漏是指程序中无法访问的对象仍然被占用内存,导致内存无法回收,最终导致内存不足.程序崩溃等问题.Java 中的内存泄漏通常与垃圾回收机制的工作方式相关,虽然 ...

  9. git rebae -i

    这个命令大体作用就是对本地的commit进行修改,适用于以下情况: 本地历史排查修改 code review后,打回修改 详解 pick,只是意味着包括提交.重新进行命令时,重新安排pick命令的顺序 ...

  10. DPDI(Dispatch PDI)kettle调度管理平台之介入前后的对比剖析

    DPDI(Dispatch PDI)kettle调度管理平台 --介入前后的对比剖析 引言 在数据处理领域,Kettle(Pentaho Data Integration)作为一款广受欢迎的开源ETL ...