2013-05-24 3 views
2

Theano에서 두 개의 배열로 구성된 sumproduct을 계산하고 싶습니다. 두 배열은 공유 변수로 선언되며 이전 계산의 결과입니다. tutorial을 읽고, 나는 '정상적인'텐서 배열을 사용하여 원하는 것을 계산하기 위해 스캔을 사용하는 방법을 발견했지만 공유 배열에 코드를 적용하려고 시도했을 때 TypeError: function() takes at least 1 argument (1 given) 오류 메시지가 나타납니다. (아래의 최소 실행 코드 예제 참조)공유 변수가있는 Theano.scan 사용

내 코드에서 실수는 어디에서 발생합니까? 내 오해는 어디에서 왔습니까? 나는 또한 내 문제를 해결하기위한 다른 접근 방식에 열려있다.

일반적으로 공유 변수를 직접 사용하는 버전을 선호합니다. 이해하기에 처음으로 배열을 Numpy 배열로 변환하고 다시 Theano에 전달하는 것이 낭비이기 때문입니다.

import theano 
import theano.tensor as T 
import numpy 

a1 = [1,2,4] 
a2 = [3,4,5] 

Ta1_shared = theano.shared(numpy.array(a1)) 
Ta2_shared = theano.shared(numpy.array(a2)) 

outputs_info = T.as_tensor_variable(numpy.asarray(0, 'float64')) 

Tsumprod_result, updates = theano.scan(fn=lambda Ta1_shared, Ta2_shared, prior_value: 
             prior_value + Ta1_shared * Ta2_shared, 
             outputs_info=outputs_info, 
             sequences=[Ta1_shared, Ta2_shared]) 
Tsumprod_result = Tsumprod_result[-1] 

Tsumprod = theano.function(outputs=Tsumprod_result) 
print Tsumprod() 

오류 메시지 :

TypeError: function() takes at least 1 argument (1 given) 

작업 sumproduct 코드를 사용하여 비공유 변수 :

import theano 
import theano.tensor as T 
import numpy 

a1 = [1, 2, 4] 
a2 = [3, 4, 5] 

Ta1 = theano.tensor.vector("a1") 
Ta2 = theano.tensor.vector("coefficients") 
outputs_info = T.as_tensor_variable(numpy.asarray(0, 'float64')) 

Tsumprod_result, updates = theano.scan(fn=lambda Ta1, Ta2, prior_value: 
             prior_value + Ta1 * Ta2, 
             outputs_info=outputs_info, 
             sequences=[Ta1, Ta2]) 
Tsumprod_result = Tsumprod_result[-1] 

Tsumprod = theano.function(inputs=[Ta1, Ta2], outputs=Tsumprod_result) 
print Tsumprod(a1, a2) 

사용하여 sumproduct 코드를 생성 오류 메시지 변수를 공유 항상 입력의 목록이 필요

Tsumprod = theano.function([], outputs=Tsumprod_result) 

theano.function() :

답변

7

는이 일에 컴파일 라인을 변경해야합니다. 함수가이 경우와 같이 0 입력을 받으면 입력에 대해 빈 목록을 제공해야합니다.