首页 文章

从theano中的给定pmf中选择一个数字

提问于
浏览
1

假设我有一个数组 p = [ 0.27, 0.23, 0.1, 0.15, 0.2 ,0.05] . 设 p 是随机变量 X 的概率质量函数 . 现在,我正在编写一个theano代码,我在每次迭代时生成一个 p ,我也有 n 权重矩阵 . (这里 [n = 6] . )

现在,在每次迭代中,我想要选择这些权重矩阵中的一个用于进一步传播 . 有人可以帮忙解决如何编写这段代码的问题 . 我不确定我是否可以编写启用反向传播所需的确切代码(即正确校正渐变)

请注意,所有 W_i 以及输入 p 都是模型参数 .

编辑

W1,W2,W3,W4,W5,W6,x,eps = T.dmatrices("W1","W2","W3","W4","W5","W6","x","eps")

    b1,b2,b3,b4,b5,b6,pi = T.dcols("b1","b2","b3","b4","b5","b6","pi")

   h_encoder = T.tanh(T.dot(W1,x) + b1)

    rng = T.shared_randomstreams.RandomStreams(seed=124)

    i = rng.choice(size=(1,), a=self.num_model, p=T.nnet.softmax(pi))

    mu_encoder = T.dot(W2[i[0]*self.dimZ:(1+i[0])*self.dimZ].nonzero(),h_encoder) + b2[i[0]*self.dimZ:(1+i[0])*self.dimZ].nonzero()

    log_sigma_encoder = (0.5*(T.dot(W3[i[0]*self.dimZ:(1+i[0])*self.dimZ].nonzero(),h_encoder)))+ b3[i[0]*self.dimZ:(1+i[0])*self.dimZ].nonzero()

    z = mu_encoder + T.exp(log_sigma_encoder)*eps`

而且我的渐变变量是 gradvariables = [W1,W2,W3,W4,W5,b1,b2,b3,b4,b5,pi] 忽略其他变量,因为它们是在其他地方定义的 . 现在,我收到以下错误

回溯(最近一次调用最后一次):文件“trainmnist_mixture.py”,第55行,在encoder.createGradientFunctions()文件“/home/amartya/Variational-Autoencoder/Theano/VariationalAutoencoder_mixture.py”,第118行,在createGradientFunctions衍生词= T.grad(logp,gradvariables)文件“/usr/lib/python2.7/site-packages/Theano-0.6.0-py2.7.egg/theano/gradient.py”,第543行,在grad grad_dict,wrt ,cost_name)文件“/usr/lib/python2.7/site-packages/Theano-0.6.0-py2.7.egg/theano/gradient.py”,第1273行,在_populate_grad_dict rval = [access_grad_cache(elem)for文件“/usr/lib/python2.7/site-packages/Theano-0.6.0-py2.7.egg/theano/gradient.py”,第1233行,在access_grad_cache term = access_term_cache(node)[ idx]文件“/usr/lib/python2.7/site-packages/Theano-0.6.0-py2.7.egg/theano/gradient.py”,第944行,在access_term_cache中输出_grads = [access_grad_cache(var)for var在node.outputs]文件“/usr/lib/python2.7/site-packages/Theano-0.6.0-py2.7.egg/theano/gradient.py”,第1243行,在ac cess_grad_cache term.type.why_null)theano.gradient.NullTypeGradError:tensor.grad遇到了NaN . 此变量为Null,因为非零op的输入0(Subtensor {int64:int64:} . 0)的grad方法在数学上未定义

1 回答

  • 1

    您可以使用 RandomStreams 实例的 choice 方法 . 有关Theano中随机数的更多信息,请参阅文档herehere .

    这是一个例子:

    import numpy
    import theano
    import theano.tensor as tt
    import theano.tensor.shared_randomstreams
    
    n = 6
    alpha = [1] * n
    seed = 1
    w = theano.shared(numpy.random.randn(n, 2, 2).astype(theano.config.floatX))
    p = theano.shared(numpy.random.dirichlet(alpha).astype(theano.config.floatX))
    rng = tt.shared_randomstreams.RandomStreams(seed=seed)
    i = rng.choice(size=(1,), a=n, p=p)
    f = theano.function([], [p, i, w[i]])
    print f()
    print f()
    print f()
    print f()
    

相关问题