Hierarchical feature binding in a spiking neural network model of the primate ventral visual pathway.
The 18 matches
- [1] § Materials and methods › Preprocessing visual stimuli by Gabor filtering ↔ src/hsnn/core/encoders/gabor.py, lines 13–65 · score 0.81 · spatial bandwidth, aspect ratio, Gabor filters, octaves, kernel, wavelength
- [2] § Results › Feature selectivity through network self-organisation › Feature selectivity is resilient to partial visual occlusion. ↔ scripts/analysis/inference_occlusion.py, lines 1–44 · score 0.72 · sliding curtain, L0 Poisson, progressively masked, n4p2, occlusion, width
- [3] § Results › Feature selectivity through network self-organisation › Single neuron information analysis demonstrates increased feature selectivity. ↔ notebooks/figures/plot_fig9.ipynb, lines 1–115 · score 0.69 · single neuron information, concave selective neurons, boundary contour elements, N3P2, N4P2, network training
- [4] § Results › Emergence of polychronization supports hierarchical feature binding › Reuse of feature and binding neurons preserves selective polychronous patterns. ↔ src/hsnn/pipeline/reuse/ambiguity.py, lines 1–57 · score 0.68 · bound feature, circuit role, anchor layer, binding neuron, locked, mismatched
- [5] § Results › Emergence of polychronization supports hierarchical feature binding › Reuse of feature and binding neurons preserves selective polychronous patterns. ↔ src/hsnn/pipeline/reuse/completeness.py, lines 1–60 · score 0.66 · fixed Poisson, bound feature, anchor layer, distinct neuron, reuse, bits
- [6] § Results › Feature selectivity through network self-organisation › Resilience of the network to input noise preserves feature selectivity. ↔ notebooks/figures/plot_fig11.ipynb, lines 1–119 · score 0.65 · noise amplitudes, increasing noise, network architecture, convex boundary element, N4P2, trained networks
- [7] § Results › Emergence of polychronization supports hierarchical feature binding › Reuse of feature and binding neurons preserves selective polychronous patterns. ↔ notebooks/figures/plot_fig19.ipynb, lines 97–160 · score 0.63 · role reuse factor, distinct neuron, excitatory population, 2–4, S8, anchored
- [8] § Results › Emergence of polychronization supports hierarchical feature binding › Reuse of feature and binding neurons preserves selective polychronous patterns. ↔ src/hsnn/pipeline/reuse/ambiguity.py, lines 1–57 · score 0.62 · bound feature, binding neuron, locked, mismatched, uninformative, reusing
- [9] § Results › Emergence of polychronization supports hierarchical feature binding › Binding circuits cover the feature repertoire at moderate selectivity. ↔ src/hsnn/pipeline/reuse/completeness.py, lines 1–60 · score 0.61 · binding circuit, distinct neurons, thinning, collapsed, Coverage, labelled
- [10] § Results › Feature selectivity through network self-organisation › Single neuron information analysis demonstrates increased feature selectivity. ↔ notebooks/figures/plot_fig11.ipynb, lines 1–119 · score 0.61 · single neuron information, convex selective, N3P2, N4P2, network training, selective neurons
- [11] § Results › Emergence of polychronization supports hierarchical feature binding › Identifying PNGs across different network architectures. ↔ notebooks/supplementary/plot_S5.ipynb, lines 1–53 · score 0.58 · eligibility criteria, detection pipeline, detected triplets, S5, surrogate, eligible
- [12] § Results › Feature selectivity through network self-organisation › Feature selectivity is resilient to partial visual occlusion. ↔ src/hsnn/core/encoders/gabor.py, lines 122–178 · score 0.56 · sliding curtain, mask width, Gabor, occlusion, filter
- [13] § Results › Emergence of polychronization supports hierarchical feature binding › PNG onset timing and precision correlate with feature selectivity. ↔ notebooks/figures/plot_fig20.ipynb, lines 1–48 · score 0.56 · Empirical distribution, convex boundary selectivity, standard deviation, F1 score, dispersion, N3P2
- [14] § Results › Emergence of polychronization supports hierarchical feature binding › Identifying PNGs across different network architectures. ↔ notebooks/figures/plot_fig14B.ipynb, lines 1–109 · score 0.54 · standard deviation, F1 scores, neuron HFB circuits, N3P2, N4P2, boundary elements
- [15] § Results › Feature selectivity through network self-organisation › Single neuron information analysis demonstrates increased feature selectivity. ↔ notebooks/figures/plot_fig9.ipynb, lines 1–115 · score 0.53 · network architectures, N3P2, N4P2, convex boundary, information conveyed, location
- [16] § Materials and methods › Performance measures › Polychronous neuronal group detection. ↔ src/hsnn/analysis/png/detection.py, lines 138–186 · score 0.52 · neuron HFB circuit, synaptic weight, refined, detection, SPADE, connected
- [17] § Results › Emergence of polychronization supports hierarchical feature binding › PNG selectivity for convex boundary elements. ↔ scripts/figures/compute_png_metrics.py, lines 1–38 · score 0.52 · F1 score, boundary elements, n3p2, n4p2, classifying, concave
- [18] § Results › Emergence of polychronization supports hierarchical feature binding › PNG selectivity for convex boundary elements. ↔ notebooks/figures/plot_fig14B.ipynb, lines 1–109 · score 0.51 · F1 scores, neuron HFB circuits, N3P2, N4P2, S6, network architectures
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 178 lines · 5.8 KB · AGPL-3.0 · 2 matches
- import itertools
- from typing import List, Sequence
- import cv2
- import numpy as np
- import numpy.typing as npt
- from ._base import BaseEncoder
- __all__ = ["GaborEncoder", "OccludableGaborEncoder"]
- def get_filters(
- phase_offsets: Sequence,
- orientations: Sequence,
- wavelengths: Sequence,
- kernel_size: int,
- spatial_wavelength: float = 1.0,
- aspect_ratio: float = 0.5,
- is_normalised: bool = True,
- ) -> List[np.ndarray]:
- """Gets Gabor filters for image transforms.
- Args:
- phase_offsets (Sequence): Phase offset of sinusoid in radians (psi).
- orientations (Sequence): Filter orientation in radians (theta).
- wavelengths (Sequence): Sinusoid wavelengths in px / cycle (lambd).
- kernel_size (int): Kernel size (ksize).
- spatial_wavelength (float, optional): Spatial bandwidth in octaves (b). Defaults to 1.0.
- aspect_ratio (float, optional): Filter aspect ratio (gamma). Defaults to 0.5.
- is_normalised (bool, optional): Normalises kernel.
- Returns:
- List[ndarray]: List of Gabor filters.
- """
- def create_filter(phase_offset, orientation, wavelength):
- sigma = (
- wavelength
- / np.pi
- * np.sqrt(np.log(2) / 2)
- * (2**spatial_wavelength + 1)
- / (2**spatial_wavelength - 1)
- )
- filter_kernel = cv2.getGaborKernel(
- (kernel_size, kernel_size),
- sigma,
- orientation,
- wavelength,
- aspect_ratio,
- phase_offset,
- ktype=cv2.CV_32F,
- )
- filter_kernel -= np.mean(filter_kernel) # type: ignore
- if is_normalised:
- filter_kernel /= 1.0 * np.sqrt(np.sum(filter_kernel**2))
- return filter_kernel
- filters = [
- create_filter(phase_offset, orientation, wavelength)
- for phase_offset, orientation, wavelength in itertools.product(
- phase_offsets, orientations, wavelengths
- )
- ]
- return filters
- class GaborEncoder(BaseEncoder):
- """Encoder to transform an input image into a driving stimulus using a set of Gabor filters.
- Attributes:
- filters (List[np.ndarray]): List of filters to be applied to the image.
- scale_factor (float): Scaling factor for activations.
- renormalise (bool, optional): Whether to renormalise the filtered images. Defaults to False.
- min_value (float, optional): Minimum value for the filtered images. Defaults to 0.
- """
- def __init__(
- self,
- phase_offsets: Sequence,
- orientations: Sequence,
- wavelengths: Sequence,
- kernel_size: int,
- scale_factor: float,
- renormalise: bool = False,
- min_value: float = 0,
- **filter_kwargs,
- ) -> None:
- self.filters = get_filters(
- phase_offsets, orientations, wavelengths, kernel_size, **filter_kwargs
- )
- self.scale_factor = scale_factor
- self.renormalise = renormalise
- self.min_value = min_value
- def transform(self, data: np.ndarray) -> npt.NDArray[np.float_]:
- filter_outputs = np.zeros([len(self.filters), *data.shape])
- stdev = np.std(data)
- if stdev > 0:
- image_ = data / stdev
- for idx, filter in enumerate(self.filters):
- filter_output = cv2.filter2D(image_, cv2.CV_64F, filter) # type: ignore[attr-defined]
- filter_outputs[idx, ...] = filter_output
- filter_outputs[filter_outputs < self.min_value] = 0
- if self.renormalise:
- filter_outputs = np.array(
- [
- filter_output / np.linalg.norm(filter_output)
- if np.any(filter_output)
- else filter_output
- for filter_output in filter_outputs
- ]
- )
- stdev = np.std(filter_outputs)
- if stdev > 0:
- filter_outputs = filter_outputs / np.std(filter_outputs)
- return self.scale_factor * filter_outputs.flatten()
- class OccludableGaborEncoder(GaborEncoder):
- """Extension of GaborEncoder that allows for post-process masking
- of the rate map to simulate occlusion.
- """
- def __init__(
- self,
- phase_offsets: Sequence,
- orientations: Sequence,
- wavelengths: Sequence,
- kernel_size: int,
- scale_factor: float,
- renormalise: bool = False,
- min_value: float = 0,
- mask_width: int = 0,
- **filter_kwargs,
- ) -> None:
- super().__init__(
- phase_offsets,
- orientations,
- wavelengths,
- kernel_size,
- scale_factor,
- renormalise=renormalise,
- min_value=min_value,
- **filter_kwargs,
- )
- self._mask_x_end: int = mask_width
- def set_occlusion_curtain(self, width_pixels: int) -> None:
- """Sets the width of the occlusion curtain starting from x=0."""
- self._mask_x_end = width_pixels
- def transform(self, data: np.ndarray) -> npt.NDArray[np.float_]:
- flat_output = super().transform(data)
- if self._mask_x_end <= 0:
- return flat_output
- # Reshape to restore spatial awareness
- # Shape is (N_filters, Height, Width)
- n_filters = len(self.filters)
- h, w = data.shape
- # Safety check to ensure reshape is valid
- if flat_output.size != (n_filters * h * w):
- raise ValueError(
- f"Output size {flat_output.size} does not match expected dims ({n_filters}, {h}, {w})"
- )
- shaped_output = flat_output.reshape((n_filters, h, w))
- # Apply the "Sliding Curtain" Mask
- # We zero out everything from x=0 to x=mask_end across all filters/rows
- shaped_output[:, :, : self._mask_x_end] = 0.0
- return shaped_output.flatten()
gabor.py at commit d8bed23, under AGPL-3.0 · at the source
Overview
- Department of Comparative Biomedical Sciences, School of Veterinary Medicine, University of Surrey, Guildford, United Kingdom
- Centre for Neural Circuits and Behaviour, University of Oxford, Oxford, United Kingdom
- Independent Researcher, Guildford, United Kingdom
- Department of Electrical and Electronic Engineering, Imperial College London, South Kensington, London, United Kingdom
- Department of Bioengineering, Imperial College London, South Kensington, London, United Kingdom
- The Surrey Institute for People-Centred AI, University of Surrey, Guildford, United Kingdom
- Centre for Theoretical Neuroscience and Artificial Intelligence, Department of Experimental Psychology, University of Oxford, Oxford, United Kingdom
Abstract
Feature binding - how the brain encodes which features are part of other features to form representations of the coherent objects we perceive - remains an unsolved problem in neuroscience. Despite progress towards a solution, major theories either lack detailed explanations at the neuronal level or rely on biologically unrealistic simplifications, and none adequately account for the representation of hierarchical information, which is crucial to our perception of the world. To address this, a solution termed binding by polychrony has been proposed to explain how hierarchical feature relationships may be encoded at the neuronal level in a biologically realistic system. This theory relies on a phenomenon known as polychronization, where groups of neurons fire in precisely coordinated, time-locked sequences, leading to the emergence of regularly repeating spatiotemporal patterns that might encode these relationships. In this study, we explore binding by polychrony through simulations of a spiking neural network that closely aligns with the structural organisation of the primate ventral visual pathway, incorporating bottom-up, top-down, and lateral synaptic connections. By exposing the network to collections of related 2D object shapes from ecologically realistic datasets and applying spike-timing-dependent plasticity, the network self-organises such that individual neurons respond selectively to specific shape features. Furthermore, the network exhibits polychronization, giving rise to repeating spatiotemporal patterns, some of which form circuits that encode hierarchical feature relationships. Notably, these circuits are robust, even with the randomised, Poisson-distributed spike timings that represent the visual stimuli in the input layer. These results provide evidence for binding by polychrony as a feasible solution to the feature binding problem, and characterise the mechanism by which it may function. This mechanism can guide experimentalists in identifying such circuits in vivo, and could also be utilised in computer vision systems to capture more information and improve robustness to adversarial inputs.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 18 matches between paragraphs and lines of code.
BCGardner/feature_binding
d8bed23b7c1f67cc4e333de5c5647173a2b53eb3, 24 June 2026Availability: 1 check, the latest on 26 September 2026: the link answers
- 26 September 2026: the link answers
187 files
- notebooks/
figures/ — Jupyter, 279 linesplot_fig10.ipynb - notebooks/
figures/ — Jupyter, 408 lines, 2 matchesplot_fig11.ipynb - notebooks/
figures/ — Jupyter, 419 linesplot_fig12.ipynb - notebooks/
figures/ — Jupyter, 738 linesplot_fig13.ipynb - notebooks/
figures/ — Jupyter, 306 linesplot_fig14A.ipynb - notebooks/
figures/ — Jupyter, 193 lines, 2 matchesplot_fig14B.ipynb - notebooks/
figures/ — Jupyter, 265 linesplot_fig15.ipynb - notebooks/
figures/ — Jupyter, 314 linesplot_fig17.ipynb - notebooks/
figures/ — Jupyter, 280 lines, 1 matchplot_fig19.ipynb - notebooks/
figures/ — Jupyter, 427 lines, 1 matchplot_fig20.ipynb - notebooks/
figures/ — Jupyter, 327 linesplot_fig21.ipynb - notebooks/
figures/ — Jupyter, 76 linesplot_fig4.ipynb - notebooks/
figures/ — Jupyter, 346 linesplot_fig5.ipynb - notebooks/
figures/ — Jupyter, 467 linesplot_fig6.ipynb - notebooks/
figures/ — Jupyter, 149 linesplot_fig7.ipynb - notebooks/
figures/ — Jupyter, 228 linesplot_fig8.ipynb - notebooks/
figures/ — Jupyter, 328 lines, 2 matchesplot_fig9.ipynb - notebooks/
supplementary/ — Jupyter, 395 linesplot_S10A_B.ipynb - notebooks/
supplementary/ — Jupyter, 294 linesplot_S10C.ipynb - notebooks/
supplementary/ — Jupyter, 527 linesplot_S3_S4.ipynb - notebooks/
supplementary/ — Jupyter, 635 lines, 1 matchplot_S5.ipynb - notebooks/
supplementary/ — Jupyter, 390 linesplot_S7.ipynb - notebooks/
supplementary/ — Jupyter, 196 linesplot_S8.ipynb - notebooks/
supplementary/ — Jupyter, 235 linesplot_S9.ipynb - scripts/
analysis/ — Python, 128 linesbuild_annotation_table.p y - scripts/
analysis/ — Python, 126 linesdetection.py - scripts/
analysis/ — Python, 139 linesdetection_unconstrained. py - scripts/
analysis/ — Python, 163 linesinference.py - scripts/
analysis/ — Python, 294 lines, 1 matchinference_occlusion.py - scripts/
analysis/ — Python, 144 linessignificance.py - scripts/
figures/ — Python, 161 linescompute_information.py - scripts/
figures/ — Python, 284 linescompute_information_swee p.py - scripts/
figures/ — Python, 158 linescompute_png_counts.py - scripts/
figures/ — Python, 249 linescompute_png_counts_sweep .py - scripts/
figures/ — Python, 287 lines, 1 matchcompute_png_metrics.py - scripts/
run_main_workflow.py — Python, 65 lines - scripts/
trainer.py — Python, 18 lines - setup.py — Python, 29 lines
- src/
hsnn/ — Python, 1 line__init__.py - src/
hsnn/ — Python, 7 linesanalysis/ __init__.py - src/
hsnn/ — Python, 24 linesanalysis/ _types.py - src/
hsnn/ — Python, 66 linesanalysis/ _utils_traceback.py - src/
hsnn/ — Python, 76 linesanalysis/ activity.py - src/
hsnn/ — Python, 137 linesanalysis/ base.py - src/
hsnn/ — Python, 395 linesanalysis/ measures.py - src/
hsnn/ — Python, 3 linesanalysis/ png/ __init__.py - src/
hsnn/ — Python, 286 linesanalysis/ png/ _utils.py - src/
hsnn/ — Python, 44 linesanalysis/ png/ base.py - src/
hsnn/ — Python, 4 linesanalysis/ png/ db/ __init__.py - src/
hsnn/ — Python, 80 linesanalysis/ png/ db/ _utils.py - src/
hsnn/ — Python, 152 linesanalysis/ png/ db/ api.py - src/
hsnn/ — Python, 165 linesanalysis/ png/ db/ database.py - src/
hsnn/ — Python, 97 linesanalysis/ png/ db/ models.py - src/
hsnn/ — Python, 387 lines, 1 matchanalysis/ png/ detection.py - src/
hsnn/ — Python, 185 linesanalysis/ png/ filters.py - src/
hsnn/ — Python, 141 linesanalysis/ png/ mining.py - src/
hsnn/ — Python, 181 linesanalysis/ png/ postproc.py - src/
hsnn/ — Python, 234 linesanalysis/ png/ refinery.py - src/
hsnn/ — Python, 263 linesanalysis/ png/ stats.py - src/
hsnn/ — Python, 104 linesanalysis/ population.py - src/
hsnn/ — Python, 55 linesanalysis/ ratesdb.py - src/
hsnn/ — Python, 205 linesanalysis/ spikesdb.py - src/
hsnn/ — Python, 168 linesanalysis/ traceback.py - src/
hsnn/ — Python, 2 linescluster/ __init__.py - src/
hsnn/ — Python, 65 linescluster/ _base.py - src/
hsnn/ — Python, 59 linescluster/ _searchers.py - src/
hsnn/ — Python, 45 linescluster/ _utils.py - src/
hsnn/ — Python, 436 linescluster/ tasks.py - src/
hsnn/ — Python, 111 linescluster/ tuner.py - src/
hsnn/ — Python, 2 linescluster/ tuning/ __init__.py - src/
hsnn/ — Python, 48 linescluster/ tuning/ _utils.py - src/
hsnn/ — Python, 110 linescluster/ tuning/ base.py - src/
hsnn/ — Python, 173 linescluster/ tuning/ criterion.py - src/
hsnn/ — Python, 132 linescluster/ tuning/ scalars.py - src/
hsnn/ — Python, 90 linescluster/ tuning/ trainable.py - src/
hsnn/ — Python, 5 linescore/ __init__.py - src/
hsnn/ — Python, 156 linescore/ _base.py - src/
hsnn/ — Python, 1 linecore/ _brian2/ __init__.py - src/
hsnn/ — Python, 2 linescore/ _brian2/ groups/ __init__.py - src/
hsnn/ — Python, 121 linescore/ _brian2/ groups/ _base.py - src/
hsnn/ — Python, 99 linescore/ _brian2/ groups/ coba.py - src/
hsnn/ — Python, 42 linescore/ _brian2/ groups/ codeblock.py - src/
hsnn/ — Python, 2 linescore/ _brian2/ groups/ connectors/ __init__.py - src/
hsnn/ — Python, 84 linescore/ _brian2/ groups/ connectors/ _base.py - src/
hsnn/ — Python, 65 linescore/ _brian2/ groups/ connectors/ connectors.py - src/
hsnn/ — Python, 25 linescore/ _brian2/ groups/ connectors/ samplers.py - src/
hsnn/ — Python, 48 linescore/ _brian2/ groups/ helper.py - src/
hsnn/ — Python, 2 linescore/ _brian2/ groups/ plasticity/ __init__.py - src/
hsnn/ — Python, 34 linescore/ _brian2/ groups/ plasticity/ _base.py - src/
hsnn/ — Python, 33 linescore/ _brian2/ groups/ plasticity/ plasticity.py - src/
hsnn/ — Python, 3 linescore/ _brian2/ layer/ __init__.py - src/
hsnn/ — Python, 170 linescore/ _brian2/ layer/ _base.py - src/
hsnn/ — Python, 28 linescore/ _brian2/ layer/ poisson.py - src/
hsnn/ — Python, 72 linescore/ _brian2/ layer/ spatial.py - src/
hsnn/ — Python, 1 linecore/ _brian2/ network/ __init__.py - src/
hsnn/ — Python, 102 linescore/ _brian2/ network/ _base.py - src/
hsnn/ — Python, 42 linescore/ _brian2/ network/ spatialnet.py - src/
hsnn/ — Python, 67 linescore/ _brian2/ symbols.py - src/
hsnn/ — Python, 1 linecore/ _brian2/ testing/ __init__.py - src/
hsnn/ — Python, 16 linescore/ _brian2/ testing/ assertions.py - src/
hsnn/ — Python, 19 linescore/ backends.py - src/
hsnn/ — Python, 2 linescore/ config/ __init__.py - src/
hsnn/ — Python, 40 linescore/ config/ paramset.py - src/
hsnn/ — Python, 84 linescore/ config/ parser.py - src/
hsnn/ — Python, 25 linescore/ definitions.py - src/
hsnn/ — Python, 2 linescore/ encoders/ __init__.py - src/
hsnn/ — Python, 24 linescore/ encoders/ _base.py - src/
hsnn/ — Python, 178 lines, 2 matchescore/ encoders/ gabor.py - src/
hsnn/ — Python, 116 linescore/ interfaces.py - src/
hsnn/ — Python, 20 linescore/ logger.py - src/
hsnn/ — Python, 86 linescore/ record.py - src/
hsnn/ — Python, 33 linescore/ types.py - src/
hsnn/ — Python, 4 linesops/ __init__.py - src/
hsnn/ — Python, 11 linesops/ _base.py - src/
hsnn/ — Python, 74 linesops/ arrays.py - src/
hsnn/ — Python, 183 linesops/ conversion.py - src/
hsnn/ — Python, 48 linesops/ filtering.py - src/
hsnn/ — Python, 29 linesops/ random.py - src/
hsnn/ — Python, 5 linespipeline/ __init__.py - src/
hsnn/ — Python, 186 linespipeline/ information.py - src/
hsnn/ — Python, 65 linespipeline/ jitter.py - src/
hsnn/ — Python, 129 linespipeline/ png_counts.py - src/
hsnn/ — Python, 14 linespipeline/ reuse/ __init__.py - src/
hsnn/ — Python, 112 linespipeline/ reuse/ _utils.py - src/
hsnn/ — Python, 323 lines, 2 matchespipeline/ reuse/ ambiguity.py - src/
hsnn/ — Python, 556 linespipeline/ reuse/ api.py - src/
hsnn/ — Python, 238 linespipeline/ reuse/ comembership.py - src/
hsnn/ — Python, 287 lines, 2 matchespipeline/ reuse/ completeness.py - src/
hsnn/ — Python, 15 linespipeline/ reuse/ constants.py - src/
hsnn/ — Python, 111 linespipeline/ spade_runs.py - src/
hsnn/ — Python, 125 linespipeline/ unconstrained.py - src/
hsnn/ — Python, 3 linessimulation/ __init__.py - src/
hsnn/ — Python, 17 linessimulation/ _base.py - src/
hsnn/ — Python, 57 linessimulation/ functional.py - src/
hsnn/ — Python, 57 linessimulation/ managers.py - src/
hsnn/ — Python, 81 linessimulation/ simulator.py - src/
hsnn/ — Python, 2 linessynthetic/ __init__.py - src/
hsnn/ — Python, 88 linessynthetic/ generation.py - src/
hsnn/ — Python, 102 linessynthetic/ patterns.py - src/
hsnn/ — Python, 2 linestransforms/ __init__.py - src/
hsnn/ — Python, 23 linestransforms/ _base.py - src/
hsnn/ — Python, 101 linestransforms/ transforms.py - src/
hsnn/ — Python, 3 linesutils/ __init__.py - src/
hsnn/ — Python, 10 linesutils/ _base.py - src/
hsnn/ — Python, 43 linesutils/ data.py - src/
hsnn/ — Python, 5 linesutils/ handler/ __init__.py - src/
hsnn/ — Python, 23 linesutils/ handler/ _checkpoint.py - src/
hsnn/ — Python, 61 linesutils/ handler/ artifacts.py - src/
hsnn/ — Python, 168 linesutils/ handler/ experiment.py - src/
hsnn/ — Python, 58 linesutils/ handler/ loader.py - src/
hsnn/ — Python, 161 linesutils/ handler/ store.py - src/
hsnn/ — Python, 38 linesutils/ handler/ trial.py - src/
hsnn/ — Python, 113 linesutils/ io.py - src/
hsnn/ — Python, 30 linesutils/ labels.py - src/
hsnn/ — Python, 5 linesviz/ __init__.py - src/
hsnn/ — Python, 31 linesviz/ _utils.py - src/
hsnn/ — Python, 208 linesviz/ base.py - src/
hsnn/ — Python, 57 linesviz/ metrics.py - src/
hsnn/ — Python, 171 linesviz/ rates.py - src/
hsnn/ — Python, 71 linesviz/ spikes.py - src/
hsnn/ — Python, 291 linesviz/ states.py - tests/
analysis/ — Python, 147 linespng/ db/ test_database.py - tests/
analysis/ — Python, 76 linespng/ test_detection_methods.p y - tests/
analysis/ — Python, 363 linespng/ test_get_structural_indi ces.py - tests/
analysis/ — Python, 111 linespng/ test_isconstrained.py - tests/
analysis/ — Python, 296 linespng/ test_refinery.py - tests/
analysis/ — Python, 68 linespng/ test_stats.py - tests/
analysis/ — Python, 51 linestest_measures.py - tests/
core/ — Python, 81 lines_brian2/ test_coba.py - tests/
core/ — Python, 18 lines_brian2/ test_helper.py - tests/
core/ — Python, 41 lines_brian2/ test_layers.py - tests/
core/ — Python, 117 lines_brian2/ test_network.py - tests/
core/ — Python, 27 linesconftest.py - tests/
core/ — Python, 51 linestest_config.py - tests/
ops/ — Python, 1 line__init__.py - tests/
ops/ — Python, 12 lines_utils.py - tests/
ops/ — Python, 40 linestest_arrays.py - tests/
ops/ — Python, 31 linestest_conversion.py - tests/
ops/ — Python, 28 linestest_filtering.py - tests/
pipeline/ — Python, 190 linestest_ambiguity.py - tests/
pipeline/ — Python, 339 linestest_comembership.py - tests/
pipeline/ — Python, 281 linestest_completeness.py - tests/
pipeline/ — Python, 183 linestest_reuse.py - tests/
utils/ — Python, 20 linestest_data.py - tests/
utils/ — Python, 112 linestest_io.py - LICENSE — License, 661 lines
- README.md — Text, 117 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 185 scripts, each with its path and the digest of its content;
- 18 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data Availability
The source code and data used to produce the results and analyses presented in this manuscript are available at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 7 authors, 11 MeSH terms, 1 funder, 56 references.
Cite
This paper
Gardner, B., McCarthy, P. T., Chrol-Cannon, J., Goodman, D. F. M., Schultz, S. R., Lo Iacono, G., & Stringer, S. M. (2026). Hierarchical feature binding in a spiking neural network model of the primate ventral visual pathway. PLoS computational biology, 22(9), e1014752. https://
BibTeX
@article{gardner2026hier
author = {Gardner, Brian and McCarthy, Patrick T. and Chrol-Cannon, Joseph and Goodman, Dan F. M. and Schultz, Simon R. and Lo Iacono, Giovanni and Stringer, Simon M.},
title = {{Hierarchical feature binding in a spiking neural network model of the primate ventral visual pathway}},
journal = {PLoS computational biology},
year = {2026},
month = sep,
volume = {22},
number = {9},
pages = {e1014752},
publisher = {PLOS},
issn = {1553-734X},
doi = {10.1371/
url = {https://
pmid = {42748186},
pmcid = {PMC13581216}
}
RIS
TY - JOUR
AU - Gardner, Brian
AU - McCarthy, Patrick T.
AU - Chrol-Cannon, Joseph
AU - Goodman, Dan F. M.
AU - Schultz, Simon R.
AU - Lo Iacono, Giovanni
AU - Stringer, Simon M.
TI - Hierarchical feature binding in a spiking neural network model of the primate ventral visual pathway
T2 - PLoS computational biology
J2 - PLoS Comput Biol
PY - 2026
DA - 2026/
VL - 22
IS - 9
SP - e1014752
SN - 1553-734X
PB - PLOS
DO - 10.1371/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1371/
"type": "article-journal",
"title": "Hierarchical feature binding in a spiking neural network model of the primate ventral visual pathway",
"container-title": "PLoS computational biology",
"author": [
{
"family": "Gardner",
"given": "Brian"
},
{
"family": "McCarthy",
"given": "Patrick T."
},
{
"family": "Chrol-Cannon",
"given": "Joseph"
},
{
"family": "Goodman",
"given": "Dan F. M."
},
{
"family": "Schultz",
"given": "Simon R."
},
{
"family": "Lo Iacono",
"given": "Giovanni"
},
{
"family": "Stringer",
"given": "Simon M."
}
],
"container-title-short":
"volume": "22",
"issue": "9",
"page": "e1014752",
"DOI": "10.1371/
"PMID": "42748186",
"PMCID": "PMC13581216",
"ISSN": "1553-734X",
"publisher": "PLOS",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
9,
16
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1016/j.isci.2026.115488 [code]
- An integrated &
lt;i& gt;i& lt;/ i& gt; & lt;i& gt;n vitro& lt;/ i& gt; platform and biophysical modeling approach for studying synaptic transmission in isolated neuronal pairs. Journal: iScienceIn common: Elephant, Neo, OpenCV, 5 other tools, 3 references - [2] doi:10.1007/s00422-026-01048-2 [code]
- A quality measure for repeating multiple-unit spike patterns.Journal: Biological cyberneticsIn common: Elephant, Neo, Matplotlib, 1 other tool, 5 references
- [3] doi:10.1371/journal.pcbi.1014730 [code]
- A unified model of short- and long-term plasticity: Effects on network connectivity and information capacity.Journal: PLoS computational biologyIn common: Elephant, Neo, pandas, 3 other tools, computational modeling (no new data), 3 references
- [4] doi: [code]
- Naturalistic behavior and self-generated neural activity predictive of self-correctionJournal: bioRxiv : the preprint server for biologyIn common: Elephant, Neo, xarray, 6 other tools
- [5] doi:10.1038/s41598-026-53152-9 [code]
- Layer-specific feature preference in a trained AlexNet model revealed by stylized image analysis.Journal: Scientific reportsIn common: OpenCV, pandas, Matplotlib, 1 other tool, 4 references
- [6] doi:10.1002/hipo.70089 [code]
- The Role of Plasticity in Replay: Stability Through Anti-Hebbian Rules.Journal: HippocampusIn common: Brian 2, OpenCV, pandas, 3 other tools, 2 references
- [7] doi:10.1038/s41467-026-75705-2 [code]
- Redundant prefrontal hemispheres adapt storage strategy to working memory demands.Journal: Nature communicationsIn common: Brian 2, statsmodels, pandas, 3 other tools, computational modeling (no new data), 1 reference
- [8] doi:10.1038/s41467-026-76098-y [code]
- A single computational objective can produce specialization of streams in visual cortex.Journal: Nature communicationsIn common: xarray, statsmodels, pandas, 3 other tools, 2 references
- [9] doi:10.1371/journal.pcbi.1014283 [code]
- Spatial richness of neural magnetic fields.Journal: PLoS computational biologyIn common: Elephant, Neo, SciPy, 2 other tools, computational modeling (no new data)
- [10] doi:10.1162/imag.a.1309 [code]
- Probing the content of semantic representations in body-selective regions.Journal: Imaging neuroscience (Cambridge, Mass.)In common: OpenCV, statsmodels, pandas, 3 other tools, 2 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 185 scripts, and 18 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:3c3a4dd889c213fc…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
