0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python的矩阵传播机制

Linux爱好者 来源:SimpleAI 作者:Beyond 2021-09-30 16:53 次阅读

一、Python的矩阵传播机制(Broadcasting)

我们知道在深度学习中经常要操作各种矩阵(matrix)。

回想一下,我们在操作数组(list)的时候,经常习惯于用**for循环(for-loop)**来对数组的每一个元素进行操作。例如:

my_list = [1,2,3,4]

new_list = []

for each in my_list:

new_list.append(each*2)

print(new_list) # 输出 [2,3,4,5]

如果是矩阵呢:

my_matrix = [[1,2,3,4],

[5,6,7,8]]

new_matrix = [[],[]]

for i in range(2):

for j in range(4):

new_matrix[i].append(my_matrix[i][j]*2)

print(new_matrix)# 输出 [[2, 4, 6, 8], [10, 12, 14, 16]]

实际上,上面的做法是十分的低效的!数据量小的话还不明显,如果数据量大了,尤其是深度学习中我们处理的矩阵往往巨大,那用for循环去跑一个矩阵,可能要你几个小时甚至几天。

Python考虑到了这一点,这也是本文主要想介绍的**“Python的broadcasting”即传播机制**。

先说一句,python中定义矩阵、处理矩阵,我们一般都用numpy这个库。

二、下面展示什么是python的传播机制

import numpy as np# 先定义一个3×3矩阵 A:

A = np.array(

[[1,2,3],

[4,5,6],

[7,8,9]])

print(“A:

”,A)

print(“

A*2:

”,A*2) # 直接用A乘以2print(“

A+10:

”,A+10) # 直接用A加上10

运行结果:

A:

[[1 2 3]

[4 5 6]

[7 8 9]]

A*2:

[[ 2 4 6]

[ 8 10 12]

[14 16 18]]

A+10:

[[11 12 13]

[14 15 16]

[17 18 19]]

接着,再看看矩阵×(+)矩阵:

#定义一个3×1矩阵(此时也可叫向量了)

B = np.array([[10],

[100],

[1000]])

print(“

B:

”,B)

print(“

A+B:

”,A+B)

print(“

A*B:

”,A*B)

运行结果:

B:

[[ 10]

[ 100]

[1000]]

A+B:

[[ 11 12 13]

[ 104 105 106]

[1007 1008 1009]]

A*B:

[[ 10 20 30]

[ 400 500 600]

[7000 8000 9000]]

可见,虽然A和B的形状不一样,一个是3×3,一个是3×1,但是我们在python中可以直接相加、相乘,相减相除也可以。

也许看到这,大家都对broadcasting有感觉了。

用一个图来示意一下:

所谓“传播”,就是把一个数或者一个向量进行“复制”,从而作用到矩阵的每一个元素上。

有了这种机制,那进行向量和矩阵的运算,就太方便了!理解了传播机制,就可以随心所欲地对矩阵进行各种便捷的操作了。

利用numpy的内置函数对矩阵进行操作:

numpy内置了很多的数学函数,例如np.log(),np.abs(),np.maximum()等等上百种。直接把矩阵丢进去,就可以算出新矩阵!示例:

print(np.log(A))

输出把A矩阵每一个元素求log后得到的新矩阵:

array([[0. , 0.69314718, 1.09861229],

[1.38629436, 1.60943791, 1.79175947],

[1.94591015, 2.07944154, 2.19722458]])

再比如深度学习中常用的ReLU激活函数,就是y=max(0,x),

也可以对矩阵直接运算:

X = np.array([[1,-2,3,-4], [-9,4,5,6]])Y = np.maximum(0,X)print(Y)

得到:

[[1 0 3 0] [0 4 5 6]]

更多的numpy数学函数,可以参见文档:https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.math.html

三、定义自己的函数来处理矩阵

其实这才是我写下本文的目的。。。前面扯了这么多,只是做个铺垫(/ω\)

我昨天遇到个问题,就是我要对ReLU函数求导,易知,y=max(0,x)的导函数是:y’ = 0 if x《0y’ = 1 if x》0但是这个y’(x)numpy里面没有定义,需要自己构建。即,我需要将矩阵X中的小于0的元素变为0,大于0的元素变为1。搞了好久没弄出来,后来在StackOverflow上看到了解决办法:

