1
工作学习的榜样tf.contrib.distributions.MultivariateNormalDiag的参数:无法通过优化
import numpy as np
import tensorflow as tf
## construct data
np.random.seed(723888)
N,P = 50,3 # number and dimensionality of observations
Xbase = np.random.multivariate_normal(mean=np.zeros((P,)), cov=np.eye(P), size=N)
## construct model
X = tf.placeholder(dtype=tf.float32, shape=(None, P), name='X')
mu = tf.Variable(np.random.normal(loc=0.0, scale=0.1, size=(P,)), dtype=tf.float32, name='mu')
xDist = tf.contrib.distributions.MultivariateNormalDiag(loc=mu, scale_diag=tf.ones(shape=(P,), dtype=tf.float32), name='xDist')
xProbs = xDist.prob(X, name='xProbs')
## prepare optimizer
eta = 1e-3 # learning rate
loss = -tf.reduce_mean(tf.log(xProbs), name='loss')
optimizer = tf.train.AdamOptimizer(learning_rate=eta).minimize(loss)
## launch session
with tf.Session() as sess:
tf.global_variables_initializer().run()
sess.run(optimizer, feed_dict={X: Xbase})
我想要做的优化过的tensorflow多元高斯分布的参数,如我上面的例子。我可以成功运行诸如sess.run(loss, feed_dict={X: Xbase})
之类的命令,所以我已经正确实施了分发。当我尝试运行优化操作时,出现奇怪的错误消息:
InvalidArgumentError: -1 is not between 0 and 3
[[Node: gradients_1/xDist_7/xProbs/Prod_grad/InvertPermutation = InvertPermutation[T=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"](gradients_1/xDist_7/xProbs/Prod_grad/concat)]]
Caused by op 'gradients_1/xDist_7/xProbs/Prod_grad/InvertPermutation'
我不明白。
如果我使用tf.contrib.distributions.MultivariateNormalFullCovariance
而不是tf.contrib.distributions.MultivariateNormalDiag
,则会得到相同的错误消息。如果scale_diag
而不是loc
是正在优化的变量,则不会收到错误。
使用'.log_prob'工程。谢谢;我没有多少使用'tf.Distributions'。 – ostrichgroomer
我追查过这个问题。看起来,TF的发布版本没有正确处理'reduce_prod'的负索引。这个问题已经在master中解决了。无论如何,'log_prob'是首选。另请注意:由于原因太复杂,最好使用'tf.get_variable'而不是'tf.Variable'。祝你好运! – jvdillon
另请参阅:https://github.com/tensorflow/tensorflow/issues/10766 – jvdillon