我正在尝试构造我的参数,以便它们能够与tf.map_fn()一起正常工作,但大多数示例文档仅讨论与函数参数形状相同的数组或张量。
链接包括:
Does tensorflow map_fn support taking more than one tensor?
我的具体例子如下: 我有一些张量流函数,期望[None,2]和[x,y]作为参数张量形状。
Tensor A的形状为[batch_size,x * y,2]
Tensor 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:
以上所有结果导致不同的尺寸不匹配误差。我会按照推荐的用法按照将所有数据放入单个张量的文档,但由于tensorA和tensorB之间的维度不匹配,我无法做到。有没有人对元组的元组或参数列表有什么好运?
答案 0 :(得分: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)
按预期工作。
答案 1 :(得分:1)
一个可能更漂亮的解决方案是指定dtype
的{{1}}参数(参见documentation),例如:
map_fn
如果tf.map_fn(lambda x: fn(*x), elements, dtype=tf.float32)
只返回一个float32值。