繁体   English   中英

在 TF 张量上使用 Keras 优化器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM