今天在学习TensorFlow Basic Api的时候,碰到了一个有趣的现象。
题目是计算以2为基数的等比数列的和, example code是这样的:
@tf.function
def converge_to_2(iters_n):
total = tf.constant(0.)
increment = tf.constant(1.)
for _ in range(iters_n):
total += increment
increment /= 2.0
return total
result = converge_to_2(20)
print(result)
我起初以为这代码是错误的,为什么total已经被声明成了tf.constant,但却依然可以被赋值?那consant的意义何在呢。可是运行了一下,却输出了正确的结果。
经过我的反复思考,我得到了自己的答案。
首先,Python的变量类型是动态的,也许这个变量此时还是一个数组,下一个语句执行完了之后它就变成了字典。那既然是这样,Python就不应该存在真正的const类型。
但Python是可以存在const的,对么,因为Python中的一切都是对象,而对象的魔术方法中有专门处理赋值的,我们可以在这里做手脚,实现对想声明为const对象的无法赋值操作。
But, Why Constant in Tensorflow do it?
其实我们只要想象一下,为什么Tf要定义constant这个变量,绝不是让你在平时的科学计算里使用的,当我们在Train一个Neural Network的时候,要保持一些量不随梯度所改变,而需要随梯度所改变的,我们使用tf.Variable。所以tf.constant没必要对科学计算进行处理,只需要对tf内部的某些运算做处理即可。