[英]Use Keras optimizer on TF tensor
我的意思是,我知道他需要一个 ID 来跟踪他需要的东西,比如那个变量的最后一个梯度等等,但我们不能只为特定张量提供一个优化器吗?
a = tf.convert_to_tensor([1.])
with tf.GradientTape() as tape:
tape.watch(a)
loss = a**2
grad = tape.gradient(loss, a)
print(grad)
# <tf.Tensor: shape=(1,), dtype=float32, numpy=array([2.], dtype=float32)>
因此我们可以计算张量的梯度,但是对于这个梯度我们什么也做不了,因为它不是一个Variable
,因此我们不能只做以下事情:
K.optimizers.Adam().apply_gradients(zip(grad, a))
因为我们会得到:
AttributeError: 'tensorflow.python.framework.ops.EagerTensor' object 没有属性 '_unique_id'
但是我们可以,我的意思是,优化器类似于w = w - stepsize * grad
,我们有w
,我们有grad
,为什么我们不能在优化器内部这样做? 我可以做些什么来将 Adam 论文中的公式应用于w
而无需将其tf.Variable
吗?
我在不使用变量的情况下从头开始编写 Adam 优化器,因此它可用于一般张量
如果有人需要它,它如下:
class TensorAdamOptimizer:
def __init__(self, stepsize=1e-3, beta_1=0.9, beta_2=0.999, eps=1e-10):
self.stepsize = stepsize
self.beta_1 = beta_1
self.beta_2 = beta_2
self.eps = eps
self.time = 0
self.first_movement = None
self.second_movement = None
def init(self, shape):
self.first_movement = tf.zeros(shape)
self.second_movement = tf.zeros(shape)
def calculate_update(self, gradient):
if self.first_movement is None or self.second_movement is None:
self.init(tf.shape(gradient))
self.time = self.time + 1
self.first_movement = self.beta_1 * self.first_movement + (1 - self.beta_1) * gradient
self.second_movement = self.beta_2 * self.second_movement + (1 - self.beta_1) * (gradient**2)
first_movement_corrected = self.first_movement / (1 - self.beta_1**self.time)
second_movement_corrected = self.second_movement / (1 - self.beta_2**self.time)
return self.stepsize * first_movement_corrected / (tf.sqrt(second_movement_corrected) + self.eps)
def reset(self):
self.first_movement = tf.zeros_like(self.first_movement)
self.second_movement = tf.zeros_like(self.second_movement)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.