TensorFlow中各类除法算子的区别及实用场景解析
作为TensorFlow新手,刚碰到这些五花八门的除法函数确实容易头大——别慌,我结合你贴的代码示例,一个个给你掰扯清楚它们的区别和什么时候该用哪个:
首先先把你的代码整理成可运行的格式:
import tensorflow as tf a = tf.constant([2, 2], name='a') b = tf.constant([[0, 1], [2, 3]], name='b') with tf.Session() as sess: print(sess.run(tf.div(b, a))) # ⇒ [[0 0] [1 1]] print(sess.run(tf.divide(b, a))) # ⇒ [[0. 0.5] [1. 1.5]] print(sess.run(tf.truediv(b, a))) # ⇒ [[0. 0.5] [1. 1.5]] print(sess.run(tf.floordiv(b, a))) # ⇒ [[0 0] [1 1]] # print(sess.run(tf.realdiv(b, a))) # ⇒ Error: only works for real values print(sess.run(tf.truncatediv(b, a))) # ⇒ [[0 0] [1 1]] print(sess.run(tf.floor_div(b, a))) # ⇒ [[0 0] [1 1]]
1. tf.div
这是TensorFlow早期的“元老级”除法函数,行为和Python 2的/一模一样:
- 如果输入全是整数,就执行截断除法(直接砍掉小数部分,向零取整);如果有浮点数,就返回浮点结果。
- 你示例里的输入都是整数,所以1/2得到0,3/2得到1,结果都是整数数组。
- 注意:现在这个API已经被官方弃用了(TensorFlow 2.x里直接移除了),老代码里可能会见到,新代码别用它!
2. tf.divide
这就是文档里说的“Python风格除法”,完全对齐Python 3的/:
- 不管输入是整数还是浮点数,都会返回浮点型的精确除法结果,老老实实保留小数部分。
- 你示例里1/2得到0.5,3/2得到1.5,结果都是浮点数组。
- 应用场景:绝大多数需要精确除法的场景都能用,比如计算平均值、比例、概率这类需要小数结果的任务,是TensorFlow 2.x里推荐的通用除法方式。
3. tf.truediv
和tf.divide几乎是双胞胎,同样返回浮点型精确除法结果:
- 唯一区别是它要求输入类型必须一致(要么全是整数,要么全是浮点数),而
tf.divide支持整数和浮点数混合输入。 - 你示例里输入都是整数,所以输出和
tf.divide完全一样。 - 注意:TensorFlow 2.x里已经把它合并到
tf.divide里了,新代码优先用tf.divide就行。
4. tf.floordiv / tf.floor_div
这俩是同一个函数的不同名字(tf.floor_div是更规范的新命名),执行地板除法:
- 地板除法是向负无穷方向取整,而不是向零取整。你示例里都是正整数,所以和截断除法结果一样;但如果是负数,比如
-3/2,地板除法会得到-2,而截断除法会得到-1。 - 应用场景:需要明确向下取整的场景,比如把10个元素分成每份3个,需要得到3份(而不是4份),或者某些数学计算里必须遵循地板取整规则的时候。
5. tf.truncatediv
专门做整数截断除法的函数:
- 只接受整数类型输入,返回也是整数,结果是向零方向取整(砍掉小数部分)。和
tf.div在整数输入时的行为一样,但它的用途更明确。 - 你示例里的结果和
tf.div一致,但如果输入是负数,比如-3/2,会得到-1。 - 应用场景:需要明确得到整数结果且截断小数的场景,比如计数、索引计算,避免不小心得到浮点数。
6. tf.realdiv
专门给**实数(浮点数)**用的除法函数:
- 要求输入必须是浮点数类型,不能是整数,否则直接报错。它的作用是强制确保只对实数执行除法,避免整数除法的意外行为。
- 你示例里输入是整数,所以报错;如果把
a和b改成浮点型(比如tf.constant([2.0, 2.0])),就能得到和tf.divide一样的结果。 - 应用场景:在一些严格要求实数运算的科学计算场景中使用,防止因为输入是整数而触发截断除法。
快速总结
- 要精确浮点除法:用
tf.divide(TensorFlow 2.x首选) - 要整数截断除法(向零取整):用
tf.truncatediv - 要地板除法(向负无穷取整):用
tf.floor_div - 老代码里的
tf.div和tf.truediv建议逐步替换成上面的新函数
内容的提问来源于stack exchange,提问作者DuttaA
相关产品推荐
相关产品推荐

