tf.py_func,自定义张量流函数仅应用于张量中的第一个元素

时间:2017-11-28 23:06:21

标签: python-2.7 numpy tensorflow deep-learning

我是tensorflow的新手,正在玩一个深度学习网络。我希望在每次迭代后对所有权重进行自定义舍入。由于tensorflow库中的round函数没有为您提供将值舍入到一定数量的小数点的选项。 所以我写了这个

import numpy as np
import tensorflow as tf
from tensorflow.python.framework import ops

np_prec = lambda x: np.round(x,3).astype(np.float32)
def tf_prec(x,name=None):
     with ops.name_scope( "d_spiky", name,[x]) as name:
          y = tf.py_func(np_prec,
                         [x],
                         [tf.float32],
                         name=name,
                         stateful=False)
          return y[0]
with tf.Session() as sess:

     x = tf.constant([0.234567,0.712,1.2,1.7])
     y = tf_prec(x)
     y = tf_prec(x)
     tf.global_variables_initializer

     print(x.eval(), y.eval())

我得到的输出是

[ 0.234567    0.71200001  1.20000005  1.70000005] [ 0.235       0.71200001  1.20000005  1.70000005]

因此,自定义四舍五入仅适用于张量中的第一项,我不确定我做错了什么。提前谢谢。

1 个答案:

答案 0 :(得分:1)

这里的错误是因为以下行

np_prec = lambda x: np.round(x,3).astype(np.float32)

您正在将输出转换为 np.float32 。您可以通过以下代码验证错误,

print(np.round([0.234567,0.712,1.2,1.7], 3).astype(np.float32)) #prints [ 0.235       0.71200001  1.20000005  1.70000005]

np.round 的默认输出为 float64 。此外,您还必须将 tf.py_func 中的 Tout 参数更改为 float64

我已经使用上述修复程序提供了以下代码,并在必要时进行了注释。

import numpy as np
import tensorflow as tf
from tensorflow.python.framework import ops

np_prec = lambda x: np.round(x,3)
def tf_prec(x,name=None):
     with ops.name_scope( "d_spiky", name,[x]) as name:
          y = tf.py_func(np_prec,
                         [x],
                         [tf.float64], #changed this line to tf.float64
                         name=name,
                         stateful=False)
          return y[0]
with tf.Session() as sess:

     x = tf.constant([0.234567,0.712,1.2,1.7],dtype=np.float64) #specify the input data type np.float64
     y = tf_prec(x)
     y = tf_prec(x)
     tf.global_variables_initializer

     print(x.eval(), y.eval())

希望这有帮助。