TensorFlow 的 clip_by_value() 函数不同版本间的行为变化

(原创文章,版权所有。转载请注明出处!)

The behavior of tensorflow’s clip_by_value() function since r1.8 has changed, and the documentation has not been mentioned.

PointCNN 训练 S3DIS 分割运行脚本时,提示 clip_by_value() 函数参数错误:最大最小值与 t 不同型。

问题出在 TensorFlow 的 tf.clip_by_value() 函数的行为在不同版本之间发生改变。

r1.6 的代码如下:

r1.7 版没有变化。

r1.8 的代码如下:

此版的 clip_by_value() 仅作引用,具体功能由 gen_math_ops.clip_by_value() 实现。该函数的描述没有更改,官方文档也只字未动。由于 gen* 类文件是编译时生成,故原码中没有。

而 gen_math_ops.clip_by_value() 的源代码为:

再观察 r1.9 和 master 版本中的注释,此后对于 clip_by_value() 的实现方式会沿用 r1.8 的实现方式。

v1.9.0 已经于 2018年7月10日发布。v1.8.0 中将 clip_by_value() 具体实现移入 gen_math_ops.cc 文件的做法没有沿用,新版又改回 v1.7.0 的版本,即直接实现函数功能。不过 TODO 注释依然存在,其内容要求负责人两周内修改,实际上到现在为止(2018年8月1日,v1.10.0-rc1已发布)依然没有修改。

从 r1.8 开始,PointCNN 便无法运行。之后的版本虽然未发布,但可以预计,PointCNN 如果不做修改则无法在后续版本中运行。

附说明文档:clip_by_value()

该函数的作用是根据值的范围来修剪张量。

第一个参数就是待修剪的张量 t。

第二个参数定义最小值。参数的类型可以是一个标量,表示待修剪张量的所有元素都必须大于等于该最小值,也可以是一个与待修剪张量同尺寸的张量,表示待修剪张量对应元素的最小值。

第三个参数定义最大值。用法与第二个参数相同。

返回值为修剪后的结果,形状与待修剪的张量相同。

例如:

则输出应该是:

又如:

则输出应该是:

再如

r1.6/1.7 的输出是(the output using r1.6/1.7):

但是从 r1.8 开始,不再允许与张量的分量同型的向量作为参数。如果第二、三个参数是张量,则必须与第一个参数绝对同型,否则将抛出异常。

However, since r1.8 and beyond, the shape of the clip_value parameter must be exactly the same as t, otherwise it will throw an exception if you pass a vector.

注意:你需要自行保证最小值小于等于最大值,否则最大值不生效。

关于 “TensorFlow 的 clip_by_value() 函数不同版本间的行为变化” 的 1 个意见

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据