我正在寻找(但已完全无法找到)tensorflow中的一个函数,这将允许我做一个地图'在张量上。
地图
首先,我甚至不确定是否有地图'功能?通过这个意思,我可以将给定的f(x)应用于张量中的偶数。例如我想要这样的东西
def f(x):
return x**2
Y = tf.Variable(np.array([[1.0, 2.0],
[3.0, 4.0]])
Y = tf.map_function(X, f)
产生(在会话中适当地运行之后,显然)具有值
的张量Y = [[1.0, 4.0],
[9.0, 16.0]]
这是否存在(对于一般f
- 我意识到tf.nn.relu
和tf.nn.sigmoid? On one hand, it seems like it should, since
map`是一个非常基本的操作。另一方面,它将涉及获取提供的python函数并以某种方式将其转换为在GPU上执行,这听起来像是可能无法实现的。
我在这里要求用棍子上的月亮吗?
** MAPI *
如果存在这样的功能,是否有允许我使用索引感知f
的版本? e.g。
def f(x, i):
if (i != [0, 0]):
k2 = np.sum([x**2 for x in i])
else:
k2 = 1.0 # To avoid division by zero
return (x / k2)
Y = tf.Variable(np.ones(shape=(2,3)))
Y = tf.mapi_function(X, f)
制造
Y = [[1.0, 1.0, 0.25],
[1.0, 0.5, 0.2]]
如果这样的功能不存在,我是否可以(对于固定的f
)通过构建来自(略微修改的)源的张量流来添加它们?
为什么我需要这样的功能
我之所以这么说是因为我试图使用tensorflow来数字化整合PDE。作为其中的一部分,我需要计算拉普拉斯(d ^ 2 / dx ^ 2 + d ^ 2 / dy ^ 2 + d ^ 2 / dz ^ 2)u(x,y,z)。在字段u(k_X,k_y,k_z)的傅里叶变换表示中,这涉及除以k_x ^ 2 + k_y ^ 2 + k_z ^ 2.
我可以预先计算一个反平方波数值的张量,并逐个元素乘法。但这会占用大量内存。我怀疑从内存加载这些值也会更慢。
答案 0 :(得分:1)
在您希望单独映射到每个x,y,z
坐标的具体示例中,您可以使用tf.split()
和tf.stack()
轻松完成此操作。也就是说,我假设你有一个大小为K
的输入张量(称之为[n,m,...,3]
);也就是说,最后一个维度索引x,y,z
坐标。如果是,请使用tf.split()
将K
分解为Kx,Ky,Kz
。然后应用你的地图操作(我通常使用tf.map_fn()
),然后最后与tf.stack()
一起堆叠。
如果我理解正确的设置应该这样做。如果没有,请提供一个最小的工作示例,使问题具体化;否则我们最多猜测一个解决方案。