发新帖

自动微分,优化机器学习模型的关键技术

[复制链接]
592 0

快来加入 TensorFlowers 大家庭!

您需要 登录 才可以下载或查看,没有帐号?加入社区

x
今天的内容,我们将介绍自动微分,这是优化机器学习模型的关键技术。

设置

导入tensorflow为tf

tf.enable_eager_execution()

梯度带

TensorFlow提供用于自动微分的tf.GradientTape API  - 计算与其输入变量相关的计算梯度.TensorFlow通过tf.GradientTape“记录”在上下文中执行的所有操作到“磁带”(tape)上。然后,TensorFlow使用该磁带和与每个记录操作相关联的梯度来计算使用反向模式微分的“记录”计算的梯度。

例如:
x = tf.ones((2,2))
  
,tf.GradientTape()为t:
  t.watch(x)
  y = tf.reduce_sum(x)
  z = tf.multiply(y,y)#z的

导数相对于[0,1]中i 的原始输入张量x
dz_dx = t.gradient(z,x):
对于[0,1]
  中的j:
    断言dz_dx [j] .numpy()== 8.0

您还可以根据“记录”tf.GradientTape上下文时计算的中间值请求输出的梯度。
x = tf.ones((2,2))
  
,tf.GradientTape()为t:
  t.watch(x)
  y = tf.reduce_sum(x)
  z = tf.multiply(y,y)

#使用磁带计算z相对于
#中间值y的导数。
dz_dy = t.gradient(z,y)
断言dz_dy.numpy()== 8.0

默认情况下,GradientTape持有的资源会在调用GradientTape.gradient()方法后立即释放。要在同一计算中计算多个梯度,创建一个持久的梯度带。这允许多次调用gradient()方法。当磁带对象tape被垃圾收集时释放资源。例如:
x = tf.constant(3.0)
,tf.GradientTape(persistent = True)为t:
  t.watch(x)
  y = x * x
  z = y * y
dz_dx = t.gradient(z,x)#108.0(4) * x ^ 3 at x = 3)
dy_dx = t.gradient(y,x)#6.0
del t#删除对磁带的引用

记录控制流

因为磁带(tape)在执行时记录操作,所以自然会处理Python控制流(例如使用ifs和whiles):
def f(x,y):
  输出= 1.0
  ,范围内的i(y):
    如果i> 1且i <5:
      输出= tf.multiply(输出,x)
  返回输出

def grad(x,y):
  with tf .GradientTape()as t:
    t.watch(x)
    out = f(x,y)
  return t.gradient(out,x)

x = tf.convert_to_tensor(2.0)

assert grad(x,6).numpy()= = 12.0
断言grad(x,5).numpy()== 12.0
断言grad(x,4).numpy()== 4.0

高阶梯度

<br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br>
x = tf.Variable(1.0)#创建一个初始化为1.0的Tensorflow变量

,tf.GradientTape()为t:
  tf.GradientTape()为t2:
    y = x * x * x
  #计算't'内的渐变上下文管理器
  #,这意味着梯度计算也是可区分的。
  dy_dx = t2.gradient(y,x)
d2y_dx2 = t.gradient(dy_dx,x)

断言dy_dx.numpy()== 3.0
断言d2y_dx2.numpy()== 6.0

下一步

以上教程中,我们介绍了TensorFlow中的梯度计算。有了这些,我们就有了足够的基本要素来构建和训练神经网络。

本楼点评(0) 收起
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

快速回复 返回顶部 返回列表