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
?
Theano 不支持可选参数。通过将函数的输入参数指定为 ins=[y,c]
,您告诉 Theano 该函数有两个一维(向量)参数。就 Theano 而言,两者都是强制性的。当您尝试为 c
传递 None
时,Theano 检查您传递的值的类型是否与编译函数时声明的类型(即两个向量)相匹配,但显然 None
是不是向量,因此引发此异常。
一个解决方案是编译两个 Theano 函数,一个只接受一个参数,另一个接受两个。您甚至可以将现有的 Python 函数 f
用于两者。
我会尝试更完整的回复。
1) 在构建图形时,条件 "c is not None" 是 运行 只有一次。由于 c 是一个符号变量,else 路径将始终被执行。如果您想在 运行 时间执行条件,请参阅此文档页面:
http://deeplearning.net/software/theano/tutorial/conditions.html
2) Theano 有一个特殊的类型 None。但我不建议你使用它。大多数时候它没有用,也没有记录。所以在你更熟悉 Theano 之前不要使用它。
3) 告诉我使用 2 个函数的另一个答案会起作用。
4) 在这种简单的情况下,您可以只传递一个大小合适的向量,而不是 None。这也可以,但速度较慢。
我在 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
?
Theano 不支持可选参数。通过将函数的输入参数指定为 ins=[y,c]
,您告诉 Theano 该函数有两个一维(向量)参数。就 Theano 而言,两者都是强制性的。当您尝试为 c
传递 None
时,Theano 检查您传递的值的类型是否与编译函数时声明的类型(即两个向量)相匹配,但显然 None
是不是向量,因此引发此异常。
一个解决方案是编译两个 Theano 函数,一个只接受一个参数,另一个接受两个。您甚至可以将现有的 Python 函数 f
用于两者。
我会尝试更完整的回复。
1) 在构建图形时,条件 "c is not None" 是 运行 只有一次。由于 c 是一个符号变量,else 路径将始终被执行。如果您想在 运行 时间执行条件,请参阅此文档页面:
http://deeplearning.net/software/theano/tutorial/conditions.html
2) Theano 有一个特殊的类型 None。但我不建议你使用它。大多数时候它没有用,也没有记录。所以在你更熟悉 Theano 之前不要使用它。
3) 告诉我使用 2 个函数的另一个答案会起作用。
4) 在这种简单的情况下,您可以只传递一个大小合适的向量,而不是 None。这也可以,但速度较慢。