我有一个输入,它由两个整数组成,开始和结束。 我想要生成一个张量包含从开始到结束的整数。 例如,给定(2,5)作为输入,我想生成(2,3,4,5) 以下是我的尝试:
start_end_input = tf.keras.layers.Input(shape=(2,), dtype=tf.int32, name="start_end")
tf.map_fn(lambda row: tf.range(row[0], row[1]), start_end_input, dtype=(tf.int32, tf.int32))
我得到了这个:
self._tensor_array = [None for _ in range(size)]
TypeError: 'Tensor' object cannot be interpreted as an integer
任何想法吗? 谢谢。 问题来源StackOverflow 地址:/questions/59385003/map-fn-and-tf-keras-layers-input
我不太清楚你为什么要用凯拉斯。输入层。但是假设你可以不使用这个层(因为它会使单独访问元素变得复杂,例如x[0])。由于您使用的是TF 2.0,我希望您可以使用numpy数组或TF。直接张量。如果没有,让我知道,我将尝试寻找一个方法,以纳入喀拉拉邦。输入层。 但是我主要想指出您将会遇到的错误(即使您让上面的错误通过),以及您可以期望的一些工作解决方案的性能差异。短篇小说是tf。map_fn不能处理在每次行转换后返回可变大小输出的情况。更多细节在这里。这是你作为tf的问题。range将返回不同大小的行。 但是,如果您确定这些范围界限属于合理的上限(例如,范围的最大值是1000),则可以使用tf。map_fn如下。基本上,我们填充了行变换的每个结果,这样所有的结果都有相同的长度。
m = tf.reduce_max(a)
def range_with_map(a):
o = tf.map_fn(lambda x: tf.concat([tf.range(x[0],x[1]), tf.ones(shape=[x[0]+m-x[1]+1], dtype=tf.int32)*-1], axis=0), a, dtype=tf.int32)
b = tf.RaggedTensor.from_tensor(o, padding=-1)
return b
%timeit range_with_map(a)
这跑, 您还可以使用@tf.function进一步提高性能
@tf.function
def range_with_map_v2(a):
o = tf.map_fn(
lambda x: tf.concat([tf.range(x[0],x[1]), tf.ones(shape=[x[0]+m-x[1]+1], dtype=tf.int32)*-1], axis=0),
a, dtype=tf.int32)
b = tf.RaggedTensor.from_tensor(o, padding=-1)
return b
但是如果这不是一个选项,我所能看到的最佳方法是使用for循环。
def range_with_for_loop(a):
res = []
for r in a:
res.append(tf.reshape(tf.range(r[0],r[1]),[1,-1]))
return tf.ragged.stack(res)
没有必要说这是最差的表现 注:所有性能是w.r.t.我的机器有Nvidia GTX 960
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。