Python 使用无扫描功能丢失输入计算机
我正在试验Theano,特别是函数 我想用它将线性分类器应用到一组存储为矩阵X列的特征向量上(我确信有更好的方法,这只是为了熟悉函数扫描) 这是我的代码片段:Python 使用无扫描功能丢失输入计算机,python,theano,deep-learning,Python,Theano,Deep Learning,我正在试验Theano,特别是函数 我想用它将线性分类器应用到一组存储为矩阵X列的特征向量上(我确信有更好的方法,这只是为了熟悉函数扫描) 这是我的代码片段: T_W = T.fmatrix('W') T_b = T.fmatrix('b') T_X = T.fmatrix('X') T_x = T.fmatrix('x') # this is the linear classifier T_f = T.dot(T_W, T_x) + T_b f = theano.function(inpu
T_W = T.fmatrix('W')
T_b = T.fmatrix('b')
T_X = T.fmatrix('X')
T_x = T.fmatrix('x')
# this is the linear classifier
T_f = T.dot(T_W, T_x) + T_b
f = theano.function(inputs=[T_x, theano.Param(T_W), theano.Param(T_b)],outputs=T_f)
T_outputs, T_updates = theano.scan(fn=lambda x,W,b : T_f, sequences=[T_X], non_sequences=[T_W,T_b])
F = theano.function(inputs=[T_X, theano.Param(T_W), theano.Param(T_b)],outputs=T_outputs)
从iPython执行代码段时,我得到以下错误(由最后一条指令触发):
MissingInputError:作为图形输入的变量既没有作为函数输入提供,也没有给定值。从这个输入到输出的变量链是[x,对于{cpu,scan_fn}.0]。此链可能不是唯一的
创建变量时的回溯:
文件“”,第5行,在
T_x=T.fmatrix('x')
现在还不完全清楚您想在这里做什么,但我猜您正在实现两个不同版本的线性分类器,一个不使用扫描,另一个使用扫描
下面的代码演示了我的方法
要回答您的具体问题:
出现错误消息是因为您的扫描版本在扫描步长函数中使用了T\u f
(这很奇怪,其中一个原因是不清楚您试图执行的操作;步长函数根本没有使用任何输入变量x
、W
或b
)和T\u f
使用T\u x
,但扫描版本的功能不将T\u x
作为输入。取而代之的是T_X
(注意大小写的区别),然后根本不用它
这里有一些提示和解释,说明您的代码和我的代码之间的差异
v1
和v2
方法,我们确保这两种不同的实现不会相互干扰的strict
参数no.scan
。它确保您不会意外地引入由step函数参数中的命名冲突引起的错误。默认情况下它没有启用,因为这可能会破坏旧代码,而strict不存在compute\u test\u value
确保使用简单样本数据进行计算。特别是,这将识别形状不匹配(例如,以错误的顺序使用参数执行点),并且通过能够在构造计算图时打印/浏览中间值而不是稍后执行计算时打印/浏览中间值,使调试更容易x
行,而不是x
列。这需要后乘w
,而不是预乘。这两种方法都有可能,但预乘w
将使b
的加法更加混乱(需要引入一个dimsuffle
)theano.Param
import numpy
import theano
import theano.tensor as T
def create_inputs(x_value, w_value, b_value):
x, w = T.matrices(2)
b = T.vector()
x.tag.test_value = x_value
w.tag.test_value = w_value
b.tag.test_value = b_value
return x, w, b
def v1(x_value, w_value, b_value):
x, w, b = create_inputs(x_value, w_value, b_value)
y = T.dot(x, w) + b
f = theano.function(inputs=[x, w, b], outputs=y)
print f(x_value, w_value, b_value)
def v2_step(x, w, b):
return (T.dot(x.dimshuffle('x', 0), w) + b)[0]
def v2(x_value, w_value, b_value):
x, w, b = create_inputs(x_value, w_value, b_value)
y, _ = theano.scan(v2_step, sequences=[x], non_sequences=[w, b], strict=True)
f = theano.function(inputs=[x, w, b], outputs=y)
print f(x_value, w_value, b_value)
def main():
batch_size = 2
input_size = 3
hidden_size = 4
theano.config.compute_test_value = 'raise'
numpy.random.seed(1)
x_value = numpy.random.standard_normal(size=(batch_size, input_size))
w_value = numpy.random.standard_normal(size=(input_size, hidden_size))
b_value = numpy.zeros((hidden_size,))
v1(x_value, w_value, b_value)
v2(x_value, w_value, b_value)
main()
非常感谢你的回答@DanielRenshaw:你的观点澄清了我的一些疑问。@KevinGuan:我对StackOverflow政策不太熟悉:你能解释一下为什么编辑这个问题吗?删除“有人能帮我找出我做错了什么吗?”因为问答网站也是如此。每个人在这里问问题是因为他们有问题。所以你不必说我说的话。再说一遍:每个人都知道你做错了,所以你不必在问题中这样说也不需要在问题中说“谢谢”,而且你没有这样做,所以这只是一个提示。
import numpy
import theano
import theano.tensor as T
def create_inputs(x_value, w_value, b_value):
x, w = T.matrices(2)
b = T.vector()
x.tag.test_value = x_value
w.tag.test_value = w_value
b.tag.test_value = b_value
return x, w, b
def v1(x_value, w_value, b_value):
x, w, b = create_inputs(x_value, w_value, b_value)
y = T.dot(x, w) + b
f = theano.function(inputs=[x, w, b], outputs=y)
print f(x_value, w_value, b_value)
def v2_step(x, w, b):
return (T.dot(x.dimshuffle('x', 0), w) + b)[0]
def v2(x_value, w_value, b_value):
x, w, b = create_inputs(x_value, w_value, b_value)
y, _ = theano.scan(v2_step, sequences=[x], non_sequences=[w, b], strict=True)
f = theano.function(inputs=[x, w, b], outputs=y)
print f(x_value, w_value, b_value)
def main():
batch_size = 2
input_size = 3
hidden_size = 4
theano.config.compute_test_value = 'raise'
numpy.random.seed(1)
x_value = numpy.random.standard_normal(size=(batch_size, input_size))
w_value = numpy.random.standard_normal(size=(input_size, hidden_size))
b_value = numpy.zeros((hidden_size,))
v1(x_value, w_value, b_value)
v2(x_value, w_value, b_value)
main()