2014-11-21 27 views
3

我使用Theano創建一個神經網絡,但是當我嘗試回報張量的兩個列表在列表同時我得到的錯誤:Theano多張量作爲輸出

#This is the line that causes the error 
#type(nabla_w) == <type 'list'> 
#type(nabla_w[0]) == <class 'theano.tensor.var.TensorVariable'> 
backpropagate = function(func_inputs, [nabla_w, nabla_b]) 

TypeError: Outputs must be theano Variable or Out instances. Received [dot.0, dot.0, dot.0, dot.0] of type <type 'list'> 

什麼一種Theano結構的我應該用兩個張量在數組一起返回,所以我可以這樣進行檢索:

nabla_w, nabla_b = backpropagate(*args) 

我試着用一些我在basic Tensor functionality page發現的東西,但這些都不工作。 (例如,我試圖堆棧或stacklists)

以下是錯誤我開始使用theano.tensor.stack或stacklists:

ValueError: all the input array dimensions except for the concatenation axis must match exactly 
Apply node that caused the error: Join(TensorConstant{0}, Rebroadcast{0}.0, Rebroadcast{0}.0, Rebroadcast{0}.0, Rebroadcast{0}.0) 
Inputs shapes: [(), (1, 10, 50), (1, 50, 100), (1, 100, 200), (1, 200, 784)] 
Inputs strides: [(), (4000, 400, 8), (40000, 800, 8), (160000, 1600, 8), (1254400, 6272, 8)] 
Inputs types: [TensorType(int8, scalar), TensorType(float64, 3D), TensorType(float64, 3D), TensorType(float64, 3D), TensorType(float64, 3D)] 
Use the Theano flag 'exception_verbosity=high' for a debugprint of this apply node. 

一點點額外的上下文代碼:

weights = [T.dmatrix('w'+str(x)) for x in range(0, len(self.weights))] 
biases = [T.dmatrix('b'+str(x)) for x in range(0, len(self.biases))] 
nabla_b = [] 
nabla_w = [] 
# feedforward 
x = T.dmatrix('x') 
y = T.dmatrix('y') 
activations = [] 
inputs = [] 
activations.append(x) 
for i in xrange(0, self.num_layers-1): 
    inputt = T.dot(weights[i], activations[i])+biases[i] 
    activation = 1/(1 + T.exp(-inputt)) 
    activations.append(activation) 
    inputs.append(inputt) 

delta = activations[-1]-y 
nabla_b.append(delta) 
nabla_w.append(T.dot(delta, T.transpose(inputs[-2]))) 

for l in xrange(2, self.num_layers): 
    z = inputs[-l] 
    spv = (1/(1 + T.exp(-z))*(1 - (1/(1 + T.exp(-z))))) 
    delta = T.dot(T.transpose(weights[-l+1]), delta) * spv 
    nabla_b.append(delta) 
    nabla_w.append(T.dot(delta, T.transpose(activations[-l-1]))) 
T.set_subtensor(nabla_w[-l], T.dot(delta, T.transpose(inputs[-l-1]))) 
func_inputs = list(weights) 
func_inputs.extend(biases) 
func_inputs.append(x) 
func_inputs.append(y) 


backpropagate = function(func_inputs, [nabla_w, nabla_b]) 
+0

默認情況下'''[some,stuff]'''構造是一個python列表。如果Theano需要一個數組,你可能需要使用'''array()'''構造函數(對於Python 2.x)[在這裏](https://docs.python.org/2/library/array)。 HTML#模塊陣列)。 – theWanderer4865 2014-11-21 15:25:18

+0

忘了提及nabla_w和nabla_b已經列出。我所做的問題是它不接受張量列表。 – 2014-11-21 15:34:08

+0

這應該工作如果正確(我經常使用這個)。不幸的是,代碼不是自包含的,所以我無法弄清楚可能出錯的地方。你能否提供一個可以複製和粘貼的最簡單的例子來進行分析?否則,你將不得不依賴於這個論壇中很少有人已經知道錯誤消息必然發生了什麼。 – eickenberg 2014-11-22 18:32:16

回答

6

Theano不支持此功能。當你調用theano.function(inputs, outputs),輸出只能是兩件事:

1)Theano可變 2)Theano變量列表

(2)不會讓你有在頂級列表的列表,所以你應該把輸出中的列表弄平。這將返回多於2個輸出。

對您的問題的一個可行的解決方案是將內部列表複製到1個變量中。

tensor_nabla_w = theano.tensor.stack(*nabla_w). 

這就要求nabla_w中的所有元素都是相同的形狀。這將在計算圖中添加額外的副本(所以它可能會慢一點)。

更新1:修正調用堆棧()

更新2:

截至目前,我們有加入約束,所有的元件將具有不同的形狀,所以堆棧不能使用。如果它們都具有相同數量的維度和dtype,則可以使用typed_list,否則您需要自行修改Theano或將輸出的列表弄平。

+0

我提到我嘗試了stack和stacklist theano.tensor.stack(),我找不到theano.stack(),但是糾正我,如果我錯了。不幸的是,由於神經網絡神經元每層的不同,nabla_w中的張量不是相同的形狀。我添加了使用張量時出現的錯誤消息。stack() – 2014-11-23 20:07:50

+0

我昨天編輯了我的答案,告訴你如何使用帶有鍵入列表的不同形狀工作。但他們需要有相同數量的尺寸。 – nouiz 2014-11-25 14:22:43

+0

感謝您的評論(我以前沒有檢查過)我會嘗試輸入的列表並回報! – 2014-11-26 17:05:28