0

在 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 的信息,如果我能解决这个问题,也许我可以贡献回到项目。

4

1 回答 1

0

我在这里看到两件事:

  1. lambda 表达式中的错误排序:它应该是 A、B、prior_result(现在 B 被视为输出信息)
  2. A.repeat(B) 的形状与prior_result 的形状不同(在这个编译阶段)

快速修复:只需从扫描的参数中删除 outputs_info(以及从 lambda 中删除prior_result),您将得到 [1,1,1,1]。

于 2016-04-02T21:31:41.920 回答