Tensorflow - 映射函数

Tensorflow - Map-Function

我有一个关于 tf 的地图功能的问题。 我遇到了这个函数的奇怪行为。如果我按照手册中的说明进行

label_tensor # shape [150, 1]
y = tf.map_fun(lambda x: x*x, label_tensor)
#  returns y as a tensor with label_tensor x^2

然而,如果我想实现我自己的功能,它似乎不起作用。它总是将张量传递给指定的函数,该函数不是用来处理张量的。

y = tf.map_fn(special_fun, label_tensor)

def special_fun(key):
    return int(2000 * round(float(key)/2000))

#  TypeError: float() argument must be a string or a number, not 'Tensor'

不知何故,我在这里没有看到这个问题。 另外,如果我尝试类似的事情: tmp_label_list = tf.Session().运行(label_tensor) 打印(tmp_label_list) # 打印出一个评估列表,[1, 2, 3, 3, 1, 2, 2,...] 但是如果我然后通过 [special_fun(i) for i in tmp_label_list] 它再次引发类型错误,它期望没有 'Tensor'

我错过了什么或做错了什么?提前致谢。

tf.map_fn中,给定函数应接受与给定张量具有相同形状但移除第一维的张量(即,函数将接收每个元素作为张量)。无论如何,您可以直接(更有效地)完成您尝试做的事情,而无需使用 tf.map_fn:

y = tf.cast(2000 * tf.round(tf.cast(key, tf.float32) / 2000), tf.int32)

tf.map_fn 通常保留用于无法进行矢量化的特殊情况。但是,如果您无论如何都想使用它,则必须执行以下操作:

y = tf.map_fn(special_fun, label_tensor)

def special_fun(key):
    return tf.cast(2000 * tf.round(tf.cast(key, tf.float32) / 2000), tf.int32)

还有 tf.py_func,它允许您将常规 Python 函数应用于张量(在这种情况下不是它的每个元素,而是作为一个整体的张量,给定为一个 NumPy 数组)。这对于特定情况也很有用,但您应该尽可能避免使用它,因为它效率较低,而且无法序列化。

他们 key 传递给您 special_fun 的参数将是一个张量。您不能在张量上使用 Python 类型转换,因为这些在代码为 运行 时只是象征性的,所以 Python 不知道如何处理它们。崩溃发生在 float(),但同样会发生在 round() 以及 int() 您正在寻找的可能是

def special_fun(key):
    return tf.cast(2000 * tf.round(tf.cast(key, tf.float32)/2000), tf.int32)

也就是说,我们是用Tensorflow自带的函数来做casting/rounding。请记住,Tensorflow 定义了一些重载运算符(例如 +, -, *),但在深处这些只是对 tf.add, tf.multiply 等的调用。一般来说,您不能使用 Python 内置 operators/functions在张量上。