Skip to content

Latest commit

History

54 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SpaMM-Net

Spatially multimodal and multiscale network for representation learning from spatial multi-omics

Installation

  1. Clone this repo.
  2. Copy the "spamm" and "datasets" folders into your project directory.

Example

Environment

For testing, we recommend using Anaconda to run our project. You can run the following commands in Anaconda to create the required environment.

1. Create a new Anaconda environment:

conda create -n spamm python=3.10 -y
conda activate spamm

2. Install the required python packages:

pip install torch==2.5.1+cu124 torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu124
pip install torch_geometric==2.6.1 \
-f https://data.pyg.org/whl/torch-2.5.1+cu124.html
pip install numpy==2.2.6 scipy==1.15.3 pandas==2.3.1 pip install scikit_learn==1.7.1 tqdm==4.67.1 igraph==0.11.8
pip install scanpy==1.11.4

Example

Quick Start

1. data loading

You can load the .h5ad files with scanpy, and then process the objects with the preprocessing and adata_const functions provided by the 'spamm'.

import scanpy as sc
import spamm as spm
# load data
om1_adata = sc.read_h5ad('/path/to/om1.h5ad')
om2_adata = sc.read_h5ad('/path/to/om2.h5ad')
# data preprocessing(Optional)
# This step performs PCA to generate the "X_pca" matrix in om1_adata.obsm and om2_adata.obsm.
spm.preprocessing(
om1_adata, om2_adata,
n_comps = 50, random_state = 2025
)
# generate the input adata of SpaMM
adata = spm.adata_const(
om1_adata, om2_adata,
spatial_net_k = 8,
om_net_k = [8, 15]
)

Here, we provide three AnnData objects generated by spm.adata_const(), which can be loaded for testing.

adata = spm.load_test_data(idx = 0)

2. data training

# If a fixed random seed is required, please run this line of code (optional).
spm.set_random_seed(2025, acc_ctrl = True)
output, model = spm.run_spamm(
adata, scale = 3, epochs = 600, lr = 0.001, lr_step = [100, 200], gamma = 0.1,
rtn_model = True, device = 'cuda:0'
)

The 'output' is a dictionary with:

  • 'feat' as a fixed key
  • Dynamic keys 'scale1', 'scale2', ..., up to the number you specified in the 'scale' parameter.

If you see:RuntimeError: CUDA error: no kernel image is available for execution on the device.
This means your installed PyTorch does not support your GPU architecture.
Please use "decice = 'cpu'", or upgrade PyTorch:

pip uninstall -y torch torchvision torchaudio torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv
pip install --no-cache-dir torch torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu128
pip install --no-cache-dir torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv \
-f https://data.pyg.org/whl/torch-2.7.0+cu128.html

3. clustering

Then you can perform the clustering with the fused features.

feat = output["feat"].cpu().detach().numpy()
adata_feat = sc.AnnData(X = feat)
sc.pp.neighbors(
adata_feat,
n_neighbors=50,
random_state=2025
)
sc.tl.leiden(
adata_feat,
resolution = 1,
flavor="igraph",
random_state=2025
)

About

SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - CPenglab/SpaMM-Net: SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics · GitHub
Skip to content

Latest commit

History

54 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SpaMM-Net

Spatially multimodal and multiscale network for representation learning from spatial multi-omics

Installation

  1. Clone this repo.
  2. Copy the "spamm" and "datasets" folders into your project directory.

Example

Environment

For testing, we recommend using Anaconda to run our project. You can run the following commands in Anaconda to create the required environment.

1. Create a new Anaconda environment:

conda create -n spamm python=3.10 -y
conda activate spamm

2. Install the required python packages:

pip install torch==2.5.1+cu124 torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu124
pip install torch_geometric==2.6.1 \
-f https://data.pyg.org/whl/torch-2.5.1+cu124.html
pip install numpy==2.2.6 scipy==1.15.3 pandas==2.3.1 pip install scikit_learn==1.7.1 tqdm==4.67.1 igraph==0.11.8
pip install scanpy==1.11.4

Example

Quick Start

1. data loading

You can load the .h5ad files with scanpy, and then process the objects with the preprocessing and adata_const functions provided by the 'spamm'.

