簡體   English   中英

theano函數的可選參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM