扫描和修复

2024-03-29 06:08:34 发布

您现在位置:Python中文网/ 问答频道 /正文

在no中,可以选择使用repeat函数T.repeat(A,B)并提供一对向量,这样A[i]的每个元素都被重复B[i]次。在

不幸的是,这个操作没有定义渐变(它抛出一个notimplemented异常),这是一个问题,因为我正试图将它用于Pymc3的基于梯度的采样器。在

我想我可以使用scan函数并递归地为两个向量的每个元素调用repeat来解决这个问题,但是我的代码不能正常工作,可能是因为我错误地调用了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],但它返回以下错误。在

^{pr2}$

我已经在pymc3github上提出了一个issue来看看这是否是一个应该更永久性地解决的问题,但是我认为这是一个很好的机会来了解我更多关于Theano的信息,如果我能解决这个问题,也许我可以为这个项目做出贡献。在


Tags: 函数代码test元素scanvaluetag错误
1条回答
网友
1楼 · 发布于 2024-03-29 06:08:34

我看到两件事:

  1. lambda表达式中的顺序错误:它应该是A,B,previous_result(现在B被视为outputs_info)
  2. A.repeat(B)的形状与先前的\u结果的形状不同(在编译的这个阶段)

快速修复:只需从scan的参数中删除输出信息(和lambda中的先验结果),就可以得到[1,1,1,1]。在

相关问题 更多 >