首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow -Map-函数

Tensorflow -Map-函数
EN

Stack Overflow用户
提问于 2018-09-10 17:26:02
回答 2查看 4.9K关注 0票数 3

我有一个关于tf的map函数的问题。我在使用这个函数时遇到了奇怪的行为。如果我按照手册中的说明进行操作

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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'

我遗漏了什么或做错了什么?提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-10 17:43:23

tf.map_fn中,给定函数期望接受与给定张量具有相同形状的张量,但删除了第一维(即,函数将接收每个元素作为张量)。在任何情况下,您尝试要做的事情都可以直接完成(并且更高效),而无需使用tf.map_fn

代码语言:javascript
复制
y = tf.cast(2000 * tf.round(tf.cast(key, tf.float32) / 2000), tf.int32)

tf.map_fn通常保留用于无法进行矢量化的特定情况。然而,如果你想使用它,你必须这样做:

代码语言:javascript
复制
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数组的形式给出)。这对于特定情况也很有用,但您应该尽可能避免使用它,因为它的效率较低,而且不能序列化。

票数 3
EN

Stack Overflow用户

发布于 2018-09-10 17:44:29

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

代码语言:javascript
复制
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内置运算符/函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52254721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档