我有一个关于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) print(tmp_label_list) #打印出一个评估列表,1,2,3,3,1,2,2,...但是,如果我随后传递[special_fun(i) for i in tmp_label_list],它将再次引发类型错误,即它不需要'Tensor'
我遗漏了什么或做错了什么?提前谢谢。
发布于 2018-09-10 17:43:23
在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数组的形式给出)。这对于特定情况也很有用,但您应该尽可能避免使用它,因为它的效率较低,而且不能序列化。
发布于 2018-09-10 17:44:29
传递给你的special_fun的key参数将是一个张量。您不能在张量上使用Python类型转换,因为在代码运行时,这些张量只是符号的,所以Python不知道如何处理它们。崩溃发生在float()上,但同样的情况也会发生在round()和int()上,这很可能是您正在寻找的
def special_fun(key):
return tf.cast(2000 * tf.round(tf.cast(key, tf.float32)/2000), tf.int32)也就是说,我们使用Tensorflow自己的函数来进行转换/舍入。请记住,Tensorflow定义了一些重载运算符(例如+, -, *),但实际上这些只是对tf.add, tf.multiply等的调用。通常,您不能在张量上使用Python内置运算符/函数。
https://stackoverflow.com/questions/52254721
复制相似问题