如何在Tensorflow 2中将GradientTape与AutoGraph一起使用?

时间:2019-09-06 20:49:12

标签: python-3.x tensorflow

我不知道如何在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)的单元格。

1 个答案:

答案 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