tf.GradientTape() 的 __exit__ 函数的参数是什么?

根据 的文档,tf.GradientTape其__exit__()方法采用三个位置参数:typ, value, traceback.


这些参数究竟是什么?


该语句如何with推断它们?


我应该在下面的代码中给它们什么值(我没有使用with语句的地方):


x = tf.Variable(5)


gt = tf.GradientTape()

gt.__enter__()

y = x ** 2

gt.__exit__(typ = __, value = __, traceback = __)


一只萌萌小番薯
浏览 110回答 1
1回答

大话西游666

sys.exc_info()返回具有三个值的元组(type, value, traceback)。这里type获取正在处理的Exception的异常类型value是传递给异常类的构造函数的参数。traceback包含堆栈信息,如发生异常的位置等。在 GradientTape 上下文中,当异常发生时,sys.exc_info()详细信息将传递给exit&nbsp;() 函数,后者将Exits the recording context, no further operations are traced。下面是说明相同的示例。让我们考虑一个简单的函数。def&nbsp;f(w1,&nbsp;w2): &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;3&nbsp;*&nbsp;w1&nbsp;**&nbsp;2&nbsp;+&nbsp;2&nbsp;*&nbsp;w1&nbsp;*&nbsp;w2通过不使用with语句:w1, w2 = tf.Variable(5.), tf.Variable(3.)tape = tf.GradientTape()z = f(w1, w2)tape.__enter__()dz_dw1 = tape.gradient(z, w1)try:&nbsp; &nbsp; dz_dw2 = tape.gradient(z, w2)except Exception as ex:&nbsp; &nbsp; print(ex)&nbsp; &nbsp; exec_tup = sys.exc_info()&nbsp; &nbsp; tape.__exit__(exec_tup[0],exec_tup[1],exec_tup[2])印刷:GradientTape.gradient 只能在非持久性磁带上调用一次。即使你没有通过传递值显式退出,程序也会传递这些值来退出GradientTaoe记录,下面是示例。w1, w2 = tf.Variable(5.), tf.Variable(3.)tape = tf.GradientTape()z = f(w1, w2)tape.__enter__()dz_dw1 = tape.gradient(z, w1)try:&nbsp; &nbsp; dz_dw2 = tape.gradient(z, w2)except Exception as ex:&nbsp; &nbsp; print(ex)打印相同的异常消息。通过使用with语句。with tf.GradientTape() as tape:&nbsp; &nbsp; z = f(w1, w2)dz_dw1 = tape.gradient(z, w1)try:&nbsp; &nbsp; dz_dw2 = tape.gradient(z, w2)except Exception as ex:&nbsp; &nbsp; print(ex)&nbsp; &nbsp; exec_tup = sys.exc_info()&nbsp; &nbsp; tape.__exit__(exec_tup[0],exec_tup[1],exec_tup[2])以下是sys.exc_info()对上述异常的响应。(RuntimeError,&nbsp;RuntimeError('GradientTape.gradient can only be called once on non-persistent tapes.'),&nbsp;<traceback at 0x7fcd42dd4208>)编辑 1:如user2357112 supports Monica评论中所述。为非异常情况提供解决方案。在非异常情况下,规范要求传递给的值都__exit__应该是None.示例 1:x = tf.constant(3.0)g = tf.GradientTape()g.__enter__()g.watch(x)y = x * xg.__exit__(None,None,None)z&nbsp; = x*xdy_dx = g.gradient(y, x)&nbsp;# dz_dx = g.gradient(z, x)&nbsp;print(dy_dx)# print(dz_dx)印刷:tf.Tensor(6.0, shape=(), dtype=float32)&nbsp;由于在它返回梯度值 y之前已经被捕获。__exit__示例 2:x = tf.constant(3.0)g = tf.GradientTape()g.__enter__()g.watch(x)y = x * xg.__exit__(None,None,None)z&nbsp; = x*x# dy_dx = g.gradient(y, x)&nbsp;dz_dx = g.gradient(z, x)&nbsp;# print(dy_dx)print(dz_dx)印刷:None&nbsp;这是因为在梯度停止记录z之后被捕获。__exit__
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python