sinabs 3.1.3__tar.gz → 3.1.3.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/PKG-INFO +1 -1
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/about/release_notes.md +0 -6
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/iaf_neuron_model.ipynb +1 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/available_network_arch.md +67 -80
- sinabs-3.1.3.dev1/docs/speck/faqs/imgs/two-independent-networks.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/nmnist_quick_start.ipynb +2 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/play_with_speck_dvs.ipynb +1 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/nmnist.ipynb +1 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/chips/dynapcnn.py +2 -2
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dynapcnn_visualizer.py +3 -3
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/nir_graph_extractor.py +3 -4
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/pool2d.py +1 -1
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/PKG-INFO +1 -1
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/SOURCES.txt +2 -5
- sinabs-3.1.3.dev1/sinabs.egg-info/pbr.json +1 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_device_movement.py +1 -1
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_discover_device.py +1 -1
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_large_net.py +1 -1
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_neuron_leak.py +6 -1
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_single_neuron_hardware.py +2 -1
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_visualizer.py +4 -3
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/conftest_dynapcnnnetwork.py +0 -15
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/model_dummy_1.py +14 -13
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/model_dummy_2.py +21 -20
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/model_dummy_4.py +4 -6
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/test_dynapcnnnetwork.py +1 -24
- sinabs-3.1.3/docs/speck/faqs/imgs/complex-network.png +0 -0
- sinabs-3.1.3/docs/speck/faqs/imgs/network-with-residual-connection.png +0 -0
- sinabs-3.1.3/sinabs.egg-info/pbr.json +0 -1
- sinabs-3.1.3/tests/test_dynapcnnnetwork/__init__.py +0 -0
- sinabs-3.1.3/tests/test_dynapcnnnetwork/model_dummy_5.py +0 -199
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/.coveragerc +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/.github/workflows/ci-pipeline.yml +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/.pre-commit-config.yaml +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/.readthedocs.yaml +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/AUTHORS +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/CITATION.cff +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/LICENSE +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/README.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/codecov.yml +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/Makefile +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/dataflow_layers.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/event_preprocessing_pipeline.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/memory_constraints.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/sinabs-dynapcnn-role.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/speck_dynapcnn.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/speck_top_level.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/devkits_images/dynapcnn_devkit.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/devkits_images/speck_devkit.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/devkits_images/speck_module.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/devkits_images/speck_module_devkit.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/nmnist_quick_start/dvs_input_flow.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/nmnist_quick_start/dynapcnn_visualizer.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/nmnist_quick_start/spike_input_flow.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/power_monitoring/dynamic_power_samna_graph.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/power_monitoring/idle_power_samna_graph.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/power_monitoring/power_plot.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/sinabs-logo-lowercase-whitebg.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/sinabs-logo-lowercase.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/tips_for_training/exceeding_bandwidth.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/using_readout_layer/handcraft_weights.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/using_readout_layer/neuron_id_mismatch.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/using_readout_layer/readout_layer.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/using_readout_layer/samna_graph.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/visualize_speck_dvs/samna_graph.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/visualize_spike_count/samna_graph.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/visualize_spike_count/spike_count.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_templates/class_activation.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_templates/class_layer.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/about/about.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/about/contributing.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/about/differences.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/about/info.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/activation.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/api.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/from_torch.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/hooks.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/layers.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/network.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/nir.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/synopcounter.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/utils.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/conf.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/contact.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/README.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/README.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/plot_alif.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/plot_exp_leaky.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/plot_iaf.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/plot_lif.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/utils.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/spike_fns/README.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/spike_fns/plot_maxspike.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/spike_fns/plot_multispike.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/spike_fns/plot_singlespike.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/README.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/plot_gaussian.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/plot_heaviside.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/plot_multigaussian.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/plot_periodicexponential.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/plot_singleexponential.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/fundamentals.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/getting_started.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/install.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/python_pyenv_pipenv.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/quickstart.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/how_tos/activations.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/how_tos/custom_hooks.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/how_tos/how_tos.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/how_tos/synops_loss_ann.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/how_tos/synops_loss_snn.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/index.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/make.bat +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/plugins/plugins.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/requirements.txt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/advanced_concepts.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/chip_factory.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/config_builder.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/crop2d.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/discretize.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/dvs_layer.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/dynapcnn.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/dynapcnn_layer.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/dynapcnn_network.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/dynapcnn_visualizer.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/exceptions.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/flipdims.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/io.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/mapping.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/specksim.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/utils.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/dangers.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/add_new_device.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/available_algorithmic_operation.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/chip_errata.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/device_management.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/imgs/network-with-merge-and-split.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/imgs/two-networks-merging-output.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/index.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/output_monitoring.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/save_hardware_config_as_binary.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/tips_for_training.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/index.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/leak_neuron.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/power_monitoring.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/using_readout_layer.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/visualize_speck_dvs_input.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/visualize_spike_count.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/overview.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/specksim.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/the_basics.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/tutorials.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/visualizer.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/LeNet_5_EngChinese.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/bptt.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/nir_to_speck.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/scnn_mnist.nir +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/tutorials.rst +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/weight_scaling.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/weight_transfer_mnist.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_DVSLayer_given.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_DVSLayer_given_followed_by_pool.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_deployment.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_need_create_DVSLayer.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_no_DVSLayer.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_with_batchnorm.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_with_multiple_batchnorm.ipynb +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/mnist/dynapcnn_network.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/mnist/mnist_params.pt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/mnist/specksim_network.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/dvs_gesture_params.pt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/gesture_viz.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/01_armroll.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/02_handclap.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/03_lefthandclockwise.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/04_lefthandcounterclockwise.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/05_lefthandwave.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/06_righthandwave.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/07_righthandclockwise.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/08_righthandcounterclockwise.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/09_airdrums.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/10_airguitar.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/11_other.png +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/jupyterlab-requirements.txt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/pull_request_template.md +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/requirements.txt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/setup.cfg +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/setup.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/__init__.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/activation/__init__.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/activation/quantize.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/activation/reset_mechanism.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/activation/spike_generation.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/activation/surrogate_gradient_fn.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/__init__.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/__init__.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/chip_factory.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/chips/__init__.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/chips/speck2e.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/chips/speck2f.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/config_builder.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/connectivity_specs.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/crop2d.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/discretize.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dvs_layer.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dynapcnn_layer.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dynapcnn_layer_utils.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dynapcnn_network.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dynapcnnnetwork_module.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/exceptions.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/flipdims.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/io.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/mapping.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/sinabs_edges_handler.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/specksim.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/utils.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/weight_rescaling_methods.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/cnnutils.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/conversion.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/from_torch.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/hooks.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/__init__.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/alif.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/channel_shift.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/crop2d.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/exp_leak.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/functional/__init__.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/functional/alif.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/functional/lif.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/iaf.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/lif.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/merge.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/neuromorphic_relu.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/quantize.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/reshape.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/stateful_layer.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/to_spike.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/network.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/nir.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/synopcounter.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/utils.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/validate_memory_speck.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/dependency_links.txt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/not-zip-safe +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/requires.txt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/top_level.txt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/__init__.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/conv_input.pth +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/conv_layer_synops.pth +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/firing_rates.pth +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/firing_rates_per_neuron.pth +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/input_diffs.pth +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/model_synops.pth +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/mnist_params.pt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/models/README.txt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/models/synop_hook_model.pth +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/requirements.txt +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_activations.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_batch_mismatch.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_batch_size_update.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_conversion.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_copy.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/custom_jit_filters.py +0 -0
- {sinabs-3.1.3/tests → sinabs-3.1.3.dev1/tests/test_dynapcnn}/hw_utils.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_auto_mapping.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_compatible_layer_build.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_config_making.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_device_name_mapping.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_discretized.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_doorbell.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_dvs_input.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_dvs_layer.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_event_conversion.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_individual_cases.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_learning.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_monitoring.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_speck2e.py +0 -0
- {sinabs-3.1.3/tests/test_dynapcnn → sinabs-3.1.3.dev1/tests/test_dynapcnnlayer}/__init__.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/conftest_dynapcnnlayer.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/model_dummy_1.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/model_dummy_2.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/model_dummy_3.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/model_dummy_4.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/test_dynapcnnlayer.py +0 -0
- {sinabs-3.1.3/tests/test_dynapcnnlayer → sinabs-3.1.3.dev1/tests/test_dynapcnnnetwork}/__init__.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/model_dummy_3.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/model_dummy_seq.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/test_failcases.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_from_model.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/conftest_graph_extractor.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/model_dummy_1.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/model_dummy_2.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/model_dummy_3.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/model_dummy_4.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/test_graph_extractor.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_hooks.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_alif.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_channelshift.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_crop2d.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_exp_leak.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_iaf.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_img2spk.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_lif.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_maxpooling.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_merge.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_neuromorphic_relu.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_reshaping.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_sig2spk.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_stateful_layer.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_network_class.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_nir.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_normalize_weights.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_onnx.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_quantize.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_specksim/test_specksim_bindings.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_specksim/test_specksim_conversion.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_specksim/test_specksim_network.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_surrogate_gradients.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_synops_counter.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_utils.py +0 -0
- {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/weights/README.txt +0 -0
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
# Release notes
|
|
2
2
|
|
|
3
|
-
## v3.1.3 (04/02/2026)
|
|
4
|
-
|
|
5
|
-
* Add tests for mapping non-sequential networks
|
|
6
|
-
* Fix networks used for tests, they didnt meet the hardware constraints
|
|
7
|
-
* Update documentation with the non-sequential networks types that have a test
|
|
8
|
-
|
|
9
3
|
## v3.1.2 (12/12/2025)
|
|
10
4
|
|
|
11
5
|
* Update use of visualizer in Sinabs tutorials, previous tutorials were using a deprecated visualizer version.
|
|
@@ -39,31 +39,28 @@ dynapcnn.to(devcie="your device", chip_layers_ordering=[2, 5, 7, 1])
|
|
|
39
39
|
|
|
40
40
|
## What network structure can I define?
|
|
41
41
|
|
|
42
|
-
`Sinabs` can parse a `torch.nn.Sequential` like architecture, so it is recommended to
|
|
42
|
+
`Sinabs` can parse a `torch.nn.Sequential` like architecture, so it is recommended to
|
|
43
|
+
use a `Sequential` like network.
|
|
43
44
|
|
|
44
45
|
As of `v3.1.0`, we released a network graph extraction feature that helps users deploy their networks with more complex architectures into the devkit.
|
|
45
46
|
Our `Speck` chip, in fact, supports branched architectures. With the graph extraction feature, we support a range of network structures, as shown below:
|
|
46
47
|
|
|
47
|
-
A network with a merge and a split:
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
Two independent networks:
|
|
50
|
+
|
|
51
|
+

|
|
50
52
|
|
|
51
53
|
Two networks with merging outputs:
|
|
52
54
|
|
|
53
55
|

|
|
54
56
|
|
|
55
|
-
A network with
|
|
56
|
-
|
|
57
|
-

|
|
57
|
+
A network with a merge and a split:
|
|
58
58
|
|
|
59
|
-
A
|
|
59
|
+

|
|
60
60
|
|
|
61
|
-

|
|
62
61
|
|
|
63
62
|
Note: with the graph extracture feature it is possible to implement recurrent neural networks. However, this is not recommended or supported as it can result in deadlock on the chip.
|
|
64
63
|
|
|
65
|
-
Note2: the use of two parallel network although supported by our chip was not fully considered in our sinabs implementation.
|
|
66
|
-
|
|
67
64
|
## How to make use of the graph extraction feature?
|
|
68
65
|
|
|
69
66
|
For general architectures, users need to define their classes, by defining at least the `__init__` method with all the layers, as well as an appropriate `forward` method.
|
|
@@ -71,70 +68,64 @@ For general architectures, users need to define their classes, by defining at le
|
|
|
71
68
|
Here is an example to define a network with a merge and a split:
|
|
72
69
|
|
|
73
70
|
```python
|
|
74
|
-
import torch
|
|
75
71
|
import torch.nn as nn
|
|
76
72
|
|
|
77
73
|
from sinabs.activation.surrogate_gradient_fn import PeriodicExponential
|
|
78
74
|
from sinabs.layers import IAFSqueeze, Merge, SumPool2d
|
|
79
75
|
|
|
80
|
-
|
|
81
76
|
class SNN(nn.Module):
|
|
82
77
|
def __init__(self, batch_size) -> None:
|
|
83
78
|
super().__init__()
|
|
84
|
-
|
|
85
|
-
self.
|
|
86
|
-
self.
|
|
87
|
-
batch_size=batch_size,
|
|
88
|
-
min_v_mem=-1.0,
|
|
89
|
-
spike_threshold=1.0,
|
|
90
|
-
surrogate_grad_fn=PeriodicExponential(),
|
|
91
|
-
)
|
|
92
|
-
# -- graph node B --
|
|
93
|
-
self.conv_B = nn.Conv2d(4, 4, 2, 1, bias=False)
|
|
94
|
-
self.iaf2_B = IAFSqueeze(
|
|
79
|
+
|
|
80
|
+
self.conv1 = nn.Conv2d(2, 1, 2, 1, bias=False)
|
|
81
|
+
self.iaf1 = IAFSqueeze(
|
|
95
82
|
batch_size=batch_size,
|
|
96
83
|
min_v_mem=-1.0,
|
|
97
84
|
spike_threshold=1.0,
|
|
98
85
|
surrogate_grad_fn=PeriodicExponential(),
|
|
99
86
|
)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
self.
|
|
103
|
-
self.iaf_C = IAFSqueeze(
|
|
87
|
+
|
|
88
|
+
self.conv2 = nn.Conv2d(1, 1, 2, 1, bias=False)
|
|
89
|
+
self.iaf2 = IAFSqueeze(
|
|
104
90
|
batch_size=batch_size,
|
|
105
91
|
min_v_mem=-1.0,
|
|
106
92
|
spike_threshold=1.0,
|
|
107
93
|
surrogate_grad_fn=PeriodicExponential(),
|
|
108
94
|
)
|
|
109
|
-
self.
|
|
110
|
-
|
|
111
|
-
self.
|
|
112
|
-
self.
|
|
95
|
+
self.pool2 = SumPool2d(2, 2)
|
|
96
|
+
|
|
97
|
+
self.conv3 = nn.Conv2d(1, 1, 2, 1, bias=False)
|
|
98
|
+
self.iaf3 = IAFSqueeze(
|
|
113
99
|
batch_size=batch_size,
|
|
114
100
|
min_v_mem=-1.0,
|
|
115
101
|
spike_threshold=1.0,
|
|
116
102
|
surrogate_grad_fn=PeriodicExponential(),
|
|
117
103
|
)
|
|
118
|
-
|
|
119
|
-
self.
|
|
120
|
-
|
|
104
|
+
self.pool3 = SumPool2d(2, 2)
|
|
105
|
+
self.pool3a = SumPool2d(5, 5)
|
|
106
|
+
|
|
107
|
+
self.conv4 = nn.Conv2d(1, 1, 2, 1, bias=False)
|
|
108
|
+
self.iaf4 = IAFSqueeze(
|
|
121
109
|
batch_size=batch_size,
|
|
122
110
|
min_v_mem=-1.0,
|
|
123
111
|
spike_threshold=1.0,
|
|
124
112
|
surrogate_grad_fn=PeriodicExponential(),
|
|
125
113
|
)
|
|
126
|
-
self.
|
|
127
|
-
|
|
128
|
-
self.
|
|
129
|
-
self.
|
|
114
|
+
self.pool4 = SumPool2d(3, 3)
|
|
115
|
+
|
|
116
|
+
self.flat1 = nn.Flatten()
|
|
117
|
+
self.flat2 = nn.Flatten()
|
|
118
|
+
|
|
119
|
+
self.conv5 = nn.Conv2d(1, 1, 2, 1, bias=False)
|
|
120
|
+
self.iaf5 = IAFSqueeze(
|
|
130
121
|
batch_size=batch_size,
|
|
131
122
|
min_v_mem=-1.0,
|
|
132
123
|
spike_threshold=1.0,
|
|
133
124
|
surrogate_grad_fn=PeriodicExponential(),
|
|
134
125
|
)
|
|
135
|
-
|
|
136
|
-
self.
|
|
137
|
-
self.
|
|
126
|
+
|
|
127
|
+
self.fc2 = nn.Linear(25, 10, bias=False)
|
|
128
|
+
self.iaf2_fc = IAFSqueeze(
|
|
138
129
|
batch_size=batch_size,
|
|
139
130
|
min_v_mem=-1.0,
|
|
140
131
|
spike_threshold=1.0,
|
|
@@ -143,47 +134,43 @@ class SNN(nn.Module):
|
|
|
143
134
|
|
|
144
135
|
# -- merges --
|
|
145
136
|
self.merge1 = Merge()
|
|
146
|
-
|
|
147
|
-
# -- falts --
|
|
148
|
-
self.flat_D = nn.Flatten()
|
|
149
|
-
self.flat_F = nn.Flatten()
|
|
137
|
+
self.merge2 = Merge()
|
|
150
138
|
|
|
151
139
|
def forward(self, x):
|
|
152
140
|
# conv 1 - A/0
|
|
153
|
-
|
|
154
|
-
|
|
141
|
+
con1_out = self.conv1(x)
|
|
142
|
+
iaf1_out = self.iaf1(con1_out)
|
|
155
143
|
|
|
156
144
|
# conv 2 - B/1
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
145
|
+
conv2_out = self.conv2(iaf1_out)
|
|
146
|
+
iaf2_out = self.iaf2(conv2_out)
|
|
147
|
+
pool2_out = self.pool2(iaf2_out)
|
|
160
148
|
|
|
161
149
|
# conv 3 - C/2
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
#
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
return iaf3_fc_out
|
|
150
|
+
conv3_out = self.conv3(iaf1_out)
|
|
151
|
+
iaf3_out = self.iaf3(conv3_out)
|
|
152
|
+
pool3_out = self.pool3(iaf3_out)
|
|
153
|
+
pool3a_out = self.pool3a(iaf3_out)
|
|
154
|
+
|
|
155
|
+
# conv 4 - D/3
|
|
156
|
+
merge1_out = self.merge1(pool2_out, pool3_out)
|
|
157
|
+
conv4_out = self.conv4(merge1_out)
|
|
158
|
+
iaf4_out = self.iaf4(conv4_out)
|
|
159
|
+
pool4_out = self.pool4(iaf4_out)
|
|
160
|
+
flat1_out = self.flat1(pool4_out)
|
|
161
|
+
|
|
162
|
+
# conv 5 - E/4
|
|
163
|
+
conv5_out = self.conv5(pool3a_out)
|
|
164
|
+
iaf5_out = self.iaf5(conv5_out)
|
|
165
|
+
flat2_out = self.flat2(iaf5_out)
|
|
166
|
+
|
|
167
|
+
# fc 2 - F/5
|
|
168
|
+
merge2_out = self.merge2(flat2_out, flat1_out)
|
|
169
|
+
|
|
170
|
+
fc2_out = self.fc2(merge2_out)
|
|
171
|
+
iaf2_fc_out = self.iaf2_fc(fc2_out)
|
|
172
|
+
|
|
173
|
+
return iaf2_fc_out
|
|
187
174
|
```
|
|
188
175
|
|
|
189
176
|
## Can I achieve a "Residual Connection" like ResNet does?
|
|
@@ -193,9 +180,9 @@ change the `samna.speck2f.configuration.CNNLayerDestination.layer` to achieve th
|
|
|
193
180
|
familiar with the `samna-configuration`.
|
|
194
181
|
You can also make use of our network graph extraction feature, to implement residual networks.
|
|
195
182
|
|
|
196
|
-
## How
|
|
183
|
+
## How to use "Residual Connection" manually?
|
|
197
184
|
|
|
198
|
-
|
|
185
|
+
Alright! Here I will give an example of achieving the "Residual Connection" by manually modify the `samna-configuration`.
|
|
199
186
|
|
|
200
187
|
Let's say you want an architecture like below:
|
|
201
188
|
|
|
@@ -234,7 +221,7 @@ class ResidualBlock(nn.Module):
|
|
|
234
221
|
|
|
235
222
|
```
|
|
236
223
|
|
|
237
|
-
|
|
224
|
+
Since currently Sinabs can only parse Sequential like network, we need to do some tedious work like below:
|
|
238
225
|
|
|
239
226
|
```python
|
|
240
227
|
# define a Sequential first
|
|
@@ -277,8 +264,8 @@ devkit.get_model().apply_configuration(samna_cfg)
|
|
|
277
264
|
|
|
278
265
|
```
|
|
279
266
|
|
|
280
|
-
|
|
281
|
-
|
|
267
|
+
I have to say it is not an elegant solution though, it should help you to achieve an initial Residual Block. We will
|
|
268
|
+
improve this part after Sinabs has the ability for extracting model's graph.
|
|
282
269
|
|
|
283
270
|
## What execution order should I be aware of when I am implementing a sequential structure?
|
|
284
271
|
You should be aware with the internal layer order.
|
|
Binary file
|
|
@@ -97,6 +97,7 @@
|
|
|
97
97
|
"source": [
|
|
98
98
|
"from torch import nn\n",
|
|
99
99
|
"\n",
|
|
100
|
+
"\n",
|
|
100
101
|
"# define a CNN model\n",
|
|
101
102
|
"cnn = nn.Sequential(\n",
|
|
102
103
|
" # [2, 34, 34] -> [8, 17, 17]\n",
|
|
@@ -1180,6 +1181,7 @@
|
|
|
1180
1181
|
"source": [
|
|
1181
1182
|
"from sinabs.backend.dynapcnn.dynapcnn_visualizer import DynapcnnVisualizer\n",
|
|
1182
1183
|
"\n",
|
|
1184
|
+
"\n",
|
|
1183
1185
|
"visualizer = DynapcnnVisualizer(\n",
|
|
1184
1186
|
" window_scale=(4, 8),\n",
|
|
1185
1187
|
" dvs_shape=(34, 34),\n",
|
|
@@ -103,6 +103,7 @@
|
|
|
103
103
|
"from sinabs.backend.dynapcnn.dynapcnn_visualizer import DynapcnnVisualizer\n",
|
|
104
104
|
"from sinabs.backend.dynapcnn import DynapcnnNetwork\n",
|
|
105
105
|
"\n",
|
|
106
|
+
"\n",
|
|
106
107
|
"# create a dummy snn for DynapcnnNetwork initialization\n",
|
|
107
108
|
"snn = nn.Sequential(\n",
|
|
108
109
|
" nn.Conv2d(1, 1, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False),\n",
|
|
@@ -101,7 +101,7 @@ class DynapcnnConfigBuilder(ConfigBuilder):
|
|
|
101
101
|
dimensions["input_shape"]["feature_count"] = channel_count
|
|
102
102
|
|
|
103
103
|
# dimensions["output_feature_count"] already done in conv2d_to_dict
|
|
104
|
-
f, h, w = layer.get_neuron_shape()
|
|
104
|
+
(f, h, w) = layer.get_neuron_shape()
|
|
105
105
|
dimensions["output_shape"]["size"] = {}
|
|
106
106
|
dimensions["output_shape"]["feature_count"] = f
|
|
107
107
|
dimensions["output_shape"]["size"]["x"] = w
|
|
@@ -121,7 +121,7 @@ class DynapcnnConfigBuilder(ConfigBuilder):
|
|
|
121
121
|
config_dict["dimensions"] = dimensions
|
|
122
122
|
# Update parameters from convolution
|
|
123
123
|
if layer.conv_layer.bias is not None:
|
|
124
|
-
weights, biases = layer.conv_layer.parameters()
|
|
124
|
+
(weights, biases) = layer.conv_layer.parameters()
|
|
125
125
|
else:
|
|
126
126
|
(weights,) = layer.conv_layer.parameters()
|
|
127
127
|
biases = torch.zeros(layer.conv_layer.out_channels)
|
|
@@ -455,7 +455,7 @@ class DynapcnnVisualizer:
|
|
|
455
455
|
|
|
456
456
|
# Streamer graph
|
|
457
457
|
# Dvs node
|
|
458
|
-
_, dvs_member_filter, _, streamer_node = self.streamer_graph.sequential(
|
|
458
|
+
(_, dvs_member_filter, _, streamer_node) = self.streamer_graph.sequential(
|
|
459
459
|
[
|
|
460
460
|
dynapcnn_network.samna_device.get_model_source_node(),
|
|
461
461
|
samna.graph.JitMemberSelect(),
|
|
@@ -526,7 +526,7 @@ class DynapcnnVisualizer:
|
|
|
526
526
|
## Readout node
|
|
527
527
|
if "r" in self.gui_type:
|
|
528
528
|
if self.readout_node == "JitMajorityReadout":
|
|
529
|
-
_, majority_readout_node, _ = self.streamer_graph.sequential(
|
|
529
|
+
(_, majority_readout_node, _) = self.streamer_graph.sequential(
|
|
530
530
|
[
|
|
531
531
|
spike_collection_node,
|
|
532
532
|
samna.graph.JitMajorityReadout(samna.ui.Event),
|
|
@@ -544,7 +544,7 @@ class DynapcnnVisualizer:
|
|
|
544
544
|
self.readout_default_threshold_high
|
|
545
545
|
)
|
|
546
546
|
else:
|
|
547
|
-
_, majority_readout_node, _ = self.streamer_graph.sequential(
|
|
547
|
+
(_, majority_readout_node, _) = self.streamer_graph.sequential(
|
|
548
548
|
[
|
|
549
549
|
spike_collection_node,
|
|
550
550
|
self.readout_node,
|
|
@@ -504,7 +504,7 @@ class GraphExtractor:
|
|
|
504
504
|
A handler to the newly added `DVSLayer` instance.
|
|
505
505
|
"""
|
|
506
506
|
|
|
507
|
-
features, height, width = dvs_input_shape
|
|
507
|
+
(features, height, width) = dvs_input_shape
|
|
508
508
|
if features > 2:
|
|
509
509
|
raise ValueError(
|
|
510
510
|
f"A DVSLayer istance can have a max feature dimension of 2 but {features} was given."
|
|
@@ -578,7 +578,7 @@ class GraphExtractor:
|
|
|
578
578
|
f"A DVSLayer node exists and there are {nb_entries} entry nodes in the graph: the DVSLayer should be the only entry node."
|
|
579
579
|
)
|
|
580
580
|
|
|
581
|
-
features, _, _ = dvs_input_shape
|
|
581
|
+
(features, _, _) = dvs_input_shape
|
|
582
582
|
|
|
583
583
|
if features > 2:
|
|
584
584
|
raise ValueError(
|
|
@@ -752,7 +752,7 @@ class GraphExtractor:
|
|
|
752
752
|
# different input sources to a core to have the same output shapes.
|
|
753
753
|
if any(inp.shape != inputs[0].shape for inp in inputs):
|
|
754
754
|
raise ValueError(
|
|
755
|
-
f"Layer `sinabs.layers.merge.Merge` (node {node}) requires input tensors with the same shape
|
|
755
|
+
f"Layer `sinabs.layers.merge.Merge` (node {node}) requires input tensors with the same shape"
|
|
756
756
|
)
|
|
757
757
|
|
|
758
758
|
# forward input through the node.
|
|
@@ -828,7 +828,6 @@ class GraphExtractor:
|
|
|
828
828
|
if len(sources) == 0:
|
|
829
829
|
return -1
|
|
830
830
|
if len(sources) > 1:
|
|
831
|
-
# return -1 #TODO: why throw a runtime error when the documentation explicitly say -1 in case of more than one input node?
|
|
832
831
|
raise RuntimeError(f"Node {node} has more than 1 input")
|
|
833
832
|
return sources.pop()
|
|
834
833
|
|
|
@@ -80,7 +80,7 @@ class SpikingMaxPooling2dLayer(nn.Module):
|
|
|
80
80
|
Returns:
|
|
81
81
|
(channelsOut, height_out, width_out)
|
|
82
82
|
"""
|
|
83
|
-
channels, height, width = input_shape
|
|
83
|
+
(channels, height, width) = input_shape
|
|
84
84
|
|
|
85
85
|
height_out = conv_output_size(
|
|
86
86
|
height + sum(self.padding[2:]), self.pool_size[0], self.strides[0]
|
|
@@ -121,9 +121,8 @@ docs/speck/faqs/index.rst
|
|
|
121
121
|
docs/speck/faqs/output_monitoring.md
|
|
122
122
|
docs/speck/faqs/save_hardware_config_as_binary.md
|
|
123
123
|
docs/speck/faqs/tips_for_training.md
|
|
124
|
-
docs/speck/faqs/imgs/complex-network.png
|
|
125
124
|
docs/speck/faqs/imgs/network-with-merge-and-split.png
|
|
126
|
-
docs/speck/faqs/imgs/
|
|
125
|
+
docs/speck/faqs/imgs/two-independent-networks.png
|
|
127
126
|
docs/speck/faqs/imgs/two-networks-merging-output.png
|
|
128
127
|
docs/speck/notebooks/leak_neuron.ipynb
|
|
129
128
|
docs/speck/notebooks/nmnist_quick_start.ipynb
|
|
@@ -229,7 +228,6 @@ sinabs/layers/functional/__init__.py
|
|
|
229
228
|
sinabs/layers/functional/alif.py
|
|
230
229
|
sinabs/layers/functional/lif.py
|
|
231
230
|
tests/__init__.py
|
|
232
|
-
tests/hw_utils.py
|
|
233
231
|
tests/mnist_params.pt
|
|
234
232
|
tests/requirements.txt
|
|
235
233
|
tests/test_activations.py
|
|
@@ -255,8 +253,8 @@ tests/inputs_and_results/hooks/input_diffs.pth
|
|
|
255
253
|
tests/inputs_and_results/hooks/model_synops.pth
|
|
256
254
|
tests/models/README.txt
|
|
257
255
|
tests/models/synop_hook_model.pth
|
|
258
|
-
tests/test_dynapcnn/__init__.py
|
|
259
256
|
tests/test_dynapcnn/custom_jit_filters.py
|
|
257
|
+
tests/test_dynapcnn/hw_utils.py
|
|
260
258
|
tests/test_dynapcnn/test_auto_mapping.py
|
|
261
259
|
tests/test_dynapcnn/test_compatible_layer_build.py
|
|
262
260
|
tests/test_dynapcnn/test_config_making.py
|
|
@@ -289,7 +287,6 @@ tests/test_dynapcnnnetwork/model_dummy_1.py
|
|
|
289
287
|
tests/test_dynapcnnnetwork/model_dummy_2.py
|
|
290
288
|
tests/test_dynapcnnnetwork/model_dummy_3.py
|
|
291
289
|
tests/test_dynapcnnnetwork/model_dummy_4.py
|
|
292
|
-
tests/test_dynapcnnnetwork/model_dummy_5.py
|
|
293
290
|
tests/test_dynapcnnnetwork/model_dummy_seq.py
|
|
294
291
|
tests/test_dynapcnnnetwork/test_dynapcnnnetwork.py
|
|
295
292
|
tests/test_dynapcnnnetwork/test_failcases.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"git_version": "70cee7a", "is_release": false}
|
|
@@ -3,7 +3,7 @@ import torch.nn as nn
|
|
|
3
3
|
|
|
4
4
|
from sinabs.backend.dynapcnn import DynapcnnNetwork
|
|
5
5
|
from sinabs.from_torch import from_model
|
|
6
|
-
from
|
|
6
|
+
from hw_utils import find_open_devices
|
|
7
7
|
|
|
8
8
|
ann = nn.Sequential(
|
|
9
9
|
nn.Conv2d(1, 20, 5, 1, bias=False),
|
|
@@ -14,7 +14,7 @@ from torch import nn
|
|
|
14
14
|
from sinabs.backend.dynapcnn.dynapcnn_network import DynapcnnNetwork
|
|
15
15
|
from sinabs.from_torch import from_model
|
|
16
16
|
from sinabs.layers import NeuromorphicReLU
|
|
17
|
-
from
|
|
17
|
+
from hw_utils import find_open_devices
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
class DynapCnnNetA(nn.Module):
|
|
@@ -3,7 +3,12 @@ import time
|
|
|
3
3
|
import pytest
|
|
4
4
|
import samna
|
|
5
5
|
import torch
|
|
6
|
-
from
|
|
6
|
+
from hw_utils import (
|
|
7
|
+
find_open_devices,
|
|
8
|
+
get_ones_network,
|
|
9
|
+
is_any_samna_device_connected,
|
|
10
|
+
is_device_connected,
|
|
11
|
+
)
|
|
7
12
|
from torch import nn
|
|
8
13
|
|
|
9
14
|
from sinabs.backend.dynapcnn import DynapcnnNetwork
|
|
@@ -3,8 +3,9 @@ from typing import Callable, Union
|
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
5
|
import samna
|
|
6
|
-
from
|
|
7
|
-
from
|
|
6
|
+
from custom_jit_filters import majority_readout_filter as custom_filter
|
|
7
|
+
from hw_utils import find_open_devices, is_any_samna_device_connected
|
|
8
|
+
|
|
8
9
|
from sinabs.backend.dynapcnn.dynapcnn_visualizer import DynapcnnVisualizer
|
|
9
10
|
|
|
10
11
|
|
|
@@ -88,7 +89,7 @@ def test_jit_compilation():
|
|
|
88
89
|
streamer_graph = samna.graph.EventFilterGraph()
|
|
89
90
|
# Streamer graph
|
|
90
91
|
# Dvs node
|
|
91
|
-
_, dvs_member_filter, _, streamer_node = streamer_graph.sequential(
|
|
92
|
+
(_, dvs_member_filter, _, streamer_node) = streamer_graph.sequential(
|
|
92
93
|
[
|
|
93
94
|
# samna.graph.JitSource(samna.speck2e.event.OutputEvent),
|
|
94
95
|
dynapcnn_network.samna_device.get_model_source_node(),
|
|
@@ -14,11 +14,6 @@ from .model_dummy_4 import batch_size as batch_size_4
|
|
|
14
14
|
from .model_dummy_4 import expected_output as expected_output_4
|
|
15
15
|
from .model_dummy_4 import input_shape as input_shape_4
|
|
16
16
|
from .model_dummy_4 import snn as snn_4
|
|
17
|
-
from .model_dummy_5 import batch_size as batch_size_5
|
|
18
|
-
from .model_dummy_5 import expected_output as expected_output_5
|
|
19
|
-
from .model_dummy_5 import input_shape as input_shape_5
|
|
20
|
-
from .model_dummy_5 import snn as snn_5
|
|
21
|
-
|
|
22
17
|
from .model_dummy_seq import (
|
|
23
18
|
expected_seq_1,
|
|
24
19
|
expected_seq_2,
|
|
@@ -35,13 +30,3 @@ args_DynapcnnNetworkTest = [
|
|
|
35
30
|
(seq_1, input_shape_seq, 1, expected_seq_1),
|
|
36
31
|
(seq_2, input_shape_seq, 1, expected_seq_2),
|
|
37
32
|
]
|
|
38
|
-
|
|
39
|
-
args_DynapcnnNetworkMappingTest = [
|
|
40
|
-
(snn_1, input_shape_1, batch_size_1),
|
|
41
|
-
(snn_2, input_shape_2, batch_size_2),
|
|
42
|
-
(snn_3, input_shape_3, batch_size_3),
|
|
43
|
-
(snn_4, input_shape_4, batch_size_4),
|
|
44
|
-
(seq_1, input_shape_seq, 1),
|
|
45
|
-
(seq_2, input_shape_seq, 1),
|
|
46
|
-
# (snn_5, input_shape_5, batch_size_5), #TODO: forward method needs implementation
|
|
47
|
-
]
|
|
@@ -13,49 +13,49 @@ class SNN(nn.Module):
|
|
|
13
13
|
def __init__(self, batch_size) -> None:
|
|
14
14
|
super().__init__()
|
|
15
15
|
|
|
16
|
-
self.conv1 = nn.Conv2d(2, 10, 2, 1, bias=False)
|
|
16
|
+
self.conv1 = nn.Conv2d(2, 10, 2, 1, bias=False) # node 0
|
|
17
17
|
self.iaf1 = IAFSqueeze(
|
|
18
18
|
batch_size=batch_size,
|
|
19
19
|
min_v_mem=-1.0,
|
|
20
20
|
spike_threshold=1.0,
|
|
21
21
|
surrogate_grad_fn=PeriodicExponential(),
|
|
22
|
-
)
|
|
23
|
-
self.pool1 = nn.AvgPool2d(
|
|
24
|
-
self.pool1a = nn.AvgPool2d(
|
|
22
|
+
) # node 1
|
|
23
|
+
self.pool1 = nn.AvgPool2d(3, 3) # node 2
|
|
24
|
+
self.pool1a = nn.AvgPool2d(4, 4) # node 3
|
|
25
25
|
|
|
26
|
-
self.conv2 = nn.Conv2d(10, 10,
|
|
26
|
+
self.conv2 = nn.Conv2d(10, 10, 4, 1, bias=False) # node 4
|
|
27
27
|
self.iaf2 = IAFSqueeze(
|
|
28
28
|
batch_size=batch_size,
|
|
29
29
|
min_v_mem=-1.0,
|
|
30
30
|
spike_threshold=1.0,
|
|
31
31
|
surrogate_grad_fn=PeriodicExponential(),
|
|
32
|
-
)
|
|
32
|
+
) # node 6
|
|
33
33
|
|
|
34
|
-
self.conv3 = nn.Conv2d(10, 1, 2, 1, bias=False)
|
|
34
|
+
self.conv3 = nn.Conv2d(10, 1, 2, 1, bias=False) # node 8
|
|
35
35
|
self.iaf3 = IAFSqueeze(
|
|
36
36
|
batch_size=batch_size,
|
|
37
37
|
min_v_mem=-1.0,
|
|
38
38
|
spike_threshold=1.0,
|
|
39
39
|
surrogate_grad_fn=PeriodicExponential(),
|
|
40
|
-
)
|
|
40
|
+
) # node 9
|
|
41
41
|
|
|
42
42
|
self.flat = nn.Flatten()
|
|
43
43
|
|
|
44
|
-
self.fc1 = nn.Linear(
|
|
44
|
+
self.fc1 = nn.Linear(49, 500, bias=False) # node 10
|
|
45
45
|
self.iaf4 = IAFSqueeze(
|
|
46
46
|
batch_size=batch_size,
|
|
47
47
|
min_v_mem=-1.0,
|
|
48
48
|
spike_threshold=1.0,
|
|
49
49
|
surrogate_grad_fn=PeriodicExponential(),
|
|
50
|
-
)
|
|
50
|
+
) # node 11
|
|
51
51
|
|
|
52
|
-
self.fc2 = nn.Linear(
|
|
52
|
+
self.fc2 = nn.Linear(500, 10, bias=False) # node 12
|
|
53
53
|
self.iaf5 = IAFSqueeze(
|
|
54
54
|
batch_size=batch_size,
|
|
55
55
|
min_v_mem=-1.0,
|
|
56
56
|
spike_threshold=1.0,
|
|
57
57
|
surrogate_grad_fn=PeriodicExponential(),
|
|
58
|
-
)
|
|
58
|
+
) # node 13
|
|
59
59
|
|
|
60
60
|
self.adder = Merge()
|
|
61
61
|
|
|
@@ -67,13 +67,14 @@ class SNN(nn.Module):
|
|
|
67
67
|
|
|
68
68
|
conv2_out = self.conv2(pool1_out)
|
|
69
69
|
iaf2_out = self.iaf2(conv2_out)
|
|
70
|
+
|
|
70
71
|
conv3_out = self.conv3(self.adder(pool1a_out, iaf2_out))
|
|
71
72
|
iaf3_out = self.iaf3(conv3_out)
|
|
73
|
+
|
|
72
74
|
flat_out = self.flat(iaf3_out)
|
|
73
75
|
|
|
74
76
|
fc1_out = self.fc1(flat_out)
|
|
75
77
|
iaf4_out = self.iaf4(fc1_out)
|
|
76
|
-
|
|
77
78
|
fc2_out = self.fc2(iaf4_out)
|
|
78
79
|
iaf5_out = self.iaf5(fc2_out)
|
|
79
80
|
|