我不知道如何在Tensorflow 2中的AutoGraph上运行GradientTape代码。
我想在TPU上运行GradientTape代码。我想从在CPU上测试开始。使用AutoGraph,TPU代码的运行速度会更快。我尝试观察输入变量,然后尝试将参数传递给包含GradientTape的函数,但均失败。
我在这里做了一个可复制的例子: https://colab.research.google.com/drive/1luCk7t5SOcDHQC6YTzJzpSixIqHy_76b#scrollTo=9OQUYQtTTYIt
代码和相应的输出如下:
它们都以ALTER TABLE test.test_004
DROP COLUMN value
int size = 0;
Scanner in = new Scanner(System.in);
Random rand = new Random();
System.out.println("Enter a number");
int usersNumber = in.nextInt();
boolean active = false;
while(!active){
if(usersNumber>0){
int[] numbersList = new int[usersNumber];
int total = 0;
for(int i = 0; i <= numbersList.length ; i++){
numbersList[i] = rand.nextInt(100);
}
for(int d: numbersList){
total+=d;
}
int average = (total/numbersList.length);
System.out.println("The average is " + average);
}else{
System.out.println("Please enter a non-negative number");
usersNumber = in.nextInt();
active = false;
}
}
输出:import tensorflow as tf
说明:使用急切执行,GradientTape产生渐变。
x = tf.constant(3.0)
with tf.GradientTape() as g:
g.watch(x)
y = x * x
dy_dx = g.gradient(y, x)
print(dy_dx)
输出:tf.Tensor(6.0, shape=(), dtype=float32)
说明:在TF2中的GradientTape上使用AutoGraph会导致空渐变
@tf.function
def compute_me():
x = tf.constant(3.0)
with tf.GradientTape() as g:
g.watch(x)
y = x * x
dy_dx = g.gradient(y, x) # Will compute to 6.0
print(dy_dx)
compute_me()
输出:Tensor("AddN:0", shape=(), dtype=float32)
说明:传递参数也失败
我期望所有单元格都输出@tf.function
def compute_me_args(x):
with tf.GradientTape() as g:
g.watch(x)
y = x * x
dy_dx = g.gradient(y, x) # Will compute to 6.0
print(dy_dx)
x = tf.constant(3.0)
compute_me_args(x)
,但是使用AutoGraph输出Tensor("AddN:0", shape=(), dtype=float32)
的单元格。
答案 0 :(得分:1)
这不是“失败”,只是print
(如果在tf.function
的上下文中使用(即在图形模式下)将打印符号张量,而这些张量不会值。尝试以下方法:
@tf.function
def compute_me():
x = tf.constant(3.0)
with tf.GradientTape() as g:
g.watch(x)
y = x * x
dy_dx = g.gradient(y, x) # Will compute to 6.0
tf.print(dy_dx)
compute_me()
这应该打印6
。您需要做的就是改为使用tf.print
,它足够“聪明”,可以打印实际值(如果有)。或者,使用返回值:
@tf.function
def compute_me():
x = tf.constant(3.0)
with tf.GradientTape() as g:
g.watch(x)
y = x * x
dy_dx = g.gradient(y, x) # Will compute to 6.0
return dy_dx
result = compute_me()
print(result)
输出类似<tf.Tensor: id=43, shape=(), dtype=float32, numpy=6.0>
的内容。您也可以在此处看到值(6.0)。使用result.numpy()
即可获得6.0
。