[英]Optional parameter to theano function
我在theano中有一個函數f
,它帶有兩個參數,其中一個是可選的。 當我使用可選參數None
調用函數時, f
內的檢查失敗。 此腳本重現該錯誤:
import theano
import theano.tensor as T
import numpy as np
# function setup
def f(b, c=None):
if c is not None:
return (c*b).mean()
else:
return b.mean()
y = T.vector()
c = T.vector()
ins = [y,c]
tfn = theano.function(ins, f(y,c), allow_input_downcast=True, mode=None)
# eval function
first = np.array([1])
second = np.array([2])
second = None
res = tfn(first, second)
print res
出現錯誤消息失敗
ValueError: expected an ndarray, not None
Apply node that caused the error: Elemwise{mul,no_inplace}(<TensorType(float64, vector)>, <TensorType(float64, vector)>)
Inputs types: [TensorType(float64, vector), TensorType(float64, vector)]
Inputs shapes: ['No shapes', (1,)]
Inputs strides: ['No strides', (8,)]
Inputs values: [None, array([ 1.])]
Backtrace when the node is created:
File "test_theano.py", line 14, in f
return (c*b).mean()
c
沒有輸入形狀也沒有輸入步幅是有意義的。 但是我想知道為什么f
內部的if
校驗似乎不起作用。
如何在f
內部進行檢查,以便正確處理可選參數c
?
我將嘗試更完整的答復。
1)條件“ c不是None”在構建圖形時僅運行一次。 由於c是符號變量,因此將始終執行else路徑。 如果要在運行時執行條件,請參閱此文檔頁面:
http://deeplearning.net/software/theano/tutorial/conditions.html
2)Theano有一個特殊的“無”類型。 但是我不建議您使用它。 大多數時候它沒有用,也沒有記錄在案。 因此,在您更加熟悉Theano之前,請不要使用它。
3)告訴使用2個功能的其他答案將起作用。
4)在那種簡單的情況下,您可以傳遞一個只有一個而不是沒有一個而正確大小的向量。 那也可以,但是比較慢。
Theano不支持可選參數。 通過將函數的輸入參數指定為ins=[y,c]
您將告訴Theano函數具有兩個一維(矢量)參數。 就Theano而言,兩者都是強制性的。 當您嘗試為c
傳遞None
時,Theano將檢查您傳遞的值的類型是否與編譯函數時聲明的類型(即兩個向量)相符,但顯然None
不是向量,因此會引發此異常。
一種解決方案是編譯兩個Theano函數,一個僅接受一個參數,另一個接受兩個參數。 您甚至都可以使用現有的Python函數f
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.