Tensorflow 操作和 Python 操作之间的混淆
Confusion Between Tensorflow Operations and Python Operations
查了一些相关的post,还是有些疑惑:什么时候用tensorflow库函数,什么时候用python库函数?两者经常混合在代码中,如下所示。
例如,为什么我们要使用tf.math.pow
而不是python库math.pow
?变量 warmup_percent_done
和 self.power
都是标量而不是张量流张量。
tf.math.pow(warmup_percent_done, self.power)
此外,global_step_float / warmup_steps_float
实际上重载了 tf.math.divide
操作?
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张量对象。还有两个问题:
在计算warmup_learning_rate
的时候,为什么不把self.initial_learning_rate
转换成tensorflow张量对象呢?
我们为什么要将其转换为 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_float
和 warmup_steps_float
被转换为张量,因此,/
运算实际上等同于 tf.math.divide
,就像你求和一样两个列表
l1 = [1,2,3]
l2 = [4,5,6]
l = l1+l2
+
等同于 l1.__add__(l2)
查了一些相关的post
例如,为什么我们要使用tf.math.pow
而不是python库math.pow
?变量 warmup_percent_done
和 self.power
都是标量而不是张量流张量。
tf.math.pow(warmup_percent_done, self.power)
此外,global_step_float / warmup_steps_float
实际上重载了 tf.math.divide
操作?
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张量对象。还有两个问题:
在计算
warmup_learning_rate
的时候,为什么不把self.initial_learning_rate
转换成tensorflow张量对象呢?我们为什么要将其转换为 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_float
和 warmup_steps_float
被转换为张量,因此,/
运算实际上等同于 tf.math.divide
,就像你求和一样两个列表
l1 = [1,2,3]
l2 = [4,5,6]
l = l1+l2
+
等同于 l1.__add__(l2)