开发者社区> 问答> 正文

map_fn和tf.keras.layers.Input

我有一个输入,它由两个整数组成,开始和结束。 我想要生成一个张量包含从开始到结束的整数。 例如,给定(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

展开
收起
kun坤 2019-12-26 10:50:51 1154 0
1 条回答
写回答
取消 提交回答
  • 我不太清楚你为什么要用凯拉斯。输入层。但是假设你可以不使用这个层(因为它会使单独访问元素变得复杂,例如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

    2019-12-26 10:50:58
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Prediction as a service with Ensemble Model trained in SparkML and Python ScikitLearn on 1Bn observed flight prices daily 立即下载
Softmax Function Vs Sigmoid Fu 立即下载
低代码开发师(初级)实战教程 立即下载