2016-09-08 45 views
0

我目前正在通过逻辑回归theano tutorial,非常像这篇文章中讨论: what-does-negative-log-likelihood-of-logistic-regression-in-theano-look-like。然而,原始tutorial使用共享变量 W和B,以及一个称为输入矩阵。输入是一个n x n_in矩阵,W是n_in x n_out,b是一个n_out x 1列向量。与逻辑回归广播共享变量与theano

self.W = theano.shared(
     value=numpy.zeros(
      (n_in, n_out), 
      dtype=theano.config.floatX 
     ), 
     name='W', 
     borrow=True 
    ) 

    self.b = theano.shared(
     value=numpy.zeros(
      (n_out,), 
      dtype=theano.config.floatX 
     ), 
     name='b', 
     borrow=True 
    ) 

    self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b) 

现在,据我了解共享变量的文档,共享变量的广播模式默认为false。那么为什么这行代码不会因为尺寸不匹配而导致错误?

self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b) 

毕竟,我们还添加了矩阵T.dot(input, self.W)为矢量b。毕竟默认共享变量是否广播?即使有广播,维度也不会加起来。 T.dot(input, self.W)n x n_out矩阵和b a n_out x 1向量。

我缺少什么?

回答

0

共享变量不broadcastable默认作为其形状可以改变,但是,请如添加标量的矩阵,矢量添加到基质等等操作时Theano采取与张量的必要广播的护理。查看documentation了解更多详情。 请注意,input是一个不是共享变量的符号变量。尺寸不符的情况下会发生如果self.WN_OUT秒尺寸是从载体b,这是不是这里的情况的第一个维度不同,所以它们完美地加起来,它在numpy的也是相同的:

import numpy as np 
a = np.asarray([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) 
b = np.asarray([1,2,3]) 
print(a + b) 
+0

感谢您的回答。但是,我仍然缺少一个细节:'self.b'是一个共享变量,它被添加到'T.dot(input,self.W)'中。因此,似乎我们需要广播来完成这项工作,但是'self.b'没有被定义为可广播。为什么它工作呢?我明白为什么它可以与符号变量或纯粹的numpy一起工作,但不是为什么它可以与共享变量一起工作。 – aifos324

+0

由于'T.dot(input,self.W)'将返回符号矩阵/向量。 [theano.tensor.dot(X,Y)](http://deeplearning.net/software/theano/library/tensor/basic.html#theano.tensor.dot) – uyaseen

+0

好的,在你的帮助下,我发现我的错误。当我在theano的[docu](http://deeplearning.net/software/theano/library/tensor/basic.html)中读到这个时,它会产生点击:当一个元素操作的两个参数(如加法或减法)不同数量的维度,通过填充True_可将可播放模式展开到左侧。因此,假设在运行时,这也适用于共享变量,默认情况下它具有可传播模式'[false,false,...]',现在都是有道理的。我的错误是假设填充不会发生在共享变量上。谢谢! – aifos324