【问题标题】:Tensorflow: Make variable trainableTensorflow:使变量可训练
【发布时间】: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


【解决方案1】:

检查r 的形状。应该定义清楚。

我怀疑你有 */None/?对于第一个维度,您可以使用不同大小的批次。

要么使用tf.reshape 修复形状,要么使用tf.reduce_mean 或类似的东西折叠第一个维度。

【讨论】:

  • 我的问题是sample_datatf.placeholder()
  • 如果你打印tf.shape(r)你会得到什么?
  • shape=(?,) 所以批次中的每个项目都有一个结果。由于批量大小通常不固定,因此形状保持为?。使用 reduce_mean 将其折叠为单个数字,或者如果您认为每个示例都有一个数字,则使用 tf.reshape 指定形状。 TensorFlow 需要知道它有多少变量。
【解决方案2】:

很多事情我都不清楚。

为什么要“破坏”图表:

sample_data = tf.placeholder(tf.float32)
r, p = fit_mme(sample_data) # pre-calculation

# The important part: make `r` trainable
r_var = tf.Variable(r, dtype=tf.float32, name="r")

r 已经是一个可以更新的张量,因此您不需要将其值输入变量。特别是如果您不想对其进行任何 numpy 处理。

但是,如果你真的想这样做,你可以这样做:

x = tf.placeholder(tf.float32, shape=[None, 2])

r, p = fit_mme(x) # pre-calculation
r_var = tf.Variable(tf.zeros(tf.shape(r)), dtype=tf.float32, validate_shape=False, name="r_var")

r_assign_op = tf.assign(r_var, r)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    #print (sess.run(r_var, feed_dict={x: [[3.4, 4.6], [5.4, 6.8]]}))
    print ("r_var before assign: %s" % sess.run(r_var))

    r_var_t, _ = sess.run([r_var, r_assign_op], feed_dict={x: [[3.4, 4.6], [5.4, 6.8]]})
    print ("r_var after assign: %s" % r_var_t)

【讨论】:

  • "r 已经是一个可以更新的张量" 不,不是。这是我的问题。 fit_mmesample data 计算 r
    这就像线性回归与迭代优化的封闭形式解决方案。我想做两个:首先用封闭形式初始化,然后迭代优化它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 2022-01-25
  • 2020-07-16
  • 1970-01-01
  • 2016-09-16
  • 2019-12-07
  • 1970-01-01
相关资源
最近更新 更多