Python 使用无扫描功能丢失输入计算机

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

我正在试验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(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不存在

  • 使用一个成熟的函数代替lambda作为scan的阶跃函数。与严格模式一样,这有助于避免意外命名冲突,并使步骤代码更易于遵循。阶跃功能也可以单独测试

  • 使用
    compute\u test\u value
    确保使用简单样本数据进行计算。特别是,这将识别形状不匹配(例如,以错误的顺序使用参数执行点),并且通过能够在构造计算图时打印/浏览中间值而不是稍后执行计算时打印/浏览中间值,使调试更容易

  • 此代码将每个输入样本编码为
    x
    行,而不是
    x
    列。这需要后乘
    w
    ,而不是预乘。这两种方法都有可能,但预乘
    w
    将使
    b
    的加法更加混乱(需要引入一个
    dimsuffle

  • 除非需要对默认值等使用非标准行为,否则无需使用
    theano.Param

  • 避免给事物命名,以免它们仅在大小写时有所不同!一般情况下,请坚持使用(即实例变量应为小写,单词之间用下划线分隔)

  • 扫描版本的阶跃函数中需要dimshuffle和第一行的选择,以确保点积和偏置的子序列添加是尺寸兼容的。这在非扫描版本中是不需要的,因为我们正在做一个矩阵-点积

  • 守则:

    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()