广播(Broadcasting)

广播是这样的一个机制:它允许不同维度的张量进行加法或者乘法运算。在运算时,他将会沿着维度缺失的方向复制较小的那个张量。

通过广播机制,一个标量可以被加到矩阵上,一个向量可以被加到矩阵上,或者一个标量可以被加到向量上。
图片描述

如上图,广播一个行矩阵。T和F分别表示True和False,指明沿着哪个维度可以进行广播。如果第二个参数是向量,它的形状为(2,)以及它的广播模式为(False,)。它将会自动向左展开,匹配矩阵的维度,最终得到(1,2)和(True,Fale)。

不像numpy那样动态地进行广播,Theano需要知道哪些维度需要进行广播。当可用的时候,广播信息将会以变量的类型给出。

下面的代码说明为了和矩阵执行加法运算,行和列怎么进行广播的:

import theano
import numpy
import theano.tensor as T
r = T.row()
r.broadcastable
# (True, False)
mtr = T.matrix()
mtr.broadcastable
# (False, False)
f_row = theano.function([r, mtr], [r + mtr])
R = numpy.arange(3).reshape(1,3)
R
# array([[0, 1, 2]])
M = numpy.arange(9).reshape(3, 3)
M
# array([[0, 1, 2],
#        [3, 4, 5],
#        [6, 7, 8]])
f_row(R, M)
# [array([[  0.,   2.,   4.],
#        [  3.,   5.,   7.],
#        [  6.,   8.,  10.]])]
c = T.col()
c.broadcastable
# (False, True)
f_col = theano.function([c, mtr], [c + mtr])
C = numpy.arange(3).reshape(3, 1)
C
# array([[0],
#        [1],
#        [2]])
M = numpy.arange(9).reshape(3, 3)
f_col(C, M)
# [array([[  0.,   1.,   2.],
#        [  4.,   5.,   6.],
#        [  8.,   9.,  10.]])]

xiao蜗牛
85 声望20 粉丝

{name: 'Xiao蜗牛',