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在张量上。
我有一个关于 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在张量上。