Tensorflow 操作和 Python 操作之间的混淆

Confusion Between Tensorflow Operations and Python Operations

查了一些相关的post,还是有些疑惑:什么时候用tensorflow库函数,什么时候用python库函数?两者经常混合在代码中,如下所示。

例如,为什么我们要使用tf.math.pow而不是python库math.pow?变量 warmup_percent_doneself.power 都是标量而不是张量流张量。

tf.math.pow(warmup_percent_done, self.power)

此外,global_step_float / warmup_steps_float 实际上重载了 tf.math.divide 操作?

源代码link:https://github.com/NVIDIA/DeepLearningExamples/blob/master/TensorFlow2/LanguageModeling/BERT/optimization.py#L52

  def __call__(self, step):
    with tf.name_scope(self.name or 'WarmUp') as name:
      # Implements polynomial warmup. i.e., if global_step < warmup_steps, the
      # learning rate will be `global_step/num_warmup_steps * init_lr`.
      global_step_float = tf.cast(step, tf.float32)
      warmup_steps_float = tf.cast(self.warmup_steps, tf.float32)
      warmup_percent_done = global_step_float / warmup_steps_float
      warmup_learning_rate = (
          self.initial_learning_rate *
          tf.math.pow(warmup_percent_done, self.power))
      return tf.cond(global_step_float < warmup_steps_float,
                     lambda: warmup_learning_rate,
                     lambda: self.decay_schedule_fn(step),
                     name=name)

更新:

所以,warmup_learning_rate必须是tensorflow张量对象,这样__call__函数才能return张量对象。还有两个问题:

  1. 在计算warmup_learning_rate的时候,为什么不把self.initial_learning_rate转换成tensorflow张量对象呢?

  2. 我们为什么要将其转换为 tensorflow 张量对象?

global_step_float = tf.cast(step, tf.float32) warmup_steps_float = tf.cast(self.warmup_steps, tf.float32)

TensorFlow 操作针对张量对象,因为 numpy 操作针对数组。

试着思考同一功能的这些实现之间的区别。

def sigmoid(x):
    return 1/(1+math.exp(-x))

def sigmoidnp(x):
    return 1/(1+np.exp(-x))

并尝试在 x = np.array([1, 2, 3, 4]) 上给他们打电话。你期待什么?

tf操作也是如此。它们作用于 return TensorFlow 个对象。

在示例中,您正在发帖,

...
global_step_float = tf.cast(step, tf.float32)
warmup_steps_float = tf.cast(self.warmup_steps, tf.float32)
warmup_percent_done = global_step_float / warmup_steps_float
...

变量 global_step_floatwarmup_steps_float 被转换为张量,因此,/ 运算实际上等同于 tf.math.divide,就像你求和一样两个列表

l1 = [1,2,3]
l2 = [4,5,6]

l = l1+l2

+ 等同于 l1.__add__(l2)