在 Theano 中,有一个选项可以使用 repeat 函数T.repeat(A,B)
并提供一对向量,这样 的每个元素A[i]
都是重复的B[i]
次数。
不幸的是,这个操作没有定义梯度(它抛出一个未实现的异常),这是一个问题,因为我试图将它与Pymc3
基于梯度的采样器一起使用。
我想我可以使用scan
函数来解决这个问题,并为两个向量的每个元素递归调用重复,但是我的代码不起作用,可能是因为我调用scan
不正确。谁能帮我理解为什么下面的代码不起作用?
A = T.dvector('A')
B = T.ivector('B')
A.tag.test_value = np.array(np.random.rand(2), dtype = "float32")
B.tag.test_value = np.array(np.random.rand(2), dtype = "int32")
th.config.compute_test_value = 'warn'
results, updates = th.scan(fn = lambda prior_result, A, B: A.repeat(B),
sequences = [A, B],
outputs_info = T.constant([1,4,4,4]))
b = th.function(inputs=[A,B], outputs=results.flatten())
b([1],[4])
我希望这会返回 [1,1,1,1] 但它会返回以下错误。
395 except AttributeError:
396 return _wrapit(a, 'repeat', repeats, axis)
--> 397 return repeat(repeats, axis)
398
399
ValueError: operands could not be broadcast together with shape (1,) (4,)
我在 Pymc3 github 上提出了一个问题,看看这是否应该更永久地修复,但我认为这是一个很好的机会,可以为我了解更多关于 Theano 的信息,如果我能解决这个问题,也许我可以贡献回到项目。