广播(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.]])]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。