Paired single-cell multi-omics analysis
Here we will use 10X PBMCs multiome dataset from scanpy as an example to illustrate how Garfield performs multi-omics integration analysis
[1]:
import os
os.chdir('/data2/zhouwg_data/project/Garfield')
os.getcwd()
[1]:
'/data2/zhouwg_data/project/Garfield'
[2]:
# load packages
import os
import warnings
import Garfield as gf
import scanpy as sc
from mudata import MuData
warnings.simplefilter(action="ignore", category=FutureWarning)
warnings.simplefilter(action='ignore', category=UserWarning)
gf.__version__
[2]:
'1.0.0'
[3]:
## load data
rna = sc.read_h5ad('/home/zhouweige/zhouwg_data/project/Garfield_tutorials/data/human_pbmc_10x_3k_RNA.h5ad')
rna.layers['counts'] = rna.X.copy()
rna.obs['batch'] = 'RNA'
atac = sc.read_h5ad('/home/zhouweige/zhouwg_data/project/Garfield_tutorials/data/human_pbmc_10x_3k_ATAC.h5ad')
atac.layers['counts'] = atac.X.copy()
atac.obs['batch'] = 'ATAC'
# split each element for gene score calculation
split_data = atac.var_names.str.split('-', expand=True).to_frame(index=False)
split_data.index = atac.var_names
split_data.columns = ['chr', 'start', 'end']
atac.var[['chr', 'start', 'end']] = split_data
mdata = MuData({"rna": rna, "atac": atac})
mdata
[3]:
MuData object with n_obs × n_vars = 2590 × 134920
var: 'gene'
2 modalities
rna: 2590 x 36601
obs: 'orig.ident', 'nCount_RNA', 'nFeature_RNA', 'nCount_ATAC', 'nFeature_ATAC', 'nucleosome_signal', 'nucleosome_percentile', 'TSS.enrichment', 'TSS.percentile', 'nCount_peaks', 'nFeature_peaks', 'RNA_snn_res.1', 'seurat_clusters', 'celltype', 'RNA.weight', 'peaks.weight', 'batch'
var: 'gene'
layers: 'counts'
atac: 2590 x 98319
obs: 'orig.ident', 'nCount_RNA', 'nFeature_RNA', 'nCount_ATAC', 'nFeature_ATAC', 'nucleosome_signal', 'nucleosome_percentile', 'TSS.enrichment', 'TSS.percentile', 'nCount_peaks', 'nFeature_peaks', 'RNA_snn_res.1', 'seurat_clusters', 'celltype', 'RNA.weight', 'peaks.weight', 'batch'
var: 'gene', 'chr', 'start', 'end'
layers: 'counts'Perform single-cell multi-omics integration using Garfield
For integration of multi-omics single-cell data, we should adjust the following paremeters, and all parameter introductions can be found in Garfield_Model_Parameters.
[4]:
# set workdir
workdir = '/home/zhouweige/zhouwg_data/project/Garfield_tutorials/result/garfield_multiome_10xpbmc3k'
gf.settings.set_workdir(workdir)
### modify parameter
user_config = dict(
## Input options
adata_list=mdata,
profile='multi-modal', # if it is 'ATAC' or 'ADT', please adjust it.
data_type='Paired',
sub_data_type=['rna', 'atac'],
sample_col=None, # Specify columns for batch, only one batch, so set `None`
weight=0.8,
## Preprocessing options
genome='hg38',
use_gene_weight=True,
use_top_pcs=False,
used_hvg=True,
min_cells=3,
min_features=0,
keep_mt=False,
target_sum=1e4,
rna_n_top_features=3000,
atac_n_top_features=10000, # if data belongs to 'ATAC', please specify it.
n_components=50,
n_neighbors=5,
metric='euclidean',
svd_solver='arpack',
# datasets
used_pca_feat=True,
adj_key='connectivities',
# data split parameters
edge_val_ratio=0.1,
edge_test_ratio=0.,
node_val_ratio=0.1,
node_test_ratio=0.,
## Model options
augment_type='svd',
svd_q=5,
use_FCencoder=False,
conv_type='GATv2Conv', # GAT or GATv2Conv or GCN
gnn_layer=2,
hidden_dims=[128, 128],
bottle_neck_neurons=20,
cluster_num=20,
drop_feature_rate=0.2,
drop_edge_rate=0.2,
num_heads=3,
dropout=0.2,
concat=True,
used_edge_weight=True,
used_DSBN=False,
used_mmd=False,
# data loader parameters
num_neighbors=5,
loaders_n_hops=2,
edge_batch_size=4096,
node_batch_size=128, # None
# loss parameters
include_edge_recon_loss=True,
include_gene_expr_recon_loss=True,
lambda_latent_contrastive_instanceloss=1.0,
lambda_latent_contrastive_clusterloss=0.5,
lambda_gene_expr_recon=10., # To make the model more focused on learning expression features, increase this parameter.
lambda_edge_recon=1., # To make the model more focused on learning Adjacency graph features, increase this parameter.
lambda_latent_adj_recon_loss=1.0,
lambda_omics_recon_mmd_loss=1., # If the integration is not strong enough, increase it, only when used_mmd=True.
# train parameters
n_epochs_no_edge_recon=0,
learning_rate=0.001,
weight_decay=1e-05,
gradient_clipping=5,
# other parameters
latent_key='garfield_latent',
reload_best_model=True,
use_early_stopping=True,
early_stopping_kwargs=None,
monitor=True,
device_id=1,
seed=42,
verbose=True
)
dict_config = gf.settings.set_gf_params(user_config)
Saving results in: /home/zhouweige/zhouwg_data/project/Garfield_tutorials/result/garfield_multiome_10xpbmc3k
[5]:
from Garfield.model import Garfield
# Initialize model
model = Garfield(dict_config)
--- DATA LOADING AND PREPROCESSING ---
Gene activity matrix has been calculated, loading cached adata_CG_atac object...
There are 16299 common genes in RNA and ATAC datasets
To start performing cell matching for adjacency matrix of the graph, please wait...
Finding initial pivots...
Init_matching done!
Refining pivots...
Refined_matching done!
Filter_bad_matches on pivots matching...
Begin filtering...
1813/2590 pairs of matched cells remain after the filtering.
Fitting CCA on pivots...
Scoring matched pairs...
Propagating matching...
Done!
Filter_bad_matches on propagated matching...
Begin filtering...
1554/1554 pairs of matched cells remain after the filtering.
Fitting CCA on pivots...
Scoring matched pairs...
COSINE SIM GRAPH DECODER -> dropout_rate: 0.2
[6]:
# Train model
model.train()
--- INITIALIZING TRAINER ---
Using GPU: device-1
Number of training nodes: 2331
Number of validation nodes: 259
Number of training edges: 17133
Number of validation edges: 1903
Edge batch size: 4096
Node batch size: 128
--- MODEL TRAINING ---
Epoch 1/100 |--------------------| 1.0% val_auroc_score: 0.8849; val_auprc_score: 0.8673; val_best_acc_score: 0.8135; val_best_f1_score: 0.8248; train_kl_reg_loss: 76616383.2750; train_edge_recon_loss: 951.6383; train_gene_expr_recon_loss: 1066896461212.8000; train_lambda_latent_adj_recon_loss: 1370.4966; train_lambda_latent_contrastive_instanceloss: 7.1341; train_lambda_latent_contrastive_clusterloss: 3.7054; train_global_loss: 1066973036288.0000; train_optim_loss: 1066973036288.0000; val_kl_reg_loss: 6038.1650; val_edge_recon_loss: 541.8908; val_gene_expr_recon_loss: 2369362.0000; val_lambda_latent_adj_recon_loss: 959.8080; val_lambda_latent_contrastive_instanceloss: 6.9495; val_lambda_latent_contrastive_clusterloss: 3.6871; val_global_loss: 2376912.5000; val_optim_loss: 2376912.5000
Epoch 2/100 |--------------------| 2.0% val_auroc_score: 0.8918; val_auprc_score: 0.8781; val_best_acc_score: 0.8106; val_best_f1_score: 0.8225; train_kl_reg_loss: 120503169.1861; train_edge_recon_loss: 952.2334; train_gene_expr_recon_loss: 2851093689.0000; train_lambda_latent_adj_recon_loss: 1446.8059; train_lambda_latent_contrastive_instanceloss: 7.1185; train_lambda_latent_contrastive_clusterloss: 3.6966; train_global_loss: 2971599118.3000; train_optim_loss: 2971599118.3000; val_kl_reg_loss: 67.5020; val_edge_recon_loss: 547.0709; val_gene_expr_recon_loss: 2559899.2500; val_lambda_latent_adj_recon_loss: 1065.5806; val_lambda_latent_contrastive_instanceloss: 7.0035; val_lambda_latent_contrastive_clusterloss: 3.6492; val_global_loss: 2561590.0000; val_optim_loss: 2561590.0000
Epoch 3/100 |--------------------| 3.0% val_auroc_score: 0.8965; val_auprc_score: 0.8794; val_best_acc_score: 0.8216; val_best_f1_score: 0.8302; train_kl_reg_loss: 5215.9200; train_edge_recon_loss: 952.9876; train_gene_expr_recon_loss: 16803989.2500; train_lambda_latent_adj_recon_loss: 1479.3963; train_lambda_latent_contrastive_instanceloss: 7.1004; train_lambda_latent_contrastive_clusterloss: 3.6801; train_global_loss: 16811649.1000; train_optim_loss: 16811649.1000; val_kl_reg_loss: 64.8624; val_edge_recon_loss: 555.6833; val_gene_expr_recon_loss: 2447278.7500; val_lambda_latent_adj_recon_loss: 1425.5822; val_lambda_latent_contrastive_instanceloss: 6.9509; val_lambda_latent_contrastive_clusterloss: 3.6148; val_global_loss: 2449335.2500; val_optim_loss: 2449335.2500
Epoch 4/100 |--------------------| 4.0% val_auroc_score: 0.8983; val_auprc_score: 0.8767; val_best_acc_score: 0.8229; val_best_f1_score: 0.8350; train_kl_reg_loss: 12176.9335; train_edge_recon_loss: 949.8078; train_gene_expr_recon_loss: 3283317.8000; train_lambda_latent_adj_recon_loss: 1751.7171; train_lambda_latent_contrastive_instanceloss: 7.0834; train_lambda_latent_contrastive_clusterloss: 3.6703; train_global_loss: 3298206.9500; train_optim_loss: 3298206.9500; val_kl_reg_loss: 106.2149; val_edge_recon_loss: 523.1469; val_gene_expr_recon_loss: 2485264.2500; val_lambda_latent_adj_recon_loss: 1617.0212; val_lambda_latent_contrastive_instanceloss: 6.7367; val_lambda_latent_contrastive_clusterloss: 3.5868; val_global_loss: 2487520.7500; val_optim_loss: 2487520.7500
Epoch 5/100 |█-------------------| 5.0% val_auroc_score: 0.8943; val_auprc_score: 0.8641; val_best_acc_score: 0.8245; val_best_f1_score: 0.8402; train_kl_reg_loss: 203121.2114; train_edge_recon_loss: 933.6301; train_gene_expr_recon_loss: 7554726.8250; train_lambda_latent_adj_recon_loss: 1846.4244; train_lambda_latent_contrastive_instanceloss: 7.0042; train_lambda_latent_contrastive_clusterloss: 3.6561; train_global_loss: 7760638.6500; train_optim_loss: 7760638.6500; val_kl_reg_loss: 101.9246; val_edge_recon_loss: 505.6761; val_gene_expr_recon_loss: 2448192.0000; val_lambda_latent_adj_recon_loss: 2024.0435; val_lambda_latent_contrastive_instanceloss: 6.7104; val_lambda_latent_contrastive_clusterloss: 3.5899; val_global_loss: 2450833.7500; val_optim_loss: 2450833.7500
Epoch 6/100 |█-------------------| 6.0% val_auroc_score: 0.8954; val_auprc_score: 0.8642; val_best_acc_score: 0.8211; val_best_f1_score: 0.8382; train_kl_reg_loss: 2563.6181; train_edge_recon_loss: 922.2329; train_gene_expr_recon_loss: 2989471.1500; train_lambda_latent_adj_recon_loss: 1971.9197; train_lambda_latent_contrastive_instanceloss: 6.8919; train_lambda_latent_contrastive_clusterloss: 3.6374; train_global_loss: 2994939.4500; train_optim_loss: 2994939.4500; val_kl_reg_loss: 176.7740; val_edge_recon_loss: 498.8753; val_gene_expr_recon_loss: 1867298.0000; val_lambda_latent_adj_recon_loss: 2091.3979; val_lambda_latent_contrastive_instanceloss: 6.6854; val_lambda_latent_contrastive_clusterloss: 3.5604; val_global_loss: 1870075.1250; val_optim_loss: 1870075.1250
Epoch 7/100 |█-------------------| 7.0% val_auroc_score: 0.9035; val_auprc_score: 0.8737; val_best_acc_score: 0.8279; val_best_f1_score: 0.8433; train_kl_reg_loss: 2609.2221; train_edge_recon_loss: 916.2097; train_gene_expr_recon_loss: 2898051.5500; train_lambda_latent_adj_recon_loss: 2132.2232; train_lambda_latent_contrastive_instanceloss: 6.8509; train_lambda_latent_contrastive_clusterloss: 3.6267; train_global_loss: 2903719.5750; train_optim_loss: 2903719.5750; val_kl_reg_loss: 207.2584; val_edge_recon_loss: 491.2747; val_gene_expr_recon_loss: 2139013.7500; val_lambda_latent_adj_recon_loss: 2324.7058; val_lambda_latent_contrastive_instanceloss: 6.6301; val_lambda_latent_contrastive_clusterloss: 3.5382; val_global_loss: 2142047.2500; val_optim_loss: 2142047.2500
Epoch 8/100 |█-------------------| 8.0% val_auroc_score: 0.8993; val_auprc_score: 0.8690; val_best_acc_score: 0.8271; val_best_f1_score: 0.8418; train_kl_reg_loss: 52929.1366; train_edge_recon_loss: 908.4190; train_gene_expr_recon_loss: 86439149.3500; train_lambda_latent_adj_recon_loss: 2201.0268; train_lambda_latent_contrastive_instanceloss: 6.7560; train_lambda_latent_contrastive_clusterloss: 3.5884; train_global_loss: 86495197.7750; train_optim_loss: 86495197.7750; val_kl_reg_loss: 192.7221; val_edge_recon_loss: 497.6905; val_gene_expr_recon_loss: 1883640.5000; val_lambda_latent_adj_recon_loss: 2360.9077; val_lambda_latent_contrastive_instanceloss: 6.5878; val_lambda_latent_contrastive_clusterloss: 3.4919; val_global_loss: 1886701.8750; val_optim_loss: 1886701.8750
Epoch 9/100 |█-------------------| 9.0% val_auroc_score: 0.9080; val_auprc_score: 0.8740; val_best_acc_score: 0.8363; val_best_f1_score: 0.8513; train_kl_reg_loss: 371.4528; train_edge_recon_loss: 907.1409; train_gene_expr_recon_loss: 1845244.3000; train_lambda_latent_adj_recon_loss: 2220.2505; train_lambda_latent_contrastive_instanceloss: 6.6937; train_lambda_latent_contrastive_clusterloss: 3.5493; train_global_loss: 1848753.3500; train_optim_loss: 1848753.3500; val_kl_reg_loss: 211.2054; val_edge_recon_loss: 494.6553; val_gene_expr_recon_loss: 1812633.0000; val_lambda_latent_adj_recon_loss: 2434.2822; val_lambda_latent_contrastive_instanceloss: 6.5755; val_lambda_latent_contrastive_clusterloss: 3.4715; val_global_loss: 1815783.2500; val_optim_loss: 1815783.2500
Epoch 10/100 |██------------------| 10.0% val_auroc_score: 0.8979; val_auprc_score: 0.8617; val_best_acc_score: 0.8366; val_best_f1_score: 0.8498; train_kl_reg_loss: 2003.7508; train_edge_recon_loss: 902.6679; train_gene_expr_recon_loss: 6431491.9750; train_lambda_latent_adj_recon_loss: 2325.3666; train_lambda_latent_contrastive_instanceloss: 6.7030; train_lambda_latent_contrastive_clusterloss: 3.5323; train_global_loss: 6436734.2250; train_optim_loss: 6436734.2250; val_kl_reg_loss: 210.7818; val_edge_recon_loss: 501.2947; val_gene_expr_recon_loss: 1579160.1250; val_lambda_latent_adj_recon_loss: 2528.0247; val_lambda_latent_contrastive_instanceloss: 6.5290; val_lambda_latent_contrastive_clusterloss: 3.4368; val_global_loss: 1582410.1250; val_optim_loss: 1582410.1250
Epoch 11/100 |██------------------| 11.0% val_auroc_score: 0.9200; val_auprc_score: 0.8888; val_best_acc_score: 0.8550; val_best_f1_score: 0.8675; train_kl_reg_loss: 700.0666; train_edge_recon_loss: 906.7081; train_gene_expr_recon_loss: 2586718.3500; train_lambda_latent_adj_recon_loss: 2320.0836; train_lambda_latent_contrastive_instanceloss: 6.6231; train_lambda_latent_contrastive_clusterloss: 3.4849; train_global_loss: 2590655.2250; train_optim_loss: 2590655.2250; val_kl_reg_loss: 244.5473; val_edge_recon_loss: 487.9172; val_gene_expr_recon_loss: 1522909.7500; val_lambda_latent_adj_recon_loss: 2544.2710; val_lambda_latent_contrastive_instanceloss: 6.5229; val_lambda_latent_contrastive_clusterloss: 3.3924; val_global_loss: 1526196.3750; val_optim_loss: 1526196.3750
Epoch 12/100 |██------------------| 12.0% val_auroc_score: 0.9138; val_auprc_score: 0.8845; val_best_acc_score: 0.8529; val_best_f1_score: 0.8647; train_kl_reg_loss: 15080.7188; train_edge_recon_loss: 901.5419; train_gene_expr_recon_loss: 1507423.3000; train_lambda_latent_adj_recon_loss: 2340.3008; train_lambda_latent_contrastive_instanceloss: 6.6038; train_lambda_latent_contrastive_clusterloss: 3.4413; train_global_loss: 1525755.9250; train_optim_loss: 1525755.9250; val_kl_reg_loss: 254.7075; val_edge_recon_loss: 494.3320; val_gene_expr_recon_loss: 1396226.2500; val_lambda_latent_adj_recon_loss: 2505.5862; val_lambda_latent_contrastive_instanceloss: 6.5531; val_lambda_latent_contrastive_clusterloss: 3.3678; val_global_loss: 1399490.7500; val_optim_loss: 1399490.7500
Epoch 13/100 |██------------------| 13.0% val_auroc_score: 0.9103; val_auprc_score: 0.8695; val_best_acc_score: 0.8550; val_best_f1_score: 0.8676; train_kl_reg_loss: 1530.2998; train_edge_recon_loss: 898.9827; train_gene_expr_recon_loss: 1665953.4750; train_lambda_latent_adj_recon_loss: 2424.1574; train_lambda_latent_contrastive_instanceloss: 6.5881; train_lambda_latent_contrastive_clusterloss: 3.4084; train_global_loss: 1670816.9000; train_optim_loss: 1670816.9000; val_kl_reg_loss: 285.4068; val_edge_recon_loss: 498.6545; val_gene_expr_recon_loss: 1668098.2500; val_lambda_latent_adj_recon_loss: 2788.4146; val_lambda_latent_contrastive_instanceloss: 6.4842; val_lambda_latent_contrastive_clusterloss: 3.3060; val_global_loss: 1671680.3750; val_optim_loss: 1671680.3750
Epoch 14/100 |██------------------| 14.0% val_auroc_score: 0.9269; val_auprc_score: 0.9067; val_best_acc_score: 0.8610; val_best_f1_score: 0.8706; train_kl_reg_loss: 568.2964; train_edge_recon_loss: 906.8024; train_gene_expr_recon_loss: 1596718.3500; train_lambda_latent_adj_recon_loss: 2539.0875; train_lambda_latent_contrastive_instanceloss: 6.5939; train_lambda_latent_contrastive_clusterloss: 3.3789; train_global_loss: 1600742.4750; train_optim_loss: 1600742.4750; val_kl_reg_loss: 284.6676; val_edge_recon_loss: 501.9245; val_gene_expr_recon_loss: 1432459.2500; val_lambda_latent_adj_recon_loss: 2976.3333; val_lambda_latent_contrastive_instanceloss: 6.4736; val_lambda_latent_contrastive_clusterloss: 3.2749; val_global_loss: 1436232.0000; val_optim_loss: 1436232.0000
Epoch 15/100 |███-----------------| 15.0% val_auroc_score: 0.9248; val_auprc_score: 0.8946; val_best_acc_score: 0.8689; val_best_f1_score: 0.8785; train_kl_reg_loss: 372.8443; train_edge_recon_loss: 909.1984; train_gene_expr_recon_loss: 1362016.1000; train_lambda_latent_adj_recon_loss: 2775.2091; train_lambda_latent_contrastive_instanceloss: 6.5626; train_lambda_latent_contrastive_clusterloss: 3.3300; train_global_loss: 1366083.2500; train_optim_loss: 1366083.2500; val_kl_reg_loss: 309.3820; val_edge_recon_loss: 506.9248; val_gene_expr_recon_loss: 1514287.3750; val_lambda_latent_adj_recon_loss: 3184.1646; val_lambda_latent_contrastive_instanceloss: 6.4513; val_lambda_latent_contrastive_clusterloss: 3.2387; val_global_loss: 1518297.5000; val_optim_loss: 1518297.5000
Epoch 16/100 |███-----------------| 16.0% val_auroc_score: 0.9278; val_auprc_score: 0.9002; val_best_acc_score: 0.8710; val_best_f1_score: 0.8795; train_kl_reg_loss: 359.2047; train_edge_recon_loss: 909.8308; train_gene_expr_recon_loss: 1364451.2750; train_lambda_latent_adj_recon_loss: 2958.4505; train_lambda_latent_contrastive_instanceloss: 6.5410; train_lambda_latent_contrastive_clusterloss: 3.2812; train_global_loss: 1368688.5500; train_optim_loss: 1368688.5500; val_kl_reg_loss: 308.0262; val_edge_recon_loss: 512.0017; val_gene_expr_recon_loss: 1045033.4375; val_lambda_latent_adj_recon_loss: 3316.4766; val_lambda_latent_contrastive_instanceloss: 6.5225; val_lambda_latent_contrastive_clusterloss: 3.2799; val_global_loss: 1049179.6250; val_optim_loss: 1049179.6250
Epoch 17/100 |███-----------------| 17.0% val_auroc_score: 0.9348; val_auprc_score: 0.9118; val_best_acc_score: 0.8720; val_best_f1_score: 0.8830; train_kl_reg_loss: 407.0236; train_edge_recon_loss: 909.7490; train_gene_expr_recon_loss: 1303600.7125; train_lambda_latent_adj_recon_loss: 3023.1212; train_lambda_latent_contrastive_instanceloss: 6.5478; train_lambda_latent_contrastive_clusterloss: 3.2636; train_global_loss: 1307950.4250; train_optim_loss: 1307950.4250; val_kl_reg_loss: 317.5198; val_edge_recon_loss: 504.9442; val_gene_expr_recon_loss: 1177396.7500; val_lambda_latent_adj_recon_loss: 3240.2576; val_lambda_latent_contrastive_instanceloss: 6.4740; val_lambda_latent_contrastive_clusterloss: 3.1787; val_global_loss: 1181469.1250; val_optim_loss: 1181469.1250
Epoch 18/100 |███-----------------| 18.0% val_auroc_score: 0.9417; val_auprc_score: 0.9202; val_best_acc_score: 0.8878; val_best_f1_score: 0.8962; train_kl_reg_loss: 382.0840; train_edge_recon_loss: 904.2301; train_gene_expr_recon_loss: 1230677.1500; train_lambda_latent_adj_recon_loss: 2976.0022; train_lambda_latent_contrastive_instanceloss: 6.5284; train_lambda_latent_contrastive_clusterloss: 3.2398; train_global_loss: 1234949.2250; train_optim_loss: 1234949.2250; val_kl_reg_loss: 348.7819; val_edge_recon_loss: 499.6220; val_gene_expr_recon_loss: 1230423.1250; val_lambda_latent_adj_recon_loss: 3335.1929; val_lambda_latent_contrastive_instanceloss: 6.4365; val_lambda_latent_contrastive_clusterloss: 3.1602; val_global_loss: 1234616.2500; val_optim_loss: 1234616.2500
Epoch 19/100 |███-----------------| 19.0% val_auroc_score: 0.9328; val_auprc_score: 0.9101; val_best_acc_score: 0.8781; val_best_f1_score: 0.8876; train_kl_reg_loss: 406.6885; train_edge_recon_loss: 905.8800; train_gene_expr_recon_loss: 1137061.3625; train_lambda_latent_adj_recon_loss: 3071.0276; train_lambda_latent_contrastive_instanceloss: 6.4934; train_lambda_latent_contrastive_clusterloss: 3.1909; train_global_loss: 1141454.6625; train_optim_loss: 1141454.6625; val_kl_reg_loss: 358.6408; val_edge_recon_loss: 507.4919; val_gene_expr_recon_loss: 1248167.3750; val_lambda_latent_adj_recon_loss: 3419.9790; val_lambda_latent_contrastive_instanceloss: 6.4136; val_lambda_latent_contrastive_clusterloss: 3.1094; val_global_loss: 1252463.0000; val_optim_loss: 1252463.0000
Epoch 20/100 |████----------------| 20.0% val_auroc_score: 0.9390; val_auprc_score: 0.9136; val_best_acc_score: 0.8849; val_best_f1_score: 0.8932; train_kl_reg_loss: 427.9315; train_edge_recon_loss: 905.7393; train_gene_expr_recon_loss: 1234326.4750; train_lambda_latent_adj_recon_loss: 3145.9837; train_lambda_latent_contrastive_instanceloss: 6.4831; train_lambda_latent_contrastive_clusterloss: 3.1720; train_global_loss: 1238815.7500; train_optim_loss: 1238815.7500; val_kl_reg_loss: 357.6909; val_edge_recon_loss: 506.6189; val_gene_expr_recon_loss: 1121981.3750; val_lambda_latent_adj_recon_loss: 3446.6445; val_lambda_latent_contrastive_instanceloss: 6.4211; val_lambda_latent_contrastive_clusterloss: 3.1025; val_global_loss: 1126301.7500; val_optim_loss: 1126301.7500
Reducing learning rate: metric has not improved more than 0.0 in the last 4 epochs.
New learning rate is 0.0001.
Epoch 21/100 |████----------------| 21.0% val_auroc_score: 0.9453; val_auprc_score: 0.9204; val_best_acc_score: 0.8933; val_best_f1_score: 0.8995; train_kl_reg_loss: 423.2123; train_edge_recon_loss: 909.2598; train_gene_expr_recon_loss: 1244480.1250; train_lambda_latent_adj_recon_loss: 3214.7914; train_lambda_latent_contrastive_instanceloss: 6.4630; train_lambda_latent_contrastive_clusterloss: 3.1536; train_global_loss: 1249036.9875; train_optim_loss: 1249036.9875; val_kl_reg_loss: 347.4054; val_edge_recon_loss: 505.1692; val_gene_expr_recon_loss: 1068630.2500; val_lambda_latent_adj_recon_loss: 3443.8091; val_lambda_latent_contrastive_instanceloss: 6.3955; val_lambda_latent_contrastive_clusterloss: 3.1123; val_global_loss: 1072936.1250; val_optim_loss: 1072936.1250
Epoch 22/100 |████----------------| 22.0% val_auroc_score: 0.9395; val_auprc_score: 0.9177; val_best_acc_score: 0.8870; val_best_f1_score: 0.8930; train_kl_reg_loss: 426.8757; train_edge_recon_loss: 908.3862; train_gene_expr_recon_loss: 1319952.8000; train_lambda_latent_adj_recon_loss: 3235.5674; train_lambda_latent_contrastive_instanceloss: 6.4466; train_lambda_latent_contrastive_clusterloss: 3.1347; train_global_loss: 1324533.2250; train_optim_loss: 1324533.2250; val_kl_reg_loss: 385.0563; val_edge_recon_loss: 507.6362; val_gene_expr_recon_loss: 1330739.2500; val_lambda_latent_adj_recon_loss: 3448.8459; val_lambda_latent_contrastive_instanceloss: 6.3821; val_lambda_latent_contrastive_clusterloss: 3.0715; val_global_loss: 1335090.3750; val_optim_loss: 1335090.3750
Epoch 23/100 |████----------------| 23.0% val_auroc_score: 0.9443; val_auprc_score: 0.9250; val_best_acc_score: 0.8852; val_best_f1_score: 0.8914; train_kl_reg_loss: 435.5373; train_edge_recon_loss: 908.4248; train_gene_expr_recon_loss: 1288055.4875; train_lambda_latent_adj_recon_loss: 3227.1988; train_lambda_latent_contrastive_instanceloss: 6.4856; train_lambda_latent_contrastive_clusterloss: 3.1499; train_global_loss: 1292636.2750; train_optim_loss: 1292636.2750; val_kl_reg_loss: 381.2731; val_edge_recon_loss: 507.1147; val_gene_expr_recon_loss: 1042858.7500; val_lambda_latent_adj_recon_loss: 3450.2319; val_lambda_latent_contrastive_instanceloss: 6.4114; val_lambda_latent_contrastive_clusterloss: 3.1330; val_global_loss: 1047206.9375; val_optim_loss: 1047206.9375
Epoch 24/100 |████----------------| 24.0% val_auroc_score: 0.9375; val_auprc_score: 0.9107; val_best_acc_score: 0.8847; val_best_f1_score: 0.8917; train_kl_reg_loss: 429.4593; train_edge_recon_loss: 907.1103; train_gene_expr_recon_loss: 1271227.0000; train_lambda_latent_adj_recon_loss: 3226.1067; train_lambda_latent_contrastive_instanceloss: 6.4663; train_lambda_latent_contrastive_clusterloss: 3.1414; train_global_loss: 1275799.2750; train_optim_loss: 1275799.2750; val_kl_reg_loss: 364.3090; val_edge_recon_loss: 508.5630; val_gene_expr_recon_loss: 1078709.3750; val_lambda_latent_adj_recon_loss: 3450.6299; val_lambda_latent_contrastive_instanceloss: 6.4153; val_lambda_latent_contrastive_clusterloss: 3.1151; val_global_loss: 1083042.3750; val_optim_loss: 1083042.3750
Epoch 25/100 |█████---------------| 25.0% val_auroc_score: 0.9407; val_auprc_score: 0.9206; val_best_acc_score: 0.8854; val_best_f1_score: 0.8931; train_kl_reg_loss: 416.7092; train_edge_recon_loss: 910.4747; train_gene_expr_recon_loss: 1276261.9500; train_lambda_latent_adj_recon_loss: 3217.7134; train_lambda_latent_contrastive_instanceloss: 6.4788; train_lambda_latent_contrastive_clusterloss: 3.1488; train_global_loss: 1280816.4500; train_optim_loss: 1280816.4500; val_kl_reg_loss: 373.5588; val_edge_recon_loss: 508.0737; val_gene_expr_recon_loss: 1315529.3750; val_lambda_latent_adj_recon_loss: 3446.0327; val_lambda_latent_contrastive_instanceloss: 6.3840; val_lambda_latent_contrastive_clusterloss: 3.0764; val_global_loss: 1319866.5000; val_optim_loss: 1319866.5000
Epoch 26/100 |█████---------------| 26.0% val_auroc_score: 0.9422; val_auprc_score: 0.9251; val_best_acc_score: 0.8875; val_best_f1_score: 0.8942; train_kl_reg_loss: 433.3557; train_edge_recon_loss: 910.2360; train_gene_expr_recon_loss: 1303777.8750; train_lambda_latent_adj_recon_loss: 3225.7922; train_lambda_latent_contrastive_instanceloss: 6.4774; train_lambda_latent_contrastive_clusterloss: 3.1390; train_global_loss: 1308356.9000; train_optim_loss: 1308356.9000; val_kl_reg_loss: 337.2368; val_edge_recon_loss: 508.1256; val_gene_expr_recon_loss: 867988.5625; val_lambda_latent_adj_recon_loss: 3452.5513; val_lambda_latent_contrastive_instanceloss: 6.4105; val_lambda_latent_contrastive_clusterloss: 3.0975; val_global_loss: 872296.0625; val_optim_loss: 872296.0625
Epoch 27/100 |█████---------------| 27.0% val_auroc_score: 0.9445; val_auprc_score: 0.9270; val_best_acc_score: 0.8857; val_best_f1_score: 0.8938; train_kl_reg_loss: 426.1142; train_edge_recon_loss: 908.6740; train_gene_expr_recon_loss: 1262278.2000; train_lambda_latent_adj_recon_loss: 3226.6363; train_lambda_latent_contrastive_instanceloss: 6.4439; train_lambda_latent_contrastive_clusterloss: 3.1166; train_global_loss: 1266849.2250; train_optim_loss: 1266849.2250; val_kl_reg_loss: 368.1288; val_edge_recon_loss: 508.2429; val_gene_expr_recon_loss: 925606.6875; val_lambda_latent_adj_recon_loss: 3449.2812; val_lambda_latent_contrastive_instanceloss: 6.4005; val_lambda_latent_contrastive_clusterloss: 3.0738; val_global_loss: 929941.8125; val_optim_loss: 929941.8125
Epoch 28/100 |█████---------------| 28.0% val_auroc_score: 0.9516; val_auprc_score: 0.9351; val_best_acc_score: 0.8975; val_best_f1_score: 0.9033; train_kl_reg_loss: 428.4103; train_edge_recon_loss: 909.8719; train_gene_expr_recon_loss: 1257799.1250; train_lambda_latent_adj_recon_loss: 3224.6056; train_lambda_latent_contrastive_instanceloss: 6.4584; train_lambda_latent_contrastive_clusterloss: 3.1222; train_global_loss: 1262371.6375; train_optim_loss: 1262371.6375; val_kl_reg_loss: 394.4291; val_edge_recon_loss: 507.3498; val_gene_expr_recon_loss: 1322554.8750; val_lambda_latent_adj_recon_loss: 3450.6299; val_lambda_latent_contrastive_instanceloss: 6.3950; val_lambda_latent_contrastive_clusterloss: 3.0695; val_global_loss: 1326916.7500; val_optim_loss: 1326916.7500
Epoch 29/100 |█████---------------| 29.0% val_auroc_score: 0.9469; val_auprc_score: 0.9299; val_best_acc_score: 0.8952; val_best_f1_score: 0.9025; train_kl_reg_loss: 413.3244; train_edge_recon_loss: 911.5256; train_gene_expr_recon_loss: 1138154.0875; train_lambda_latent_adj_recon_loss: 3251.7101; train_lambda_latent_contrastive_instanceloss: 6.4492; train_lambda_latent_contrastive_clusterloss: 3.1306; train_global_loss: 1142740.2375; train_optim_loss: 1142740.2375; val_kl_reg_loss: 377.9948; val_edge_recon_loss: 508.4430; val_gene_expr_recon_loss: 1211049.0000; val_lambda_latent_adj_recon_loss: 3452.0649; val_lambda_latent_contrastive_instanceloss: 6.4138; val_lambda_latent_contrastive_clusterloss: 3.0690; val_global_loss: 1215397.1250; val_optim_loss: 1215397.1250
Epoch 30/100 |██████--------------| 30.0% val_auroc_score: 0.9448; val_auprc_score: 0.9289; val_best_acc_score: 0.8854; val_best_f1_score: 0.8931; train_kl_reg_loss: 434.1827; train_edge_recon_loss: 912.1815; train_gene_expr_recon_loss: 1238375.1250; train_lambda_latent_adj_recon_loss: 3266.1322; train_lambda_latent_contrastive_instanceloss: 6.4321; train_lambda_latent_contrastive_clusterloss: 3.1143; train_global_loss: 1242997.1750; train_optim_loss: 1242997.1750; val_kl_reg_loss: 379.9073; val_edge_recon_loss: 509.7468; val_gene_expr_recon_loss: 1220269.3750; val_lambda_latent_adj_recon_loss: 3452.0930; val_lambda_latent_contrastive_instanceloss: 6.4051; val_lambda_latent_contrastive_clusterloss: 3.0475; val_global_loss: 1224620.5000; val_optim_loss: 1224620.5000
Reducing learning rate: metric has not improved more than 0.0 in the last 4 epochs.
New learning rate is 1e-05.
Epoch 31/100 |██████--------------| 31.0% val_auroc_score: 0.9456; val_auprc_score: 0.9233; val_best_acc_score: 0.8907; val_best_f1_score: 0.8988; train_kl_reg_loss: 415.1714; train_edge_recon_loss: 911.9007; train_gene_expr_recon_loss: 1149905.1000; train_lambda_latent_adj_recon_loss: 3263.8810; train_lambda_latent_contrastive_instanceloss: 6.4658; train_lambda_latent_contrastive_clusterloss: 3.1221; train_global_loss: 1154505.6500; train_optim_loss: 1154505.6500; val_kl_reg_loss: 385.9487; val_edge_recon_loss: 507.2876; val_gene_expr_recon_loss: 1155947.2500; val_lambda_latent_adj_recon_loss: 3450.0508; val_lambda_latent_contrastive_instanceloss: 6.4180; val_lambda_latent_contrastive_clusterloss: 3.0961; val_global_loss: 1160300.0000; val_optim_loss: 1160300.0000
Epoch 32/100 |██████--------------| 32.0% val_auroc_score: 0.9448; val_auprc_score: 0.9218; val_best_acc_score: 0.8889; val_best_f1_score: 0.8959; train_kl_reg_loss: 429.6653; train_edge_recon_loss: 909.4185; train_gene_expr_recon_loss: 1208813.5000; train_lambda_latent_adj_recon_loss: 3255.0240; train_lambda_latent_contrastive_instanceloss: 6.4481; train_lambda_latent_contrastive_clusterloss: 3.1078; train_global_loss: 1213417.2000; train_optim_loss: 1213417.2000; val_kl_reg_loss: 379.9969; val_edge_recon_loss: 508.9610; val_gene_expr_recon_loss: 1207171.7500; val_lambda_latent_adj_recon_loss: 3451.2334; val_lambda_latent_contrastive_instanceloss: 6.3881; val_lambda_latent_contrastive_clusterloss: 3.0522; val_global_loss: 1211521.3750; val_optim_loss: 1211521.3750
Epoch 33/100 |██████--------------| 33.0% val_auroc_score: 0.9440; val_auprc_score: 0.9153; val_best_acc_score: 0.8904; val_best_f1_score: 0.8973; train_kl_reg_loss: 421.7929; train_edge_recon_loss: 911.9558; train_gene_expr_recon_loss: 1115533.1750; train_lambda_latent_adj_recon_loss: 3264.4836; train_lambda_latent_contrastive_instanceloss: 6.4589; train_lambda_latent_contrastive_clusterloss: 3.1243; train_global_loss: 1120140.9875; train_optim_loss: 1120140.9875; val_kl_reg_loss: 362.4688; val_edge_recon_loss: 508.8031; val_gene_expr_recon_loss: 853809.6875; val_lambda_latent_adj_recon_loss: 3453.4214; val_lambda_latent_contrastive_instanceloss: 6.3848; val_lambda_latent_contrastive_clusterloss: 3.0865; val_global_loss: 858143.8125; val_optim_loss: 858143.8125
Epoch 34/100 |██████--------------| 34.0% val_auroc_score: 0.9458; val_auprc_score: 0.9283; val_best_acc_score: 0.8907; val_best_f1_score: 0.8988; train_kl_reg_loss: 420.9795; train_edge_recon_loss: 911.5716; train_gene_expr_recon_loss: 1150903.2375; train_lambda_latent_adj_recon_loss: 3260.5872; train_lambda_latent_contrastive_instanceloss: 6.4636; train_lambda_latent_contrastive_clusterloss: 3.1169; train_global_loss: 1155505.9625; train_optim_loss: 1155505.9625; val_kl_reg_loss: 378.8888; val_edge_recon_loss: 508.5056; val_gene_expr_recon_loss: 1270070.2500; val_lambda_latent_adj_recon_loss: 3452.4692; val_lambda_latent_contrastive_instanceloss: 6.3777; val_lambda_latent_contrastive_clusterloss: 3.0689; val_global_loss: 1274419.6250; val_optim_loss: 1274419.6250
Epoch 35/100 |███████-------------| 35.0% val_auroc_score: 0.9352; val_auprc_score: 0.9107; val_best_acc_score: 0.8802; val_best_f1_score: 0.8888; train_kl_reg_loss: 429.5151; train_edge_recon_loss: 910.9287; train_gene_expr_recon_loss: 1049066.4250; train_lambda_latent_adj_recon_loss: 3249.0777; train_lambda_latent_contrastive_instanceloss: 6.4489; train_lambda_latent_contrastive_clusterloss: 3.1073; train_global_loss: 1053665.5125; train_optim_loss: 1053665.5125; val_kl_reg_loss: 388.8393; val_edge_recon_loss: 510.3941; val_gene_expr_recon_loss: 1137569.5000; val_lambda_latent_adj_recon_loss: 3452.9670; val_lambda_latent_contrastive_instanceloss: 6.3925; val_lambda_latent_contrastive_clusterloss: 3.0515; val_global_loss: 1141931.1250; val_optim_loss: 1141931.1250
Epoch 36/100 |███████-------------| 36.0% val_auroc_score: 0.9429; val_auprc_score: 0.9240; val_best_acc_score: 0.8836; val_best_f1_score: 0.8916; train_kl_reg_loss: 430.6337; train_edge_recon_loss: 911.4161; train_gene_expr_recon_loss: 1273890.5000; train_lambda_latent_adj_recon_loss: 3248.1725; train_lambda_latent_contrastive_instanceloss: 6.4423; train_lambda_latent_contrastive_clusterloss: 3.1039; train_global_loss: 1278490.3000; train_optim_loss: 1278490.3000; val_kl_reg_loss: 380.4514; val_edge_recon_loss: 510.2331; val_gene_expr_recon_loss: 983011.3125; val_lambda_latent_adj_recon_loss: 3451.6079; val_lambda_latent_contrastive_instanceloss: 6.3834; val_lambda_latent_contrastive_clusterloss: 3.0551; val_global_loss: 987363.0625; val_optim_loss: 987363.0625
Epoch 37/100 |███████-------------| 37.0% val_auroc_score: 0.9452; val_auprc_score: 0.9225; val_best_acc_score: 0.8896; val_best_f1_score: 0.8964; train_kl_reg_loss: 424.0517; train_edge_recon_loss: 910.4239; train_gene_expr_recon_loss: 1068789.2125; train_lambda_latent_adj_recon_loss: 3249.0453; train_lambda_latent_contrastive_instanceloss: 6.4575; train_lambda_latent_contrastive_clusterloss: 3.1173; train_global_loss: 1073382.3375; train_optim_loss: 1073382.3375; val_kl_reg_loss: 392.2874; val_edge_recon_loss: 507.8663; val_gene_expr_recon_loss: 1238262.8750; val_lambda_latent_adj_recon_loss: 3452.0400; val_lambda_latent_contrastive_instanceloss: 6.3666; val_lambda_latent_contrastive_clusterloss: 3.0492; val_global_loss: 1242624.3750; val_optim_loss: 1242624.3750
Reducing learning rate: metric has not improved more than 0.0 in the last 4 epochs.
New learning rate is 1.0000000000000002e-06.
Epoch 38/100 |███████-------------| 38.0% val_auroc_score: 0.9416; val_auprc_score: 0.9149; val_best_acc_score: 0.8923; val_best_f1_score: 0.8972; train_kl_reg_loss: 424.3692; train_edge_recon_loss: 909.6950; train_gene_expr_recon_loss: 1114235.2250; train_lambda_latent_adj_recon_loss: 3257.3860; train_lambda_latent_contrastive_instanceloss: 6.4547; train_lambda_latent_contrastive_clusterloss: 3.1041; train_global_loss: 1118836.2750; train_optim_loss: 1118836.2750; val_kl_reg_loss: 388.3911; val_edge_recon_loss: 509.5560; val_gene_expr_recon_loss: 1202133.5000; val_lambda_latent_adj_recon_loss: 3451.5203; val_lambda_latent_contrastive_instanceloss: 6.3723; val_lambda_latent_contrastive_clusterloss: 3.0581; val_global_loss: 1206492.3750; val_optim_loss: 1206492.3750
Epoch 39/100 |███████-------------| 39.0% val_auroc_score: 0.9461; val_auprc_score: 0.9195; val_best_acc_score: 0.8899; val_best_f1_score: 0.8969; train_kl_reg_loss: 427.7401; train_edge_recon_loss: 910.2038; train_gene_expr_recon_loss: 1157695.6000; train_lambda_latent_adj_recon_loss: 3254.6311; train_lambda_latent_contrastive_instanceloss: 6.4414; train_lambda_latent_contrastive_clusterloss: 3.1132; train_global_loss: 1162297.7250; train_optim_loss: 1162297.7250; val_kl_reg_loss: 380.3524; val_edge_recon_loss: 508.9223; val_gene_expr_recon_loss: 976970.0625; val_lambda_latent_adj_recon_loss: 3449.3638; val_lambda_latent_contrastive_instanceloss: 6.4270; val_lambda_latent_contrastive_clusterloss: 3.1126; val_global_loss: 981318.2500; val_optim_loss: 981318.2500
Epoch 40/100 |████████------------| 40.0% val_auroc_score: 0.9468; val_auprc_score: 0.9307; val_best_acc_score: 0.8881; val_best_f1_score: 0.8955; train_kl_reg_loss: 419.4708; train_edge_recon_loss: 909.6077; train_gene_expr_recon_loss: 1161396.1000; train_lambda_latent_adj_recon_loss: 3241.7012; train_lambda_latent_contrastive_instanceloss: 6.4363; train_lambda_latent_contrastive_clusterloss: 3.1068; train_global_loss: 1165976.4375; train_optim_loss: 1165976.4375; val_kl_reg_loss: 377.4643; val_edge_recon_loss: 508.4386; val_gene_expr_recon_loss: 961974.0000; val_lambda_latent_adj_recon_loss: 3451.8752; val_lambda_latent_contrastive_instanceloss: 6.3636; val_lambda_latent_contrastive_clusterloss: 3.0638; val_global_loss: 966321.1875; val_optim_loss: 966321.1875
Epoch 41/100 |████████------------| 41.0% val_auroc_score: 0.9412; val_auprc_score: 0.9153; val_best_acc_score: 0.8868; val_best_f1_score: 0.8937; train_kl_reg_loss: 426.7311; train_edge_recon_loss: 908.9222; train_gene_expr_recon_loss: 1284258.6250; train_lambda_latent_adj_recon_loss: 3255.6063; train_lambda_latent_contrastive_instanceloss: 6.4381; train_lambda_latent_contrastive_clusterloss: 3.1110; train_global_loss: 1288859.4500; train_optim_loss: 1288859.4500; val_kl_reg_loss: 400.1602; val_edge_recon_loss: 509.6247; val_gene_expr_recon_loss: 1066020.3750; val_lambda_latent_adj_recon_loss: 3453.4165; val_lambda_latent_contrastive_instanceloss: 6.3593; val_lambda_latent_contrastive_clusterloss: 3.0495; val_global_loss: 1070392.8750; val_optim_loss: 1070392.8750
Stopping early: metric has not improved more than 0.0 in the last 8 epochs.
If the early stopping criterion is too strong, please instantiate it with different parameters in the train method.
Model training finished after 1 min 2 sec.
Using best model state, which was in epoch 33.
--- MODEL EVALUATION ---
val AUROC score: 0.9408
val AUPRC score: 0.9208
val best accuracy score: 0.8860
val best F1 score: 0.8949
val MSE score: 5.7816
[7]:
# Compute latent neighbor graph
latent_key = 'garfield_latent'
sc.pp.neighbors(model.adata,
use_rep=latent_key,
key_added=latent_key)
# Compute UMAP embedding
sc.tl.umap(model.adata,
neighbors_key=latent_key)
[8]:
sc.pl.umap(model.adata, color=['rna:celltype'], show=True)
[9]:
sc.pl.umap(model.adata, color=[ 'rna:celltype'], show=True, legend_loc='on data')
[10]:
# Save trained model
model_folder_path = f"{workdir}/model"
os.makedirs(model_folder_path, exist_ok=True)
del model.adata.obsm['feat']
model.save(dir_path=model_folder_path,
overwrite=True,
save_adata=True,
adata_file_name="adata_ref.h5ad")
Pickle failed with error: Can't pickle local object 'WeakSet.__init__.<locals>._remove', switching to dill...
Model saved successfully using dill at /home/zhouweige/zhouwg_data/project/Garfield_tutorials/result/garfield_multiome_10xpbmc3k/model/attr.pkl
[ ]: