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

|
|
49
|
+

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

|
|
56
54
|
|
|
57
|
-
A network with
|
|
55
|
+
A network with residual connections:
|
|
58
56
|
|
|
59
|
-

|
|
58
|
+
|
|
59
|
+
A more complex network:
|
|
60
60
|
|
|
61
|
+

|
|
61
62
|
|
|
62
63
|
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.
|
|
63
64
|
|
|
65
|
+
Note2: the use of two parallel network although supported by our chip was not fully considered in our sinabs implementation.
|
|
66
|
+
|
|
64
67
|
## How to make use of the graph extraction feature?
|
|
65
68
|
|
|
66
69
|
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.
|
|
@@ -68,64 +71,70 @@ For general architectures, users need to define their classes, by defining at le
|
|
|
68
71
|
Here is an example to define a network with a merge and a split:
|
|
69
72
|
|
|
70
73
|
```python
|
|
74
|
+
import torch
|
|
71
75
|
import torch.nn as nn
|
|
72
76
|
|
|
73
77
|
from sinabs.activation.surrogate_gradient_fn import PeriodicExponential
|
|
74
78
|
from sinabs.layers import IAFSqueeze, Merge, SumPool2d
|
|
75
79
|
|
|
80
|
+
|
|
76
81
|
class SNN(nn.Module):
|
|
77
82
|
def __init__(self, batch_size) -> None:
|
|
78
83
|
super().__init__()
|
|
79
|
-
|
|
80
|
-
self.
|
|
81
|
-
self.
|
|
84
|
+
# -- graph node A --
|
|
85
|
+
self.conv_A = nn.Conv2d(2, 4, 2, 1, bias=False)
|
|
86
|
+
self.iaf_A = IAFSqueeze(
|
|
82
87
|
batch_size=batch_size,
|
|
83
88
|
min_v_mem=-1.0,
|
|
84
89
|
spike_threshold=1.0,
|
|
85
90
|
surrogate_grad_fn=PeriodicExponential(),
|
|
86
91
|
)
|
|
87
|
-
|
|
88
|
-
self.
|
|
89
|
-
self.
|
|
92
|
+
# -- graph node B --
|
|
93
|
+
self.conv_B = nn.Conv2d(4, 4, 2, 1, bias=False)
|
|
94
|
+
self.iaf2_B = IAFSqueeze(
|
|
90
95
|
batch_size=batch_size,
|
|
91
96
|
min_v_mem=-1.0,
|
|
92
97
|
spike_threshold=1.0,
|
|
93
98
|
surrogate_grad_fn=PeriodicExponential(),
|
|
94
99
|
)
|
|
95
|
-
self.
|
|
96
|
-
|
|
97
|
-
self.
|
|
98
|
-
self.
|
|
100
|
+
self.pool_B = SumPool2d(2, 2)
|
|
101
|
+
# -- graph node C --
|
|
102
|
+
self.conv_C = nn.Conv2d(4, 4, 2, 1, bias=False)
|
|
103
|
+
self.iaf_C = IAFSqueeze(
|
|
99
104
|
batch_size=batch_size,
|
|
100
105
|
min_v_mem=-1.0,
|
|
101
106
|
spike_threshold=1.0,
|
|
102
107
|
surrogate_grad_fn=PeriodicExponential(),
|
|
103
108
|
)
|
|
104
|
-
self.
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
self.
|
|
108
|
-
self.iaf4 = IAFSqueeze(
|
|
109
|
+
self.pool_C = SumPool2d(2, 2)
|
|
110
|
+
# -- graph node D --
|
|
111
|
+
self.conv_D = nn.Conv2d(4, 4, 2, 1, bias=False)
|
|
112
|
+
self.iaf_D = IAFSqueeze(
|
|
109
113
|
batch_size=batch_size,
|
|
110
114
|
min_v_mem=-1.0,
|
|
111
115
|
spike_threshold=1.0,
|
|
112
116
|
surrogate_grad_fn=PeriodicExponential(),
|
|
113
117
|
)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
self.
|
|
117
|
-
self.flat2 = nn.Flatten()
|
|
118
|
-
|
|
119
|
-
self.conv5 = nn.Conv2d(1, 1, 2, 1, bias=False)
|
|
120
|
-
self.iaf5 = IAFSqueeze(
|
|
118
|
+
# -- graph node E --
|
|
119
|
+
self.conv_E = nn.Conv2d(4, 4, 2, 1, bias=False)
|
|
120
|
+
self.iaf3_E = IAFSqueeze(
|
|
121
121
|
batch_size=batch_size,
|
|
122
122
|
min_v_mem=-1.0,
|
|
123
123
|
spike_threshold=1.0,
|
|
124
124
|
surrogate_grad_fn=PeriodicExponential(),
|
|
125
125
|
)
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
self.
|
|
126
|
+
self.pool_E = SumPool2d(2, 2)
|
|
127
|
+
# -- graph node F --
|
|
128
|
+
self.conv_F = nn.Conv2d(4, 4, 2, 1, bias=False)
|
|
129
|
+
self.iaf_F = IAFSqueeze(
|
|
130
|
+
batch_size=batch_size,
|
|
131
|
+
min_v_mem=-1.0,
|
|
132
|
+
spike_threshold=1.0,
|
|
133
|
+
surrogate_grad_fn=PeriodicExponential(),
|
|
134
|
+
)
|
|
135
|
+
# -- graph node G --
|
|
136
|
+
self.fc3 = nn.Linear(144, 10, bias=False)
|
|
137
|
+
self.iaf3_fc = IAFSqueeze(
|
|
129
138
|
batch_size=batch_size,
|
|
130
139
|
min_v_mem=-1.0,
|
|
131
140
|
spike_threshold=1.0,
|
|
@@ -134,43 +143,47 @@ class SNN(nn.Module):
|
|
|
134
143
|
|
|
135
144
|
# -- merges --
|
|
136
145
|
self.merge1 = Merge()
|
|
137
|
-
|
|
146
|
+
|
|
147
|
+
# -- falts --
|
|
148
|
+
self.flat_D = nn.Flatten()
|
|
149
|
+
self.flat_F = nn.Flatten()
|
|
138
150
|
|
|
139
151
|
def forward(self, x):
|
|
140
152
|
# conv 1 - A/0
|
|
141
|
-
|
|
142
|
-
|
|
153
|
+
convA_out = self.conv_A(x)
|
|
154
|
+
iaf_A_out = self.iaf_A(convA_out)
|
|
143
155
|
|
|
144
156
|
# conv 2 - B/1
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
157
|
+
conv_B_out = self.conv_B(iaf_A_out)
|
|
158
|
+
iaf_B_out = self.iaf2_B(conv_B_out)
|
|
159
|
+
pool_B_out = self.pool_B(iaf_B_out)
|
|
148
160
|
|
|
149
161
|
# conv 3 - C/2
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
#
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
162
|
+
conv_C_out = self.conv_C(pool_B_out)
|
|
163
|
+
iaf_C_out = self.iaf_C(conv_C_out)
|
|
164
|
+
pool_C_out = self.pool_C(iaf_C_out)
|
|
165
|
+
|
|
166
|
+
# conv 4 - D/4
|
|
167
|
+
conv_D_out = self.conv_D(pool_C_out)
|
|
168
|
+
iaf_D_out = self.iaf_D(conv_D_out)
|
|
169
|
+
# fc 1 - E/3
|
|
170
|
+
conv_E_out = self.conv_E(pool_B_out)
|
|
171
|
+
iaf3_E_out = self.iaf3_E(conv_E_out)
|
|
172
|
+
pool_E_out = self.pool_E(iaf3_E_out)
|
|
173
|
+
|
|
174
|
+
# fc 2 - F/6
|
|
175
|
+
conv_F_out = self.conv_F(pool_E_out)
|
|
176
|
+
iaf_F_out = self.iaf_F(conv_F_out)
|
|
177
|
+
|
|
178
|
+
# fc 2 - G/5
|
|
179
|
+
flat_D_out = self.flat_D(iaf_D_out)
|
|
180
|
+
flat_F_out = self.flat_F(iaf_F_out)
|
|
181
|
+
|
|
182
|
+
merge1_out = self.merge1(flat_D_out, flat_F_out)
|
|
183
|
+
fc3_out = self.fc3(merge1_out)
|
|
184
|
+
iaf3_fc_out = self.iaf3_fc(fc3_out)
|
|
185
|
+
|
|
186
|
+
return iaf3_fc_out
|
|
174
187
|
```
|
|
175
188
|
|
|
176
189
|
## Can I achieve a "Residual Connection" like ResNet does?
|
|
@@ -180,9 +193,9 @@ change the `samna.speck2f.configuration.CNNLayerDestination.layer` to achieve th
|
|
|
180
193
|
familiar with the `samna-configuration`.
|
|
181
194
|
You can also make use of our network graph extraction feature, to implement residual networks.
|
|
182
195
|
|
|
183
|
-
## How
|
|
196
|
+
## How can I define "Residual Connection" manually?
|
|
184
197
|
|
|
185
|
-
|
|
198
|
+
You can also achieve "Residual Connection" by manually modify the `samna-configuration`.
|
|
186
199
|
|
|
187
200
|
Let's say you want an architecture like below:
|
|
188
201
|
|
|
@@ -221,7 +234,7 @@ class ResidualBlock(nn.Module):
|
|
|
221
234
|
|
|
222
235
|
```
|
|
223
236
|
|
|
224
|
-
|
|
237
|
+
You can write it like:
|
|
225
238
|
|
|
226
239
|
```python
|
|
227
240
|
# define a Sequential first
|
|
@@ -264,8 +277,8 @@ devkit.get_model().apply_configuration(samna_cfg)
|
|
|
264
277
|
|
|
265
278
|
```
|
|
266
279
|
|
|
267
|
-
|
|
268
|
-
|
|
280
|
+
It is a lot of manual work but it will let you have your Residual Block.
|
|
281
|
+
We recommend to use our network graph extraction feature for residual connections.
|
|
269
282
|
|
|
270
283
|
## What execution order should I be aware of when I am implementing a sequential structure?
|
|
271
284
|
You should be aware with the internal layer order.
|
|
Binary file
|
|
@@ -97,7 +97,6 @@
|
|
|
97
97
|
"source": [
|
|
98
98
|
"from torch import nn\n",
|
|
99
99
|
"\n",
|
|
100
|
-
"\n",
|
|
101
100
|
"# define a CNN model\n",
|
|
102
101
|
"cnn = nn.Sequential(\n",
|
|
103
102
|
" # [2, 34, 34] -> [8, 17, 17]\n",
|
|
@@ -1181,7 +1180,6 @@
|
|
|
1181
1180
|
"source": [
|
|
1182
1181
|
"from sinabs.backend.dynapcnn.dynapcnn_visualizer import DynapcnnVisualizer\n",
|
|
1183
1182
|
"\n",
|
|
1184
|
-
"\n",
|
|
1185
1183
|
"visualizer = DynapcnnVisualizer(\n",
|
|
1186
1184
|
" window_scale=(4, 8),\n",
|
|
1187
1185
|
" dvs_shape=(34, 34),\n",
|
|
@@ -103,7 +103,6 @@
|
|
|
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",
|
|
107
106
|
"# create a dummy snn for DynapcnnNetwork initialization\n",
|
|
108
107
|
"snn = nn.Sequential(\n",
|
|
109
108
|
" 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,6 +828,7 @@ 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?
|
|
831
832
|
raise RuntimeError(f"Node {node} has more than 1 input")
|
|
832
833
|
return sources.pop()
|
|
833
834
|
|
|
@@ -80,7 +80,7 @@ class SpikingMaxPooling2dLayer(nn.Module):
|
|
|
80
80
|
Returns:
|
|
81
81
|
(channelsOut, height_out, width_out)
|
|
82
82
|
"""
|
|
83
|
-
|
|
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,8 +121,9 @@ 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
|
|
124
125
|
docs/speck/faqs/imgs/network-with-merge-and-split.png
|
|
125
|
-
docs/speck/faqs/imgs/
|
|
126
|
+
docs/speck/faqs/imgs/network-with-residual-connection.png
|
|
126
127
|
docs/speck/faqs/imgs/two-networks-merging-output.png
|
|
127
128
|
docs/speck/notebooks/leak_neuron.ipynb
|
|
128
129
|
docs/speck/notebooks/nmnist_quick_start.ipynb
|
|
@@ -228,6 +229,7 @@ sinabs/layers/functional/__init__.py
|
|
|
228
229
|
sinabs/layers/functional/alif.py
|
|
229
230
|
sinabs/layers/functional/lif.py
|
|
230
231
|
tests/__init__.py
|
|
232
|
+
tests/hw_utils.py
|
|
231
233
|
tests/mnist_params.pt
|
|
232
234
|
tests/requirements.txt
|
|
233
235
|
tests/test_activations.py
|
|
@@ -253,8 +255,8 @@ tests/inputs_and_results/hooks/input_diffs.pth
|
|
|
253
255
|
tests/inputs_and_results/hooks/model_synops.pth
|
|
254
256
|
tests/models/README.txt
|
|
255
257
|
tests/models/synop_hook_model.pth
|
|
258
|
+
tests/test_dynapcnn/__init__.py
|
|
256
259
|
tests/test_dynapcnn/custom_jit_filters.py
|
|
257
|
-
tests/test_dynapcnn/hw_utils.py
|
|
258
260
|
tests/test_dynapcnn/test_auto_mapping.py
|
|
259
261
|
tests/test_dynapcnn/test_compatible_layer_build.py
|
|
260
262
|
tests/test_dynapcnn/test_config_making.py
|
|
@@ -287,6 +289,7 @@ tests/test_dynapcnnnetwork/model_dummy_1.py
|
|
|
287
289
|
tests/test_dynapcnnnetwork/model_dummy_2.py
|
|
288
290
|
tests/test_dynapcnnnetwork/model_dummy_3.py
|
|
289
291
|
tests/test_dynapcnnnetwork/model_dummy_4.py
|
|
292
|
+
tests/test_dynapcnnnetwork/model_dummy_5.py
|
|
290
293
|
tests/test_dynapcnnnetwork/model_dummy_seq.py
|
|
291
294
|
tests/test_dynapcnnnetwork/test_dynapcnnnetwork.py
|
|
292
295
|
tests/test_dynapcnnnetwork/test_failcases.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"git_version": "6c362a3", "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 hw_utils import find_open_devices
|
|
6
|
+
from tests.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 hw_utils import find_open_devices
|
|
17
|
+
from tests.hw_utils import find_open_devices
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
class DynapCnnNetA(nn.Module):
|
|
@@ -3,12 +3,7 @@ import time
|
|
|
3
3
|
import pytest
|
|
4
4
|
import samna
|
|
5
5
|
import torch
|
|
6
|
-
from hw_utils import
|
|
7
|
-
find_open_devices,
|
|
8
|
-
get_ones_network,
|
|
9
|
-
is_any_samna_device_connected,
|
|
10
|
-
is_device_connected,
|
|
11
|
-
)
|
|
6
|
+
from tests.hw_utils import find_open_devices, is_any_samna_device_connected
|
|
12
7
|
from torch import nn
|
|
13
8
|
|
|
14
9
|
from sinabs.backend.dynapcnn import DynapcnnNetwork
|
|
@@ -3,9 +3,8 @@ from typing import Callable, Union
|
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
5
|
import samna
|
|
6
|
-
from custom_jit_filters import majority_readout_filter as custom_filter
|
|
7
|
-
from hw_utils import find_open_devices
|
|
8
|
-
|
|
6
|
+
from .custom_jit_filters import majority_readout_filter as custom_filter
|
|
7
|
+
from tests.hw_utils import find_open_devices
|
|
9
8
|
from sinabs.backend.dynapcnn.dynapcnn_visualizer import DynapcnnVisualizer
|
|
10
9
|
|
|
11
10
|
|
|
@@ -89,7 +88,7 @@ def test_jit_compilation():
|
|
|
89
88
|
streamer_graph = samna.graph.EventFilterGraph()
|
|
90
89
|
# Streamer graph
|
|
91
90
|
# Dvs node
|
|
92
|
-
|
|
91
|
+
_, dvs_member_filter, _, streamer_node = streamer_graph.sequential(
|
|
93
92
|
[
|
|
94
93
|
# samna.graph.JitSource(samna.speck2e.event.OutputEvent),
|
|
95
94
|
dynapcnn_network.samna_device.get_model_source_node(),
|
|
File without changes
|
{sinabs-3.1.3.dev1 → sinabs-3.1.3.dev12}/tests/test_dynapcnnnetwork/conftest_dynapcnnnetwork.py
RENAMED
|
@@ -14,6 +14,11 @@ 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
|
+
|
|
17
22
|
from .model_dummy_seq import (
|
|
18
23
|
expected_seq_1,
|
|
19
24
|
expected_seq_2,
|
|
@@ -30,3 +35,13 @@ args_DynapcnnNetworkTest = [
|
|
|
30
35
|
(seq_1, input_shape_seq, 1, expected_seq_1),
|
|
31
36
|
(seq_2, input_shape_seq, 1, expected_seq_2),
|
|
32
37
|
]
|
|
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)
|
|
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
|
+
)
|
|
23
|
+
self.pool1 = nn.AvgPool2d(2, 2)
|
|
24
|
+
self.pool1a = nn.AvgPool2d(2, 2)
|
|
25
25
|
|
|
26
|
-
self.conv2 = nn.Conv2d(10, 10,
|
|
26
|
+
self.conv2 = nn.Conv2d(10, 10, 1, 1, bias=False)
|
|
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
|
+
)
|
|
33
33
|
|
|
34
|
-
self.conv3 = nn.Conv2d(10, 1, 2, 1, bias=False)
|
|
34
|
+
self.conv3 = nn.Conv2d(10, 1, 2, 1, bias=False)
|
|
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
|
+
)
|
|
41
41
|
|
|
42
42
|
self.flat = nn.Flatten()
|
|
43
43
|
|
|
44
|
-
self.fc1 = nn.Linear(
|
|
44
|
+
self.fc1 = nn.Linear(225, 200, bias=False)
|
|
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
|
+
)
|
|
51
51
|
|
|
52
|
-
self.fc2 = nn.Linear(
|
|
52
|
+
self.fc2 = nn.Linear(200, 10, bias=False)
|
|
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
|
+
)
|
|
59
59
|
|
|
60
60
|
self.adder = Merge()
|
|
61
61
|
|
|
@@ -67,14 +67,13 @@ class SNN(nn.Module):
|
|
|
67
67
|
|
|
68
68
|
conv2_out = self.conv2(pool1_out)
|
|
69
69
|
iaf2_out = self.iaf2(conv2_out)
|
|
70
|
-
|
|
71
70
|
conv3_out = self.conv3(self.adder(pool1a_out, iaf2_out))
|
|
72
71
|
iaf3_out = self.iaf3(conv3_out)
|
|
73
|
-
|
|
74
72
|
flat_out = self.flat(iaf3_out)
|
|
75
73
|
|
|
76
74
|
fc1_out = self.fc1(flat_out)
|
|
77
75
|
iaf4_out = self.iaf4(fc1_out)
|
|
76
|
+
|
|
78
77
|
fc2_out = self.fc2(iaf4_out)
|
|
79
78
|
iaf5_out = self.iaf5(fc2_out)
|
|
80
79
|
|