我正在使用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变量?