import scanpy as sc
import spamm as spm
# load data
om1_adata = sc.read_h5ad('/path/to/om1.h5ad')
om2_adata = sc.read_h5ad('/path/to/om2.h5ad')
# data preprocessing(Optional)
# This step performs PCA to generate the "X_pca" matrix in om1_adata.obsm and om2_adata.obsm.
spm.preprocessing(
om1_adata, om2_adata,
n_comps = 50, random_state = 2025
)
# generate the input adata of SpaMM
adata = spm.adata_const(
om1_adata, om2_adata,
spatial_net_k = 8,
om_net_k = [8, 15]
)

Here, we provide three AnnData objects generated by spm.adata_const(), which can be loaded for testing.

adata = spm.load_test_data(idx = 0)

2. data training

# If a fixed random seed is required, please run this line of code (optional).
spm.set_random_seed(2025, acc_ctrl = True)
output, model = spm.run_spamm(
adata, scale = 3, epochs = 600, lr = 0.001, lr_step = [100, 200], gamma = 0.1,
rtn_model = True, device = 'cuda:0'
)

The 'output' is a dictionary with:

  • 'feat' as a fixed key
  • Dynamic keys 'scale1', 'scale2', ..., up to the number you specified in the 'scale' parameter.

If you see:RuntimeError: CUDA error: no kernel image is available for execution on the device.
This means your installed PyTorch does not support your GPU architecture.
Please use "decice = 'cpu'", or upgrade PyTorch:

pip uninstall -y torch torchvision torchaudio torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv
pip install --no-cache-dir torch torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu128
pip install --no-cache-dir torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv \
-f https://data.pyg.org/whl/torch-2.7.0+cu128.html

3. clustering

Then you can perform the clustering with the fused features.

feat = output["feat"].cpu().detach().numpy()
adata_feat = sc.AnnData(X = feat)
sc.pp.neighbors(
adata_feat,
n_neighbors=50,
random_state=2025
)
sc.tl.leiden(
adata_feat,
resolution = 1,
flavor="igraph",
random_state=2025
)

About

SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - CPenglab/SpaMM-Net: SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics · GitHub
Skip to content

Latest commit

History

54 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SpaMM-Net

Spatially multimodal and multiscale network for representation learning from spatial multi-omics

Installation

  1. Clone this repo.
  2. Copy the "spamm" and "datasets" folders into your project directory.

Example

Environment

For testing, we recommend using Anaconda to run our project. You can run the following commands in Anaconda to create the required environment.

1. Create a new Anaconda environment:

conda create -n spamm python=3.10 -y
conda activate spamm

2. Install the required python packages:

pip install torch==2.5.1+cu124 torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu124
pip install torch_geometric==2.6.1 \
-f https://data.pyg.org/whl/torch-2.5.1+cu124.html
pip install numpy==2.2.6 scipy==1.15.3 pandas==2.3.1 pip install scikit_learn==1.7.1 tqdm==4.67.1 igraph==0.11.8
pip install scanpy==1.11.4

Example

Quick Start

1. data loading

You can load the .h5ad files with scanpy, and then process the objects with the preprocessing and adata_const functions provided by the 'spamm'.

import scanpy as sc
import spamm as spm
# load data
om1_adata = sc.read_h5ad('/path/to/om1.h5ad')
om2_adata = sc.read_h5ad('/path/to/om2.h5ad')
# data preprocessing(Optional)
# This step performs PCA to generate the "X_pca" matrix in om1_adata.obsm and om2_adata.obsm.
spm.preprocessing(
om1_adata, om2_adata,
n_comps = 50, random_state = 2025
)
# generate the input adata of SpaMM
adata = spm.adata_const(
om1_adata, om2_adata,
spatial_net_k = 8,
om_net_k = [8, 15]
)

Here, we provide three AnnData objects generated by spm.adata_const(), which can be loaded for testing.

adata = spm.load_test_data(idx = 0)

2. data training

# If a fixed random seed is required, please run this line of code (optional).
spm.set_random_seed(2025, acc_ctrl = True)
output, model = spm.run_spamm(
adata, scale = 3, epochs = 600, lr = 0.001, lr_step = [100, 200], gamma = 0.1,
rtn_model = True, device = 'cuda:0'
)

The 'output' is a dictionary with:

  • 'feat' as a fixed key
  • Dynamic keys 'scale1', 'scale2', ..., up to the number you specified in the 'scale' parameter.

If you see:RuntimeError: CUDA error: no kernel image is available for execution on the device.
This means your installed PyTorch does not support your GPU architecture.
Please use "decice = 'cpu'", or upgrade PyTorch:

