如何将 jax vmap 用于嵌套循环?
How to use jax vmap for nested loops?
我想使用 vmap 向量化此代码以提高性能。
def matrix(dataA, dataB):
return jnp.array([[func(a, b) for b in dataB] for a in dataA])
matrix(data, data)
我试过这个:
def f(x, y):
return func(x, y)
mapped = jax.vmap(f)
mapped(data, data)
但这只给出了对角线项。
基本上我有一个向量 data = [1,2,3,4,5]
(示例),我想得到一个矩阵,使得矩阵的每个条目 (i, j)
都是 f(data[i], data[j])
。因此,生成的矩阵形状将为 (len(data), len(data))
.
jax.vmap
一次跨一组轴映射。如果你想跨两组独立的轴映射,你可以通过嵌套两个 vmap
转换来实现:
mapped = jax.vmap(jax.vmap(f, in_axes=(None, 0)), in_axes=(0, None))
result = mapped(data, data)
我想使用 vmap 向量化此代码以提高性能。
def matrix(dataA, dataB):
return jnp.array([[func(a, b) for b in dataB] for a in dataA])
matrix(data, data)
我试过这个:
def f(x, y):
return func(x, y)
mapped = jax.vmap(f)
mapped(data, data)
但这只给出了对角线项。
基本上我有一个向量 data = [1,2,3,4,5]
(示例),我想得到一个矩阵,使得矩阵的每个条目 (i, j)
都是 f(data[i], data[j])
。因此,生成的矩阵形状将为 (len(data), len(data))
.
jax.vmap
一次跨一组轴映射。如果你想跨两组独立的轴映射,你可以通过嵌套两个 vmap
转换来实现:
mapped = jax.vmap(jax.vmap(f, in_axes=(None, 0)), in_axes=(0, None))
result = mapped(data, data)