快速了解张量运算中的广播机制

本文介绍了张量运算中的广播机制,通过实例解析了数组与标量乘法、行列距平化处理以及三维情况下的广播原理。广播机制允许不同形状的张量进行运算,当后缘维度轴长度相符或一方为1时,可以广播兼容。文章通过添加轴、分析广播方向等方式深入阐述了这一概念。
摘要由CSDN通过智能技术生成

相信大家在使用numpy和tensorflow的时候都会遇到如下的错误,

ValueError: operands could not be broadcast together with shapes (4,3) (4,)
这里写图片描述
在这里插入图片描述
这是由于numpy和tensorflow中的张量在进行运算的时候形状不满足广播机制的要求,不理解广播机制的同学可能会通过各种魔改代码来让代码正常运行起来,但是却不知道为什么那样改就可以。

本文将从原理上介绍张量运算中经常用到的广播机制。

广播(broadcasting)指的是不同形状的张量之间的算数运算的执行方式

通过两个例子直观了解广播

数组与标量值的乘法

import numpy as np
arr = np.arange(5)
arr #-> array([0, 1, 2, 3, 4])
arr * 4 #-> array([ 0,  4,  8, 12, 16])

在上面的乘法运算中,标量值4被广播到了其他所有元素上

通过减去列平均值的方式对数组每一列进行距平化处理

arr = np.random.randn(4,3)
arr #-> array([[ 1.83518156,  0.86096695,  0.18681254],
    #       [ 1.32276051,  0.97987486,  0.27828887],
    #       [ 0.65269467,  0.91924574, -0.71780692],
    #       [-0.05431312,  0.58711748, -1.21710134]])
arr.mean(axis=0) #-> array([ 0.93908091,  0.83680126, -0.36745171])

关于mean中的axis参数,可以这样理解:

numpy中,axis = 0为行轴(竖直方向),axis = 1为列轴(水平方向),指定axis表示该操作沿axis进行,得到结果将是一个shape为除去该axisarray,对于多维张量,axis=i是指运算操作沿着底i个张量下标变化的方向进行。

在上例中,arr.mean(axis=0)表示对arr沿着轴0(竖直方向)求均值。显然,第0个下标变化的方向即为竖直方向,以第一列为例,4个元素的下标分别为[(0,0),(1,0),(2,0),(3,0)]

arr的shape为(4,3),除去axis=0的shape,结果为(1,3)或者(3,),这与上面的代码运行结果相符。

广播机制的原理

如果两个数组的后缘维度(从末尾开始算起的维度)轴长度相符其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失维度和(或)轴长度为1的维度上进行。

demeaned = arr - arr.mean(axis=0)
demeaned
> array([[ 0.89610065,  0.02416569,  0.55426426],
           [ 0.3836796 ,  0.1430736 ,  0.64574058],
           [-0.28638623,  0.08244448, -0.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值