В частности, я хочу написать код, который обрабатывает вызов метода как из одного экземпляра класса, так и из нескольких (векторизованных) экземпляры класса.
Далее я напишу простой пример того, чего я хотел бы достичь.
Код: Выделить всё
import jax
import jax.numpy as jnp
import jax.random as random
class Dummy:
def __init__(self, x, key):
self.x = x
self.key = key
def to_pytree(self):
return (self.x, self.key), None
def get_noisy_x(self):
self.key, subkey = random.split(self.key)
return self.x + random.normal(subkey, self.x.shape)
@staticmethod
def from_pytree(auxiliary, pytree):
return Dummy(*pytree)
jax.tree_util.register_pytree_node(Dummy,
Dummy.to_pytree,
Dummy.from_pytree)
Код: Выделить всё
key = random.PRNGKey(0)
dummy = Dummy(jnp.array([1., 2., 3.]), key)
dummy.get_noisy_x()
Код: Выделить всё
key = random.PRNGKey(0)
key, subkey = random.split(key)
key_batch = random.split(subkey, 100)
dummy_vmap = jax.vmap(lambda x: Dummy(jnp.array([1., 2., 3.]), x))(key_batch)
Код: Выделить всё
dummy = Dummy(jnp.array([1., 2., 3.]), key)
dummy.get_noisy_x()
Код: Выделить всё
vectorized_dummy = .... ?
vectorized_dummy.get_noisy_x()
Подробнее здесь: https://stackoverflow.com/questions/792 ... python-jax
Мобильная версия