广播(Broadcasting)
广播是这样的一个机制:它允许不同维度的张量进行加法或者乘法运算。在运算时,他将会沿着维度缺失的方向复制较小的那个张量。
通过广播机制,一个标量可以被加到矩阵上,一个向量可以被加到矩阵上,或者一个标量可以被加到向量上。
如上图,广播一个行矩阵。T和F分别表示True和False,指明沿着哪个维度可以进行广播。如果第二个参数是向量,它的形状为(2,)以及它的广播模式为(False,)。它将会自动向左展开,匹配矩阵的维度,最终得到(1,2)和(True,Fale)。
不像numpy那样动态地进行广播,Theano需要知道哪些维度需要进行广播。当可用的时候,广播信息将会以变量的类型给出。
下面的代码说明为了和矩阵执行加法运算,行和列怎么进行广播的:
import theanoimport numpyimport theano.tensor as Tr = 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.]])]