pip uninstall -y torch torchvision torchaudio torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv
pip install --no-cache-dir torch torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu128
pip install --no-cache-dir torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv \
-f https://data.pyg.org/whl/torch-2.7.0+cu128.html

3. clustering

Then you can perform the clustering with the fused features.

feat = output["feat"].cpu().detach().numpy()
adata_feat = sc.AnnData(X = feat)
sc.pp.neighbors(
adata_feat,
n_neighbors=50,
random_state=2025
)
sc.tl.leiden(
adata_feat,
resolution = 1,
flavor="igraph",
random_state=2025
)

About

SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - CPenglab/SpaMM-Net: SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics · GitHub
Skip to content

Latest commit

History

54 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SpaMM-Net

Spatially multimodal and multiscale network for representation learning from spatial multi-omics

Installation

  1. Clone this repo.
  2. Copy the "spamm" and "datasets" folders into your project directory.

Example

Environment

For testing, we recommend using Anaconda to run our project. You can run the following commands in Anaconda to create the required environment.

1. Create a new Anaconda environment:

conda create -n spamm python=3.10 -y
conda activate spamm

2. Install the required python packages:

pip install torch==2.5.1+cu124 torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu124
pip install torch_geometric==2.6.1 \
-f https://data.pyg.org/whl/torch-2.5.1+cu124.html
pip install numpy==2.2.6 scipy==1.15.3 pandas==2.3.1 pip install scikit_learn==1.7.1 tqdm==4.67.1 igraph==0.11.8
pip install scanpy==1.11.4

Example

Quick Start

1. data loading

You can load the .h5ad files with scanpy, and then process the objects with the preprocessing and adata_const functions provided by the 'spamm'.

import scanpy as sc
import spamm as spm
# load data
om1_adata = sc.read_h5ad('/path/to/om1.h5ad')
om2_adata = sc.read_h5ad('/path/to/om2.h5ad')
# data preprocessing(Optional)
# This step performs PCA to generate the "X_pca" matrix in om1_adata.obsm and om2_adata.obsm.
spm.preprocessing(
om1_adata, om2_adata,
n_comps = 50, random_state = 2025
)
# generate the input adata of SpaMM
adata = spm.adata_const(
om1_adata, om2_adata,
spatial_net_k = 8,
om_net_k = [8, 15]
)

Here, we provide three AnnData objects generated by spm.adata_const(), which can be loaded for testing.

adata = spm.load_test_data(idx = 0)

2. data training

# If a fixed random seed is required, please run this line of code (optional).
spm.set_random_seed(2025, acc_ctrl = True)
output, model = spm.run_spamm(
adata, scale = 3, epochs = 600, lr = 0.001, lr_step = [100, 200], gamma = 0.1,
rtn_model = True, device = 'cuda:0'
)

The 'output' is a dictionary with:

  • 'feat' as a fixed key
  • Dynamic keys 'scale1', 'scale2', ..., up to the number you specified in the 'scale' parameter.

If you see:RuntimeError: CUDA error: no kernel image is available for execution on the device.
This means your installed PyTorch does not support your GPU architecture.
Please use "decice = 'cpu'", or upgrade PyTorch:

pip uninstall -y torch torchvision torchaudio torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv
pip install --no-cache-dir torch torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu128
pip install --no-cache-dir torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv \
-f https://data.pyg.org/whl/torch-2.7.0+cu128.html

3. clustering

Then you can perform the clustering with the fused features.

feat = output["feat"].cpu().detach().numpy()
adata_feat = sc.AnnData(X = feat)
sc.pp.neighbors(
adata_feat,
n_neighbors=50,
random_state=2025
)
sc.tl.leiden(
adata_feat,
resolution = 1,
flavor="igraph",
random_state=2025
)

About

SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - CPenglab/SpaMM-Net: SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics · GitHub
Skip to content

Latest commit

History

54 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SpaMM-Net

Spatially multimodal and multiscale network for representation learning from spatial multi-omics

Installation

  1. Clone this repo.
  2. Copy the "spamm" and "datasets" folders into your project directory.

Example

Environment

For testing, we recommend using Anaconda to run our project. You can run the following commands in Anaconda to create the required environment.

1. Create a new Anaconda environment:

conda create -n spamm python=3.10 -y
conda activate spamm

2. Install the required python packages:

