4

我希望这个例子更清楚,(这是一个逻辑回归对象,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)

如果这些片段不足以理解,代码在此页面上的“将它们放在一起”下 - http://deeplearning.net/tutorial/logreg.html#logreg

4

3 回答 3

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 进行矩阵运算。

于 2013-06-28T06:29:44.473 回答
1

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

于 2013-06-26T14:39:56.270 回答
0

命名参数或默认关键字参数,如inputn_inn_out,出于多种原因很有用。

  • 如果一个函数/方法有很多参数,那么通过名称传递它们会变得更容易,而不必记住参数的功能顺序。
  • 许多函数/方法都有经常使用的默认用例和很少使用的特殊用例。如果特殊用例需要向函数传递额外的参数,那么这些参数很可能采用具有默认值的命名参数的形式。这样,在默认用例中使用该函数时,用户不必指定任何附加参数。只有当有人想要使用特殊情况时,他们才需要指定一些额外的东西。这使得函数和方法调用在不以复杂或特殊方式使用时保持可读性和简单性。
于 2013-06-26T15:09:31.163 回答