关于tf.GradientTape()的常用方法

GradientTape,字面意思就是‘梯度磁带’,是Tensorflow 的 eager模式下计算梯度用的,这是一个自动求解模型梯度的利器。而eager模式是TensorFlow 2.0的默认模式,什么是eager模式呢,简单来说就是简化了Tensorflow 1.0一些复杂的操作,省略了session 等用法,可以直接打印输出变量等

  • tf.GradientTape()中 默认 参数watch_accessed_variables=True ,也就是监控所有可训练变量。当然我们也可以自己指定需要计算梯度的变量,可以使用.watch()对其进行监控(求梯度)。
  • 比如:计算y=x^3在x = 8时的导数:
x = tf.constant(8.0) #x是constant类型,不在可训练变量范围内
with tf.GradientTape() as g:
  g.watch(x) #自己设置的监控变量
  y = pow(x,3)
dy_dx = g.gradient(y, x) # y’ = 3*x^2 = 3*8^2 = 192
  • 还可以这直接 把 watch_accessed_variables设置为False,关闭监控所有可训练变量,然后使用.watch()监控我们所需的变量

下面举一个自己遇到的在深度学习模型上的例子,也是默认 参数watch_accessed_variables=True 的例子

  • 这是部分代码
#指定计算损失的函数和优化器函数
loss_func = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
  • 使用tf.GradientTape()函数,注释中有相关函数的一些作用
        with tf.GradientTape() as tape:
            output = model(images, training=True)
            loss = loss_func(labels, output)
        gradients = tape.gradient(loss, model.trainable_variables) #这是求loss对model.trainable_variables(所有可训练参数)的导数(梯度)
                                                                   #loss是求导的因变量,后者是自变量。类似上面的y和x的关系
         #应用优化器的apply_gradients()函数,来进行梯度更新实现优化                                           
        optimizer.apply_gradients(zip(gradients, model.trainable_variables)) #更新zip中model.trainable_variables(模型中所有可训练参数)的梯度

小白一枚,欢迎各位大佬指正

你可能感兴趣的:(tensorflow,深度学习,python)