2016-02-12 98 views
0

在Theano中,可以選擇使用重複函數T.repeat(A,B)並提供一對向量,使得A[i]的每個元素重複B[i]次。Theano掃描和重複

不幸的是,這個操作沒有定義的漸變(它引發了一個未實現的異常),這是一個問題,因爲我試圖在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上的issue,看看這是什麼,應該更永久固定的,但我想它的一個很好的機會更多地瞭解Theano對我來說,無論如何,如果我能解決問題,也許我可以回饋項目。

回答

0

我在這裏看到的兩件事情:

    在lambda表達式
  1. 壞排序:它應該是A,B,prior_result(現在的B被視爲outputs_info)A.repeat(B)的
  2. 形狀不同於prior_result的形狀(在編譯階段)

快速修復:從scan的參數(和lambda中的prior_result)中刪除outputs_info,您將得到[1,1,1,1]。