【发布时间】:2018-06-30 21:48:13
【问题描述】:
我想优化一个变量(负二项分布的参数),用一些最大矩估计器预先初始化:
sample_data = tf.placeholder(tf.float32)
(r, p) = fit_mme(sample_data) # pre-calculation
# The important part: make `r` trainable
r = tf.Variable(r, dtype=tf.float32, name="r")
#####################################################
# to clarify: from here training of `r`
mu = tf.reduce_mean(sample_data, axis=0, name="mu")
p = mu / (r + mu)
p = tf.identity(p, "p")
distribution = tf.contrib.distributions.NegativeBinomial(total_count=r,
probs=p,
name="nb-dist")
probs = distribution.log_prob(sample_data)
# minimize negative log probability
loss = -tf.reduce_sum(probs, name="loss")
train_op = tf.train.AdamOptimizer(learning_rate=0.05)
train_op = train_op.minimize(loss, global_step=tf.train.get_global_step())
errors = []
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(10000):
(probs_res, loss_res, _) = \
sess.run((probs, loss, train_op), feed_dict={sample_data: x})
errors.append(loss_res)
print(i)
r_estim = probs_res.total_count
fit_mme:
def fit_mme(sample_data, replace_values=None, name=None):
"""
Calculates the Maximum-of-Momentum Estimator of `NB(r, p)` for given sample data along axis 0.
:param sample_data: matrix containing samples for each distribution on axis 0\n
E.g. `(N, M)` matrix with `M` distributions containing `N` observed values each
:param replace_values: Matrix of size `shape(sample_data)[1:]`
:param name: A name for the operation (optional).
:return: estimated values of `r` and `p`
"""
with tf.name_scope(name, "MME"):
mean = tf.reduce_mean(sample_data, axis=0, name="mean")
variance = tf.reduce_mean(tf.square(sample_data - mean),
axis=0,
name="variance")
if replace_values is None:
replace_values = tf.fill(tf.shape(variance), math.nan, name="NaN_constant")
r_by_mean = tf.where(tf.less(mean, variance),
mean / (variance - mean),
replace_values)
r = r_by_mean * mean
r = tf.identity(r, "r")
p = 1 / (r_by_mean + 1)
p = tf.identity(p, "p")
return r, p
但是,我收到以下错误:
ValueError: initial_value 必须具有指定的形状: 张量("MME/r:0", dtype=float32)
有没有更好/更干净的解决方案让r 可训练?
【问题讨论】:
-
您的代码不清楚。我不明白你想达到什么目的
-
我添加了一个完整的代码示例。现在清楚了吗?
标签: python tensorflow