说我有一个数组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]
忽略其他变量,因为它们是在其他地方定义的。现在,我收到以下错误
Traceback(最近一次调用最后一次): 文件" trainmnist_mixture.py",第55行,in 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_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 = wrt中elem的[access_grad_cache(elem)]
文件" /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中 output_grads = [node_outputs中var的[access_grad_cache(var)]
文件" /usr/lib/python2.7/site-packages/Theano-0.6.0-py2.7.egg/theano/gradient.py",第1243行,在access_grad_cache中 term.type.why_null)
theano.gradient.NullTypeGradError:tensor.grad遇到了NaN。此变量为Null,因为Nonzero op的输入0(Subtensor {int64:int64:}。0)的grad方法在数学上未定义
答案 0 :(得分:1)
您可以使用choice
实例的RandomStreams
方法。有关Theano中随机数的更多信息,请参阅文档here和here。
以下是一个例子:
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()