【问题标题】:Tensorflow tf.map_fn parametersTensorFlow tf.map_fn 参数
【发布时间】:2017-12-26 23:54:18
【问题描述】:

我正在尝试构造我的参数,以便它们与 tf.map_fn() 一起正常工作,但大多数示例文档只讨论与函数参数形状相同的数组或张量。

链接包括:

Does tensorflow map_fn support taking more than one tensor?

我的具体例子是这样的: 我有一些张量流函数期望 [None, 2] 和 [x,y] 作为参数张量形状。

张量 A 的形状为 [batch_size, x*y, 2]

张量 B 的形状为 [batch_size, x, y]

lambdaData = (tensorA, tensorB)
lambdaFunc = lambda x: tensorflowFunc(x[0], x[1])
returnValues = tf.map_fn(lambdaFunc, lambdaData)

来自 tensorflow 文档:

If elems is a (possibly nested) list or tuple of tensors, then each of these 
tensors must have a matching first (unpack) dimension

由于 tensorsA 和 B 仅在维度 0 匹配,我无法堆叠或连接它们;我也尝试将 lambdaData 创建为:

  1. 两个张量的列表
  2. 两个张量的元组
  3. 张量对列表

以上所有因素都会导致不同的尺寸不匹配错误。根据将所有数据放入单个张量的文档,我会遵循推荐的用法,但由于 tensorA 和 tensorB 之间的尺寸不匹配,我无法做到。有没有人对 elems 的元组或参数列表有任何运气?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    一个可能更漂亮的解决方案是指定map_fndtype 参数(参见documentation),例如:

    tf.map_fn(lambda x: fn(*x), elements, dtype=tf.float32)
    

    如果fn 只返回一个 float32 值。

    【讨论】:

      【解决方案2】:

      事实证明 tf.map_fn 的错误消息非常具有误导性;文档没有详细提到这一点,但是如果您传递张量的元组/列表,则需要函数的确切返回数作为参数。最简单的方法是返回垃圾,然后只获取第一个返回值。

      print(a.shape) #[batch, 784, 2]
      print(b.shape) #[batch, 28, 28]
      lambdaData = (a, b)
      testFunc = lambda x: return <somethingUseful>, 0
      returnValues, _ = tf.map_fn(testFunc, lambdaData)
      

      按预期工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-18
        • 1970-01-01
        相关资源
        最近更新 更多