将“输入”传递给Theano中的函数的目的/意义是什么?

时间:2013-06-26 14:33:12

标签: python theano

示例将使我希望更清楚,(这是一个Logistic回归对象,Theano Tensor库导入为T)

    def __init__(self, input, n_in, n_out):
        #Other code...
        self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b)

在主要内容中被召唤......

def main():
    x = T.matrix()
    classifier = LogisticRegression(input=x, n_in=28 * 28, n_out=10)

如果这些snippits不足以理解,那么代码就在“全部放在一起”的页面上 - http://deeplearning.net/tutorial/logreg.html#logreg

3 个答案:

答案 0 :(得分:4)

所以... Theano在评估之前为其计算的表达式构建图形。通过在示例中将诸如'x'之类的theano变量传递给逻辑回归对象的初始化,您将在对象中创建许多表达式,例如p_y_given_x,这些表达式是依赖于x的theano表达式。这稍后用于符号梯度计算。

为了更好地感受它,您可以执行以下操作:

import theano.pp #pp is for pretty print
x = T.dmatrix('x') #naming your variables is a good idea, and important i think
lr = LogisticRegression(x,n_in = 28*28, n_out= 10)
print pp(lr.p_y_given_x)

这应该给你一个输出,如

softmax( W \dot x + b)

当你在它的时候继续尝试

print pp(T.grad(lr._y_given_x,x)) #might need syntax checkng

这是theano内部存储表达式的方式。然后,您可以使用这些表达式在theano中创建函数,例如

values = theano.shared( value = mydata, name = 'values')
f = theano.function([],lr.p_y_given_x , 
                    givens ={x:values},on_unused_input='ignore')
print f()

然后调用f应该为你提供mydata中定义的值的预测类概率。在theano中执行此操作的方法(以及在DL教程中完成的方式)是通过传递“虚拟”theano变量,然后使用“givens”关键字将其设置为包含数据的共享变量。这很重要,因为将变量存储在共享变量中允许theano使用GPU进行矩阵操作。

答案 1 :(得分:1)

这是一个名为named parameters的Python功能。对于具有可选参数或许多参数的函数,按名称传递参数是有帮助的,而不是仅仅依赖于它们传递给函数的顺序。在您的具体情况下,您可以看到input参数here的含义。

答案 2 :(得分:0)

命名参数或默认关键字参数(例如inputn_inn_out有用,原因如下。

  • 如果函数/方法有很多参数,则按名称传递它们变得更容易,而不必记住参数的功能顺序。
  • 许多函数/方法都有经常使用的默认用例,以及很少使用的专用用例。如果专业用例需要向函数传递其他参数,那么这些参数很可能采用具有默认值的命名参数的形式。这样,当在默认用例中使用该函数时,用户不必指定任何其他参数。只有当有人想要使用专业案例时,他们才需要指定额外的东西。这可以使函数和方法调用在不以复杂或专业方式使用时保持可读性和简单性。