在theano中创建共享行
Create a shared row in theano
我注意到在 theano 中,当一个人基于一维 numpy 数组创建一个共享变量时,它变成了一个向量,而不是一行:
import theano.tensor as T
import theano, numpy
shared_vector = theano.shared(numpy.zeros((10,)))
print(shared_vector.type)
# TensorType(float64, vector)
print(shared_vector.broadcastable)
# (False,)
1xN的矩阵也是一样,变成矩阵而不是行:
shared_vector = theano.shared(numpy.zeros((1,10,)))
print(shared_vector.type)
# TensorType(float64, matrix)
print(shared_vector.broadcastable)
# (False, False)
当我想将 M x N 矩阵添加到 1 X N 行向量时,这很麻烦,因为共享向量在第一维不可广播。首先,这行不通:
row = T.row('row')
mat=T.matrix('matrix')
f=theano.function(
[],
mat + row,
givens={
mat: numpy.zeros((20,10), dtype=numpy.float32),
row: numpy.zeros((10,), dtype=numpy.float32)
},
on_unused_input='ignore'
)
出现错误:
TypeError: Cannot convert Type TensorType(float32, vector) (of Variable <TensorType(float32, vector)>) into Type TensorType(float32, row). You can try to manually convert <TensorType(float32, vector)> into a TensorType(float32, row).
好的,很清楚,我们不能将向量分配给行。不幸的是,这也不行:
row = T.matrix('row')
mat=T.matrix('matrix')
f=theano.function(
[],
mat + row,
givens={
mat: numpy.zeros((20,10), dtype=numpy.float32),
row: numpy.zeros((1,10,), dtype=numpy.float32)
},
on_unused_input='ignore'
)
f()
出现错误:
ValueError: Input dimension mis-match. (input[0].shape[0] = 20, input[1].shape[0] = 1)
Apply node that caused the error: Elemwise{add,no_inplace}(<TensorType(float32, matrix)>, <TensorType(float32, matrix)>)
Inputs types: [TensorType(float32, matrix), TensorType(float32, matrix)]
Inputs shapes: [(20, 10), (1, 10)]
Inputs strides: [(40, 4), (40, 4)]
Inputs values: ['not shown', 'not shown']
Backtrace when the node is created:
File "<ipython-input-55-0f03bee478ec>", line 5, in <module>
mat + row,
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node.
所以我们不能只使用 1 x N 矩阵作为行(因为 1 x N 矩阵的第一维不可广播)。
问题仍然存在,'can' 我们做什么?如何创建行类型的共享变量,这样我就可以使用矩阵行加法进行广播?
使用 reshape(1, N)
的替代方法是将 dimshuffle('x', 0)
用作 described in the documentation。
下面是两种方法的演示:
import numpy
import theano
x = theano.shared(numpy.arange(10))
print x
print x.dimshuffle('x', 0).type
print x.dimshuffle(0, 'x').type
print x.reshape((1, x.shape[0])).type
print x.reshape((x.shape[0], 1)).type
f = theano.function([], outputs=[x, x.dimshuffle('x', 0), x.reshape((1, x.shape[0]))])
theano.printing.debugprint(f)
这会打印
<TensorType(int32, vector)>
TensorType(int32, row)
TensorType(int32, col)
TensorType(int32, row)
TensorType(int32, col)
DeepCopyOp [@A] '' 2
|<TensorType(int32, vector)> [@B]
DeepCopyOp [@C] '' 4
|InplaceDimShuffle{x,0} [@D] '' 1
|<TensorType(int32, vector)> [@B]
DeepCopyOp [@E] '' 6
|Reshape{2} [@F] '' 5
|<TensorType(int32, vector)> [@B]
|MakeVector{dtype='int64'} [@G] '' 3
|TensorConstant{1} [@H]
|Shape_i{0} [@I] '' 0
|<TensorType(int32, vector)> [@B]
证明 dimshuffle
可能更可取,因为它比 reshape
涉及的工作更少。
我会使用:
shared_row = theano.shared(numpy.zeros((1,10,)), broadcastable=(True, False))
print(shared_row.type)
# TensorType(float64, row)
print(shared_row.broadcastable)
(True, False)
我注意到在 theano 中,当一个人基于一维 numpy 数组创建一个共享变量时,它变成了一个向量,而不是一行:
import theano.tensor as T
import theano, numpy
shared_vector = theano.shared(numpy.zeros((10,)))
print(shared_vector.type)
# TensorType(float64, vector)
print(shared_vector.broadcastable)
# (False,)
1xN的矩阵也是一样,变成矩阵而不是行:
shared_vector = theano.shared(numpy.zeros((1,10,)))
print(shared_vector.type)
# TensorType(float64, matrix)
print(shared_vector.broadcastable)
# (False, False)
当我想将 M x N 矩阵添加到 1 X N 行向量时,这很麻烦,因为共享向量在第一维不可广播。首先,这行不通:
row = T.row('row')
mat=T.matrix('matrix')
f=theano.function(
[],
mat + row,
givens={
mat: numpy.zeros((20,10), dtype=numpy.float32),
row: numpy.zeros((10,), dtype=numpy.float32)
},
on_unused_input='ignore'
)
出现错误:
TypeError: Cannot convert Type TensorType(float32, vector) (of Variable <TensorType(float32, vector)>) into Type TensorType(float32, row). You can try to manually convert <TensorType(float32, vector)> into a TensorType(float32, row).
好的,很清楚,我们不能将向量分配给行。不幸的是,这也不行:
row = T.matrix('row')
mat=T.matrix('matrix')
f=theano.function(
[],
mat + row,
givens={
mat: numpy.zeros((20,10), dtype=numpy.float32),
row: numpy.zeros((1,10,), dtype=numpy.float32)
},
on_unused_input='ignore'
)
f()
出现错误:
ValueError: Input dimension mis-match. (input[0].shape[0] = 20, input[1].shape[0] = 1)
Apply node that caused the error: Elemwise{add,no_inplace}(<TensorType(float32, matrix)>, <TensorType(float32, matrix)>)
Inputs types: [TensorType(float32, matrix), TensorType(float32, matrix)]
Inputs shapes: [(20, 10), (1, 10)]
Inputs strides: [(40, 4), (40, 4)]
Inputs values: ['not shown', 'not shown']
Backtrace when the node is created:
File "<ipython-input-55-0f03bee478ec>", line 5, in <module>
mat + row,
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node.
所以我们不能只使用 1 x N 矩阵作为行(因为 1 x N 矩阵的第一维不可广播)。
问题仍然存在,'can' 我们做什么?如何创建行类型的共享变量,这样我就可以使用矩阵行加法进行广播?
使用 reshape(1, N)
的替代方法是将 dimshuffle('x', 0)
用作 described in the documentation。
下面是两种方法的演示:
import numpy
import theano
x = theano.shared(numpy.arange(10))
print x
print x.dimshuffle('x', 0).type
print x.dimshuffle(0, 'x').type
print x.reshape((1, x.shape[0])).type
print x.reshape((x.shape[0], 1)).type
f = theano.function([], outputs=[x, x.dimshuffle('x', 0), x.reshape((1, x.shape[0]))])
theano.printing.debugprint(f)
这会打印
<TensorType(int32, vector)>
TensorType(int32, row)
TensorType(int32, col)
TensorType(int32, row)
TensorType(int32, col)
DeepCopyOp [@A] '' 2
|<TensorType(int32, vector)> [@B]
DeepCopyOp [@C] '' 4
|InplaceDimShuffle{x,0} [@D] '' 1
|<TensorType(int32, vector)> [@B]
DeepCopyOp [@E] '' 6
|Reshape{2} [@F] '' 5
|<TensorType(int32, vector)> [@B]
|MakeVector{dtype='int64'} [@G] '' 3
|TensorConstant{1} [@H]
|Shape_i{0} [@I] '' 0
|<TensorType(int32, vector)> [@B]
证明 dimshuffle
可能更可取,因为它比 reshape
涉及的工作更少。
我会使用:
shared_row = theano.shared(numpy.zeros((1,10,)), broadcastable=(True, False))
print(shared_row.type)
# TensorType(float64, row)
print(shared_row.broadcastable)
(True, False)