brainpy/examples

'PoissonEncoder' object is not callable

Closed this issue · 2 comments

Hello,

When I ran this example https://github.com/brainpy/examples/blob/main/brain_inspired_computing/mnist_lif_readout.py, the error showed:

Namespace(T=100, platform='cpu', batch=64, epochs=15, out_dir='./logs', lr=0.001, tau=2.0)
Traceback (most recent call last):
  File "/Users/pei/Downloads/mnist_lif_readout.py", line 103, in <module>
    l, correct_num = train(X, Y)
                     ^^^^^^^^^^^
  File "/Users/pei/.pyenv/versions/mambaforge-22.9.0-2/envs/brainpy-env/lib/python3.11/site-packages/brainpy/_src/math/object_transform/jit.py", line 208, in __call__
    rets = self._get_transform(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/pei/.pyenv/versions/mambaforge-22.9.0-2/envs/brainpy-env/lib/python3.11/site-packages/brainpy/_src/math/object_transform/jit.py", line 155, in _get_transform
    self._dyn_vars, rets = evaluate_dyn_vars(
                           ^^^^^^^^^^^^^^^^^^
  File "/Users/pei/.pyenv/versions/mambaforge-22.9.0-2/envs/brainpy-env/lib/python3.11/site-packages/brainpy/_src/math/object_transform/tools.py", line 101, in evaluate_dyn_vars
    rets = jax.eval_shape(f2, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/pei/Downloads/mnist_lif_readout.py", line 86, in train
    grads, l, n = grad_fun(xs, ys)
                  ^^^^^^^^^^^^^^^^
  File "/Users/pei/.pyenv/versions/mambaforge-22.9.0-2/envs/brainpy-env/lib/python3.11/site-packages/brainpy/_src/math/object_transform/autograd.py", line 209, in __call__
    rets = self._transform(
           ^^^^^^^^^^^^^^^^
  File "/Users/pei/.pyenv/versions/mambaforge-22.9.0-2/envs/brainpy-env/lib/python3.11/site-packages/brainpy/_src/math/object_transform/autograd.py", line 133, in _f_grad_with_aux_to_transform
    outputs = self.target(*args, **kwargs)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/pei/Downloads/mnist_lif_readout.py", line 65, in loss_fun
    xs = encoder(xs, num_step=args.T)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'PoissonEncoder' object is not callable

Any help would be appreciated. Thank you!

Thanks for the report. The API of PoissonEncoder has changed. Currently, We can use:

xs = encoder.multi_steps(xs, n_time=args.T * bm.get_dt())

Particularly, .single_step() generates a single step output, while .multi_steps() generate spikes at multiple steps according to the inputs.

I have also fixed the error in the original implementation code. See the file for the details.