pip install torch==2.5.1+cu124 torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu124
pip install torch_geometric==2.6.1 \
-f https://data.pyg.org/whl/torch-2.5.1+cu124.html
pip install numpy==2.2.6 scipy==1.15.3 pandas==2.3.1 pip install scikit_learn==1.7.1 tqdm==4.67.1 igraph==0.11.8
pip install scanpy==1.11.4

Example

Quick Start

1. data loading

You can load the .h5ad files with scanpy, and then process the objects with the preprocessing and adata_const functions provided by the 'spamm'.

import scanpy as sc
import spamm as spm
# load data
om1_adata = sc.read_h5ad('/path/to/om1.h5ad')
om2_adata = sc.read_h5ad('/path/to/om2.h5ad')
# data preprocessing(Optional)
# This step performs PCA to generate the "X_pca" matrix in om1_adata.obsm and om2_adata.obsm.
spm.preprocessing(
om1_adata, om2_adata,
n_comps = 50, random_state = 2025
)
# generate the input adata of SpaMM
adata = spm.adata_const(
om1_adata, om2_adata,
spatial_net_k = 8,
om_net_k = [8, 15]
)

Here, we provide three AnnData objects generated by spm.adata_const(), which can be loaded for testing.

adata = spm.load_test_data(idx = 0)

2. data training

# If a fixed random seed is required, please run this line of code (optional).
spm.set_random_seed(2025, acc_ctrl = True)
output, model = spm.run_spamm(
adata, scale = 3, epochs = 600, lr = 0.001, lr_step = [100, 200], gamma = 0.1,
rtn_model = True, device = 'cuda:0'
)

The 'output' is a dictionary with:

  • 'feat' as a fixed key
  • Dynamic keys 'scale1', 'scale2', ..., up to the number you specified in the 'scale' parameter.

If you see:RuntimeError: CUDA error: no kernel image is available for execution on the device.
This means your installed PyTorch does not support your GPU architecture.
Please use "decice = 'cpu'", or upgrade PyTorch:

pip uninstall -y torch torchvision torchaudio torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv
pip install --no-cache-dir torch torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu128
pip install --no-cache-dir torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv \
-f https://data.pyg.org/whl/torch-2.7.0+cu128.html

3. clustering

Then you can perform the clustering with the fused features.

feat = output["feat"].cpu().detach().numpy()
adata_feat = sc.AnnData(X = feat)
sc.pp.neighbors(
adata_feat,
n_neighbors=50,
random_state=2025
)
sc.tl.leiden(
adata_feat,
resolution = 1,
flavor="igraph",
random_state=2025
)

About

SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - CPenglab/SpaMM-Net: SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics · GitHub
Skip to content

Latest commit

History

54 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SpaMM-Net

Spatially multimodal and multiscale network for representation learning from spatial multi-omics

Installation

  1. Clone this repo.
  2. Copy the "spamm" and "datasets" folders into your project directory.

Example

Environment

For testing, we recommend using Anaconda to run our project. You can run the following commands in Anaconda to create the required environment.

1. Create a new Anaconda environment:

conda create -n spamm python=3.10 -y
conda activate spamm

2. Install the required python packages:

pip install torch==2.5.1+cu124 torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu124
pip install torch_geometric==2.6.1 \
-f https://data.pyg.org/whl/torch-2.5.1+cu124.html
pip install numpy==2.2.6 scipy==1.15.3 pandas==2.3.1 pip install scikit_learn==1.7.1 tqdm==4.67.1 igraph==0.11.8
pip install scanpy==1.11.4

Example

Quick Start

1. data loading

You can load the .h5ad files with scanpy, and then process the objects with the preprocessing and adata_const functions provided by the 'spamm'.

import scanpy as sc
import spamm as spm
# load data
om1_adata = sc.read_h5ad('/path/to/om1.h5ad')
om2_adata = sc.read_h5ad('/path/to/om2.h5ad')
# data preprocessing(Optional)
# This step performs PCA to generate the "X_pca" matrix in om1_adata.obsm and om2_adata.obsm.
spm.preprocessing(
om1_adata, om2_adata,
n_comps = 50, random_state = 2025
)
# generate the input adata of SpaMM
adata = spm.adata_const(
om1_adata, om2_adata,
spatial_net_k = 8,
om_net_k = [8, 15]
)

Here, we provide three AnnData objects generated by spm.adata_const(), which can be loaded for testing.

adata = spm.load_test_data(idx = 0)

2. data training