def relu_derivative(x):

x[x《0] = 0

x[x》0] = 1

return x

X = np.array([[1,-2,3,-4],

[-9,4,5,6]])

print(relu_derivative(X))

输出:

[[1 0 1 0]

[0 1 1 1]]

**居然这么简洁就出来了!!!**ミ゚Д゚彡 (゚Д゚#)

这个函数relu_derivative中最难以理解的地方,就是**x[x》0]**了。于是我试了一下:

X = np.array([[1,-2,3,-4],

[-9,4,5,6]])

print(X[X》0])

print(X[X《0])

输出:

[1 3 4 5 6]

[-2 -4 -9]

它直接把矩阵X中满足条件的元素取了出来!原来python对矩阵还有这种操作!

震惊了我好久~

所以可以这么理解,X[X》0]相当于一个“选择器”,把满足条件的元素选出来,然后直接全部赋值。

用这种方法,我们便可以定义各种各样我们需要的函数,然后对矩阵整体进行更新操作了!

四、综上

可以看出,python以及numpy对矩阵的操作简直神乎其神,方便快捷又实惠。其实上面忘了写一点,那就是计算机进行矩阵运算的效率要远远高于用for-loop来运算,

不信可以用跑一跑:

# vetorization vs for loop# define two arrays a, b:

a = np.random.rand(1000000)

b = np.random.rand(1000000)

# for loop version:

t1 = time.time()

c = 0

for i in range(1000000):

c += a[i]*b[i]

t2 = time.time()

print(c)

print(“for loop version:”+str(1000*(t2-t1))+“ms”)

time1 = 1000*(t2-t1)

# vectorization version:

t1 = time.time()

c = np.dot(a,b)

t2 = time.time()

print(c)

print(“vectorization version:”+str(1000*(t2-t1))+“ms”)

time2 = 1000*(t2-t1)

print(“vectorization is faster than for loop by ”+str(time1/time2)+“ times!”)

运行结果:

249765.8415288075

for loop version:627.4442672729492ms

249765.84152880745

vectorization version:1.5032291412353516ms

vectorization is faster than for loop by 417.39762093576525 times!

可见,用for方法和向量化方法,计算结果是一样,但是后者比前者快了400多倍!

因此,在计算量很大的时候,我们要尽可能想办法对数据进行Vectorizing,即“向量化”,以便让计算机进行矩阵运算。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • for
    for
    +关注

    关注

    0

    文章

    44

    浏览量

    15811
  • python
    +关注

    关注

    56

    文章

    4793

    浏览量

    84631
  • 深度学习
    +关注

    关注

    73

    文章

    5500

    浏览量

    121117

原文标题:消灭 for 循环!Python 的矩阵传播机制和矩阵运算

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    通过微透镜阵列的传播

    使用最新发布的版本中引入的一个新的MLA组件来设置和模拟这样的系统,允许对微透镜组件后面的近场以及远场和焦点区域的传输场进行彻底的研究。 微透镜阵列后光传播的研究 本用例研究微透镜阵列后传播的光。给出并
    发表于 12-11 11:32

    【每天学点AI】前向传播、损失函数、反向传播

    在深度学习的领域中,前向传播、反向传播和损失函数是构建和训练神经网络模型的三个核心概念。今天,小编将通过一个简单的实例,解释这三个概念,并展示它们的作用。前向传播:神经网络的“思考”过程前向
    的头像 发表于 11-15 10:32 626次阅读
    【每天学点AI】前向<b class='flag-5'>传播</b>、损失函数、反向<b class='flag-5'>传播</b>

    MATLAB(6)--特殊矩阵

    通用的特殊矩阵 zero函数:产生全是0矩阵,即零矩阵。 ones函数:产生全是1矩阵,即幺矩阵。 eyes函数:产生对角线为1的
    发表于 09-06 10:24

    MATLAB中的矩阵索引

    矩阵进行索引是从矩阵中选择或修改部分元素的一种方式。MATLAB 有几种索引样式,它们不仅功能强大、灵活,而且可读性强、表现力强。矩阵是 MATLAB 用来组织和分析数据的一个核心组件,索引是以可理解的方式有效操作
    的头像 发表于 09-05 09:28 450次阅读
    MATLAB中的<b class='flag-5'>矩阵</b>索引

    pytorch和python的关系是什么

    在当今的人工智能领域,Python已经成为了最受欢迎的编程语言之一。Python的易学易用、丰富的库和框架以及强大的社区支持,使其成为了数据科学、机器学习和深度学习等领域的首选语言。而在深度学习领域
    的头像 发表于 08-01 15:27 1895次阅读

    盛显科技:混合矩阵和拼接处理器的区别

    在视频显示与控制系统集成项目中,拼接处理器与混合矩阵作为两大关键组件,各自扮演着不可或缺的角色。尽管它们都是信号管理与分配的重要工具,但它们在运作机制与功能特性上展现出了显著的不同。 运作机制之别
    的头像 发表于 07-25 11:43 400次阅读
    盛显科技:混合<b class='flag-5'>矩阵</b>和拼接处理器的区别

    opencv-python和opencv一样吗

    不一样。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。OpenCV-Python
    的头像 发表于 07-16 10:38 1161次阅读

    BP神经网络的学习机制

    BP神经网络(Backpropagation Neural Network),即反向传播神经网络,是一种基于梯度下降算法的多层前馈神经网络,其学习机制的核心在于通过反向传播算法
    的头像 发表于 07-10 15:49 582次阅读

    神经网络前向传播和反向传播区别

    神经网络是一种强大的机器学习模型,广泛应用于各种领域,如图像识别、语音识别、自然语言处理等。神经网络的核心是前向传播和反向传播算法。本文将详细介绍神经网络的前向传播和反向传播的区别,以
    的头像 发表于 07-02 14:18 795次阅读

    光学雨量计雨量传感器的原理与工作机制

    来计算雨量。 光学雨量计雨量传感器的原理与工作机制 光学雨量计的核心部分是一个发射器和一个接收器。发射器发射一束光束,该光束在空中传播。当光束遇到空气中的雨滴时,部分光线会被雨滴散射,并沿不同的方向传播。 接收
    的头像 发表于 04-26 13:55 692次阅读
    光学雨量计雨量传感器的原理与工作<b class='flag-5'>机制</b>

    频率对地波传播的影响

    地波无线电信号传播非常适合白天在这些频率上进行相对较短距离的传播。由于电离层中的D区引起这些频率上的信号衰减,因此白天不可能进行天波电离层传播
    的头像 发表于 02-09 02:34 1214次阅读
    频率对地波<b class='flag-5'>传播</b>的影响

    如何使用linux下gdb来调试python程序

    如何使用linux下gdb来调试python程序  在Linux下,可以使用GDB(GNU调试器)来调试Python程序。GDB是一个强大的调试工具,可以帮助开发者诊断和修复程序中的错误。在本文
    的头像 发表于 01-31 10:41 2595次阅读

    电磁波的传播需要考虑哪些因素?

    在《电磁波是如何传输的?》我们介绍了空间电磁波传播的三种基本方式:地波传播,天波传播和视距传播。随着电磁波频率的升高,视距传播是目前最主要的
    的头像 发表于 01-16 10:02 1815次阅读
    电磁波的<b class='flag-5'>传播</b>需要考虑哪些因素?

    协方差矩阵和相关系数矩阵的转化

    协方差矩阵和相关系数矩阵是统计学中常用的概念,在多变量统计分析中起着至关重要的作用。 在进行多变量统计分析时,我们通常会涉及多个变量之间的关系和相互作用。协方差矩阵和相关系数矩阵就是用
    的头像 发表于 01-12 11:02 1971次阅读

    矩阵led扫描频率怎么调

    矩阵LED扫描频率是指LED矩阵在单位时间内刷新显示的次数。LED矩阵是由多个发光二极管(LED)组成的显示设备,通过扫描控制来实现各个LED的亮灭,从而显示出不同的图像或信息。调整矩阵
    的头像 发表于 01-02 17:30 1299次阅读