Skip to main content
 首页 » 编程设计

python之Tensorflow之映射函数

2024年09月07日31mq0036

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

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().run(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 数组给出)。这对于特定情况也很有用,但您应该尽可能避免使用它,因为它效率较低,而且无法序列化。