# If a fixed random seed is required, please run this line of code (optional).
spm.set_random_seed(2025, acc_ctrl = True)
output, model = spm.run_spamm(
adata, scale = 3, epochs = 600, lr = 0.001, lr_step = [100, 200], gamma = 0.1,
rtn_model = True, device = 'cuda:0'
)

The 'output' is a dictionary with:

  • 'feat' as a fixed key
  • Dynamic keys 'scale1', 'scale2', ..., up to the number you specified in the 'scale' parameter.

If you see:RuntimeError: CUDA error: no kernel image is available for execution on the device.
This means your installed PyTorch does not support your GPU architecture.
Please use "decice = 'cpu'", or upgrade PyTorch:

pip uninstall -y torch torchvision torchaudio torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv
pip install --no-cache-dir torch torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu128
pip install --no-cache-dir torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv \
-f https://data.pyg.org/whl/torch-2.7.0+cu128.html

3. clustering

Then you can perform the clustering with the fused features.

feat = output["feat"].cpu().detach().numpy()
adata_feat = sc.AnnData(X = feat)
sc.pp.neighbors(
adata_feat,
n_neighbors=50,
random_state=2025
)
sc.tl.leiden(
adata_feat,
resolution = 1,
flavor="igraph",
random_state=2025
)

About

SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - CPenglab/SpaMM-Net: SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics · GitHub
Skip to content

Latest commit

History

54 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SpaMM-Net

Spatially multimodal and multiscale network for representation learning from spatial multi-omics

Installation

  1. Clone this repo.
  2. Copy the "spamm" and "datasets" folders into your project directory.

Example

Environment

For testing, we recommend using Anaconda to run our project. You can run the following commands in Anaconda to create the required environment.

1. Create a new Anaconda environment:

conda create -n spamm python=3.10 -y
conda activate spamm

2. Install the required python packages:

pip install torch==2.5.1+cu124 torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu124
pip install torch_geometric==2.6.1 \
-f https://data.pyg.org/whl/torch-2.5.1+cu124.html
pip install numpy==2.2.6 scipy==1.15.3 pandas==2.3.1 pip install scikit_learn==1.7.1 tqdm==4.67.1 igraph==0.11.8
pip install scanpy==1.11.4

Example

Quick Start

1. data loading

You can load the .h5ad files with scanpy, and then process the objects with the preprocessing and adata_const functions provided by the 'spamm'.

import scanpy as sc
import spamm as spm
# load data
om1_adata = sc.read_h5ad('/path/to/om1.h5ad')
om2_adata = sc.read_h5ad('/path/to/om2.h5ad')
# data preprocessing(Optional)
# This step performs PCA to generate the "X_pca" matrix in om1_adata.obsm and om2_adata.obsm.
spm.preprocessing(
om1_adata, om2_adata,
n_comps = 50, random_state = 2025
)
# generate the input adata of SpaMM
adata = spm.adata_const(
om1_adata, om2_adata,
spatial_net_k = 8,
om_net_k = [8, 15]
)

Here, we provide three AnnData objects generated by spm.adata_const(), which can be loaded for testing.

adata = spm.load_test_data(idx = 0)

2. data training

# If a fixed random seed is required, please run this line of code (optional).
spm.set_random_seed(2025, acc_ctrl = True)
output, model = spm.run_spamm(
adata, scale = 3, epochs = 600, lr = 0.001, lr_step = [100, 200], gamma = 0.1,
rtn_model = True, device = 'cuda:0'
)

The 'output' is a dictionary with:

  • 'feat' as a fixed key
  • Dynamic keys 'scale1', 'scale2', ..., up to the number you specified in the 'scale' parameter.

If you see:RuntimeError: CUDA error: no kernel image is available for execution on the device.
This means your installed PyTorch does not support your GPU architecture.
Please use "decice = 'cpu'", or upgrade PyTorch:

pip uninstall -y torch torchvision torchaudio torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv
pip install --no-cache-dir torch torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu128
pip install --no-cache-dir torch_geometric pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv \
-f https://data.pyg.org/whl/torch-2.7.0+cu128.html

3. clustering

Then you can perform the clustering with the fused features.

feat = output["feat"].cpu().detach().numpy()
adata_feat = sc.AnnData(X = feat)
sc.pp.neighbors(
adata_feat,
n_neighbors=50,
random_state=2025
)
sc.tl.leiden(
adata_feat,
resolution = 1,
flavor="igraph",
random_state=2025
)

About

SpaMM-Net: spatially multimodal and multiscale network for representation learning from spatial multi-omics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages