如何将值从一个Tensorflow变量复制到另一个变量?

时间:2018-12-17 05:43:36

标签: python tensorflow keras

我正在使用Tensorflow后端与Keras进行实验,并试图更好地理解张量变量的工作原理。我已经修改了Keras的随机梯度下降的更新功能,以查看是否可以将值从一个变量复制到另一个变量。

此刻,我不能,但是不知道为什么。

我已经修改了SGD类的get_updates方法,以创建params变量的副本,该变量存储了网络的权重和偏差。我以与原始副本相同的方式更新此副本。当我使用副本的更新值更新原件时,似乎没有值要更新。当我使用原始文件的更新值更新原始文件时,该更新有效。我不知道为什么一个案例可行,而另一个案例不可行。

下面是get_updates方法的修改版本。我既可以通过常规(合理)的方式来更新params变量,又可以展示如何使用副本进行更新。

@interfaces.legacy_get_updates_support
def get_updates(self, loss, params):
    # Copy parameters - Create copy of net parameters
    params_tmp = []
    for p in params:
        params_tmp.append(K.variable(K.get_value(p), name=p.name[:-2] + "_cpy/"))

    self.updates = [K.update_add(self.iterations, 1)]
    self.weights = [self.iterations]

    grads = self.get_gradients(loss, params)  # Get Initial Gradient
                                              # for Heun
    for p, p_tmp, g in zip(params, params_tmp, grads):
        v = - self.lr * g
        new_p = p + v
        new_p_tmp = p_tmp + v   # Getting intermediate update
                                # using first gradient from Heun

        # Apply constraints.
        if getattr(p, 'constraint', None) is not None:
            new_p = p.constraint(new_p)
        if getattr(p_tmp, 'constraint', None) is not None:
            new_p_tmp = p_tmp.constraint(new_p_tmp)

        # Copy completed Heun update back to original param
        self.updates.append(K.update(p, new_p_tmp))  # Doesnt Work
        #self.updates.append(K.update(p, new_p))     # Works

    return self.updates

对于Tensorflow Keras,更新功能为

def update(x, new_x):
    """Update the value of `x` to `new_x`.

    # Arguments
        x: A `Variable`.
        new_x: A tensor of same shape as `x`.

    # Returns
        The variable `x` updated.
    """
    return tf.assign(x, new_x)

为什么不能使用副本的更新值来更新params变量?

0 个答案:

没有答案