Python theano函数的可选参数

Python theano函数的可选参数,python,numpy,theano,Python,Numpy,Theano,我在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 =

我在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()
ValueError:应为数据数组,而不是无数据数组
导致错误的应用节点:Elemwise{mul,no_inplace}(,)
输入类型:[TensorType(浮点64,向量),TensorType(浮点64,向量)]
输入形状:[‘无形状’,(1,)]
输入步幅:[‘无步幅’,(8,)]
输入值:[无,数组([1.])]
创建节点时进行回溯:
文件“test_theano.py”,第14行,在f中
收益率(c*b).平均值()
c
没有输入形状,也没有输入步幅,这是有道理的。但是我想知道为什么
if
检查
f
似乎不起作用


如何在
f
中进行检查,以正确处理可选参数
c

Theano不支持可选参数。通过将函数的输入参数指定为
ins=[y,c]
可以告诉Theano函数有两个一维(向量)参数。就Theano而言,两者都是强制性的。当您尝试为
c
传递
None
时,no检查传入的值的类型是否与编译函数时声明的类型匹配(即两个向量),但显然
None
不是向量,因此引发此异常


解决方案是编译两个Theano函数,一个只接受一个参数,另一个同时接受两个参数。您甚至可以同时使用现有的Python函数
f

Theano不支持可选参数。通过将函数的输入参数指定为
ins=[y,c]
可以告诉Theano函数有两个一维(向量)参数。就Theano而言,两者都是强制性的。当您尝试为
c
传递
None
时,no检查传入的值的类型是否与编译函数时声明的类型匹配(即两个向量),但显然
None
不是向量,因此引发此异常


解决方案是编译两个Theano函数,一个只接受一个参数,另一个同时接受两个参数。您甚至可以同时使用现有的Python函数
f

Theano不支持可选参数。通过将函数的输入参数指定为
ins=[y,c]
可以告诉Theano函数有两个一维(向量)参数。就Theano而言,两者都是强制性的。当您尝试为
c
传递
None
时,no检查传入的值的类型是否与编译函数时声明的类型匹配(即两个向量),但显然
None
不是向量,因此引发此异常


解决方案是编译两个Theano函数,一个只接受一个参数,另一个同时接受两个参数。您甚至可以同时使用现有的Python函数
f

Theano不支持可选参数。通过将函数的输入参数指定为
ins=[y,c]
可以告诉Theano函数有两个一维(向量)参数。就Theano而言,两者都是强制性的。当您尝试为
c
传递
None
时,no检查传入的值的类型是否与编译函数时声明的类型匹配(即两个向量),但显然
None
不是向量,因此引发此异常


解决方案是编译两个Theano函数,一个只接受一个参数,另一个同时接受两个参数。您甚至可以使用现有的Python函数
f

我将尝试一个更完整的响应

1) 构建图形时,条件“c不是无”只运行一次。由于c是一个符号变量,因此将始终执行else路径。如果要在运行时查看执行条件,请参阅此文档页:

2) Theano有一个特殊类型的None。但我不建议你使用它。它在大多数情况下都没有用处,也没有文档记录。所以在你更熟悉Theano之前不要使用它

3) 另一个答案告诉我们使用2个函数就可以了


4) 在这种简单的情况下,可以只传递一个而不是一个大小合适的向量。这也行,但速度较慢。

我将尝试更完整的回答

1) 构建图形时,条件“c不是无”只运行一次。由于c是一个符号变量,因此将始终执行else路径。如果要在运行时查看执行条件,请参阅此文档页:

2) Theano有一个特殊类型的None。但我不建议你使用它。它在大多数情况下都没有用处,也没有文档记录。所以在你更熟悉Theano之前不要使用它

3) 另一个答案告诉我们使用2个函数就可以了


4) 在这种简单的情况下,可以只传递一个而不是一个大小合适的向量。这也行,但速度较慢。

我将尝试更完整的回答

1) 构建图形时,条件“c不是无”只运行一次。由于c是一个符号变量,因此将始终执行else路径。如果要在运行时查看执行条件,请参阅此文档页:

2) Theano有一个特殊类型的None。但我不建议你使用它。它在大多数情况下都没有用处,也没有文档记录。所以在你更熟悉Theano之前不要使用它

3) 另一个答案告诉我们使用2个函数就可以了

4) 在这种简单的情况下,可以只传递一个而不是一个大小合适的向量。那也行,但要慢一些。

我很高兴