Inference and Analysis of Gene Expression Rhythmicity using GeneRhythm

This tutorial provides a step-by-step guide on performing inference, analysis, and visualization of gene expression rhythmicity in a single dataset using GeneRhythm. We demonstrate the diverse capabilities of GeneRhythm by applying it to scRNA-seq data obtained from mouse tissue samples.

GeneRhythm leverages user-provided gene expression data by integrating wavelet transformation with deep generative modeling. This approach enables the extraction of frequency-domain features that complement traditional time-domain analyses, allowing for a more comprehensive understanding of gene expression dynamics.

[1]:
import subprocess
from Build_graph import *
from Frequency_extract import *
from GCN_VAE import *
from Show_result import *

Part 1: Data loading, time and frequency information acquisition

Obtain time information with monocle3

GeneRhythm firstly utilized monocle3 to obtain the trajectory information of single-cell RNA-seq data. trajectory_inference.R is the script to run monocle3. dataset indicated the name of dataset. mtx, barcode and gene indicate the position of the single-cell RNA-seq data.Based on the trajectory information, GeneRhythm can derive time information (Gene expression chagnes on the trajectory pesodu-time path).

[2]:
dataset = 'mouse_embryo_blood'
mtx = './dataset/mouse_embryo_blood/counts_5k_final.mtx'
barcode = './dataset/mouse_embryo_blood/cell_meta_5kgenes_final.csv'
gene  = './dataset/mouse_embryo_blood/gene_meta_5kgenes_final.csv'
subprocess.run(["Rscript", "trajectory_inference.R", dataset, mtx, barcode, gene])

Frequency information generation

In this step, we harness the power of wavelet transformation to extract detailed frequency information from the gene expression data. By leveraging the trajectory information obtained from Monocle3—which orders cells along a pseudotime axis—we can capture both the temporal progression and the underlying periodic patterns of gene expression.

Wavelet transformation decomposes the gene expression profiles into various frequency components, enabling us to detect subtle oscillations and rhythmic behaviors that are often not apparent in the time domain alone. This multi-scale analysis helps reveal hidden periodicities and enriches our understanding of gene regulatory mechanisms.

By integrating the frequency-domain features with the temporal trajectory and expression, we achieve a more nuanced analysis. The frequency information complements the time-domain data, enhancing gene clustering. Ultimately, this combined approach provides a comprehensive view of the dynamic changes in gene expression, paving the way for deeper insights into cellular functions and regulatory processes.

In addition, we implemented several companion functions to support trajectory inputs from different upstream tools while maintaining a unified downstream workflow. Specifically, frequency_extract_format reformats trajectory information from different input types into a standardized trajectory table for downstream frequency extraction, requiring pseudotime information and, depending on the input type, optional path labels, cell identifiers, gene identifiers, and expression values. frequency_extract_scvelo performs scVelo-based velocity and pseudotime inference and then converts the inferred trajectory into the standard format for frequency feature extraction; frequency_extract_veloagent processes VeloAgent-inferred trajectories and reformats them into the same common structure for downstream analysis; and frequency_extract_celldancer runs cellDancer-based velocity and pseudotime analysis and converts the resulting trajectories into the standardized format for frequency extraction.

[3]:
trajectory_info = pd.read_csv("mouse_embryo_blood.csv")
mtx = sc.read_mtx(mtx)
mtx = mtx.X.T
barcode = pd.read_csv(barcode,sep=',',index_col=0)
gene  = pd.read_csv(gene,header=0,index_col = 0)
adata = anndata.AnnData(mtx,barcode,gene)
frequency_extract(trajectory_info, adata, dataset)

Part 2: Model preparation and training

GCN graph preparation

In this phase, we utilize the Mippie PPI database to extract gene-gene interaction information, thereby constructing the graph structure for our Graph Convolutional Network (GCN). Specifically, the database provides gene interaction data that has been validated by both experimental evidence and computational predictions. We treat these interactions as edges in the graph, with each gene represented as a node. By integrating this biologically informed network structure with the previously obtained gene expression and frequency information, the GCN model is better equipped to capture the regulatory relationships and functional synergies between genes. This integration ultimately enhances the accuracy and interpretability of gene clustering and biomarker identification during model training.

[4]:
gene_info = gene
for i in range(len(gene_info)):
    gene_info.loc[i,"gene_id"] = gene_info.loc[i,"gene_id"][:18]
print(gene_info.head())
mg = mygene.MyGeneInfo()
gene_id = mg.getgenes(gene_info.loc[:,"gene_id"], fields='_id')
ids = [gene_id[i].get('_id') for i in range(len(gene_id))]
with open("mouse_embryo_blood.txt", 'w') as output:
    for row in ids:
        output.write(str(row) + '\n')

subprocess.run(["Rscript", "mippie_nc.R", 'mouse_embryo_blood.txt', 'mippie_subset_blood.tsv'])
graph_df = pd.read_csv('mippie_subnet_blood.txt', sep='\t', header=None)
build_graph_mouse(graph_df,gene_info)

Modle training

In this stage, the model is trained using time, frequency, and expression data, along with the previously constructed graph. This integration allows the model to learn a comprehensive latent embedding that encapsulates the intricate relationships among genes. Once the model has been trained, we apply the Leiden algorithm to the latent space to identify gene clusters. These clusters represent groups of genes with similar expression dynamics and regulatory patterns, providing a valuable basis for further biological insights and downstream analysis.

[5]:
GeneRhythm_Model(input_data = 'mouse_embryo_blood.npy',graph='graph_index.npy',sc_data = adata)
____________________________
Start Training VAE...
torch.Size([5000, 250])
Epochs: 1, AvgLoss: 36.0972
torch.Size([5000, 250])
Epochs: 2, AvgLoss: 36.0126
torch.Size([5000, 250])
Epochs: 3, AvgLoss: 35.9325
torch.Size([5000, 250])
Epochs: 4, AvgLoss: 35.8498
torch.Size([5000, 250])
Epochs: 5, AvgLoss: 35.7680
torch.Size([5000, 250])
Epochs: 6, AvgLoss: 35.6849
torch.Size([5000, 250])
Epochs: 7, AvgLoss: 35.6036
torch.Size([5000, 250])
Epochs: 8, AvgLoss: 35.5179
torch.Size([5000, 250])
Epochs: 9, AvgLoss: 35.4255
torch.Size([5000, 250])
Epochs: 10, AvgLoss: 35.3372
torch.Size([5000, 250])
Epochs: 11, AvgLoss: 35.2429
torch.Size([5000, 250])
Epochs: 12, AvgLoss: 35.1446
torch.Size([5000, 250])
Epochs: 13, AvgLoss: 35.0446
torch.Size([5000, 250])
Epochs: 14, AvgLoss: 34.9347
torch.Size([5000, 250])
Epochs: 15, AvgLoss: 34.8129
torch.Size([5000, 250])
Epochs: 16, AvgLoss: 34.6961
torch.Size([5000, 250])
Epochs: 17, AvgLoss: 34.5661
torch.Size([5000, 250])
Epochs: 18, AvgLoss: 34.4356
torch.Size([5000, 250])
Epochs: 19, AvgLoss: 34.2778
torch.Size([5000, 250])
Epochs: 20, AvgLoss: 34.1006
torch.Size([5000, 250])
Epochs: 21, AvgLoss: 33.9412
torch.Size([5000, 250])
Epochs: 22, AvgLoss: 33.7481
torch.Size([5000, 250])
Epochs: 23, AvgLoss: 33.5441
torch.Size([5000, 250])
Epochs: 24, AvgLoss: 33.3211
torch.Size([5000, 250])
Epochs: 25, AvgLoss: 33.0648
torch.Size([5000, 250])
Epochs: 26, AvgLoss: 32.7958
torch.Size([5000, 250])
Epochs: 27, AvgLoss: 32.4984
torch.Size([5000, 250])
Epochs: 28, AvgLoss: 32.1901
torch.Size([5000, 250])
Epochs: 29, AvgLoss: 31.8502
torch.Size([5000, 250])
Epochs: 30, AvgLoss: 31.4385
torch.Size([5000, 250])
Epochs: 31, AvgLoss: 31.0471
torch.Size([5000, 250])
Epochs: 32, AvgLoss: 30.5473
torch.Size([5000, 250])
Epochs: 33, AvgLoss: 30.0549
torch.Size([5000, 250])
Epochs: 34, AvgLoss: 29.5322
torch.Size([5000, 250])
Epochs: 35, AvgLoss: 28.9840
torch.Size([5000, 250])
Epochs: 36, AvgLoss: 28.3280
torch.Size([5000, 250])
Epochs: 37, AvgLoss: 27.6150
torch.Size([5000, 250])
Epochs: 38, AvgLoss: 26.9170
torch.Size([5000, 250])
Epochs: 39, AvgLoss: 26.1875
torch.Size([5000, 250])
Epochs: 40, AvgLoss: 25.3617
torch.Size([5000, 250])
Epochs: 41, AvgLoss: 24.5162
torch.Size([5000, 250])
Epochs: 42, AvgLoss: 23.7402
torch.Size([5000, 250])
Epochs: 43, AvgLoss: 22.9265
torch.Size([5000, 250])
Epochs: 44, AvgLoss: 22.0948
torch.Size([5000, 250])
Epochs: 45, AvgLoss: 21.3059
torch.Size([5000, 250])
Epochs: 46, AvgLoss: 20.5147
torch.Size([5000, 250])
Epochs: 47, AvgLoss: 19.8128
torch.Size([5000, 250])
Epochs: 48, AvgLoss: 19.1939
torch.Size([5000, 250])
Epochs: 49, AvgLoss: 18.5176
torch.Size([5000, 250])
Epochs: 50, AvgLoss: 17.9389
torch.Size([5000, 250])
Epochs: 51, AvgLoss: 17.4410
torch.Size([5000, 250])
Epochs: 52, AvgLoss: 17.0710
torch.Size([5000, 250])
Epochs: 53, AvgLoss: 16.6654
torch.Size([5000, 250])
Epochs: 54, AvgLoss: 16.3311
torch.Size([5000, 250])
Epochs: 55, AvgLoss: 16.0378
torch.Size([5000, 250])
Epochs: 56, AvgLoss: 15.8195
torch.Size([5000, 250])
Epochs: 57, AvgLoss: 15.6146
torch.Size([5000, 250])
Epochs: 58, AvgLoss: 15.3886
torch.Size([5000, 250])
Epochs: 59, AvgLoss: 15.2236
torch.Size([5000, 250])
Epochs: 60, AvgLoss: 15.1142
torch.Size([5000, 250])
Epochs: 61, AvgLoss: 14.9679
torch.Size([5000, 250])
Epochs: 62, AvgLoss: 14.8254
torch.Size([5000, 250])
Epochs: 63, AvgLoss: 14.6904
torch.Size([5000, 250])
Epochs: 64, AvgLoss: 14.6247
torch.Size([5000, 250])
Epochs: 65, AvgLoss: 14.5510
torch.Size([5000, 250])
Epochs: 66, AvgLoss: 14.3986
torch.Size([5000, 250])
Epochs: 67, AvgLoss: 14.2733
torch.Size([5000, 250])
Epochs: 68, AvgLoss: 14.1337
torch.Size([5000, 250])
Epochs: 69, AvgLoss: 14.0037
torch.Size([5000, 250])
Epochs: 70, AvgLoss: 13.9021
torch.Size([5000, 250])
Epochs: 71, AvgLoss: 13.7272
torch.Size([5000, 250])
Epochs: 72, AvgLoss: 13.5851
torch.Size([5000, 250])
Epochs: 73, AvgLoss: 13.4104
torch.Size([5000, 250])
Epochs: 74, AvgLoss: 13.2305
torch.Size([5000, 250])
Epochs: 75, AvgLoss: 13.0084
torch.Size([5000, 250])
Epochs: 76, AvgLoss: 12.8711
torch.Size([5000, 250])
Epochs: 77, AvgLoss: 12.5859
torch.Size([5000, 250])
Epochs: 78, AvgLoss: 12.4256
torch.Size([5000, 250])
Epochs: 79, AvgLoss: 12.2341
torch.Size([5000, 250])
Epochs: 80, AvgLoss: 11.9913
torch.Size([5000, 250])
Epochs: 81, AvgLoss: 11.8286
torch.Size([5000, 250])
Epochs: 82, AvgLoss: 11.6729
torch.Size([5000, 250])
Epochs: 83, AvgLoss: 11.4917
torch.Size([5000, 250])
Epochs: 84, AvgLoss: 11.3895
torch.Size([5000, 250])
Epochs: 85, AvgLoss: 11.2275
torch.Size([5000, 250])
Epochs: 86, AvgLoss: 11.0763
torch.Size([5000, 250])
Epochs: 87, AvgLoss: 10.9406
torch.Size([5000, 250])
Epochs: 88, AvgLoss: 10.8139
torch.Size([5000, 250])
Epochs: 89, AvgLoss: 10.6911
torch.Size([5000, 250])
Epochs: 90, AvgLoss: 10.5621
torch.Size([5000, 250])
Epochs: 91, AvgLoss: 10.4698
torch.Size([5000, 250])
Epochs: 92, AvgLoss: 10.3835
torch.Size([5000, 250])
Epochs: 93, AvgLoss: 10.2922
torch.Size([5000, 250])
Epochs: 94, AvgLoss: 10.1959
torch.Size([5000, 250])
Epochs: 95, AvgLoss: 10.1305
torch.Size([5000, 250])
Epochs: 96, AvgLoss: 10.0733
torch.Size([5000, 250])
Epochs: 97, AvgLoss: 10.0045
torch.Size([5000, 250])
Epochs: 98, AvgLoss: 9.9390
torch.Size([5000, 250])
Epochs: 99, AvgLoss: 9.8877
torch.Size([5000, 250])
Epochs: 100, AvgLoss: 9.8385
torch.Size([5000, 250])
Epochs: 101, AvgLoss: 9.7891
torch.Size([5000, 250])
Epochs: 102, AvgLoss: 9.7293
torch.Size([5000, 250])
Epochs: 103, AvgLoss: 9.6950
torch.Size([5000, 250])
Epochs: 104, AvgLoss: 9.6905
torch.Size([5000, 250])
Epochs: 105, AvgLoss: 9.6213
torch.Size([5000, 250])
Epochs: 106, AvgLoss: 9.5886
torch.Size([5000, 250])
Epochs: 107, AvgLoss: 9.5521
torch.Size([5000, 250])
Epochs: 108, AvgLoss: 9.5254
torch.Size([5000, 250])
Epochs: 109, AvgLoss: 9.4989
torch.Size([5000, 250])
Epochs: 110, AvgLoss: 9.4512
torch.Size([5000, 250])
Epochs: 111, AvgLoss: 9.3969
torch.Size([5000, 250])
Epochs: 112, AvgLoss: 9.3668
torch.Size([5000, 250])
Epochs: 113, AvgLoss: 9.3361
torch.Size([5000, 250])
Epochs: 114, AvgLoss: 9.3116
torch.Size([5000, 250])
Epochs: 115, AvgLoss: 9.2614
torch.Size([5000, 250])
Epochs: 116, AvgLoss: 9.2136
torch.Size([5000, 250])
Epochs: 117, AvgLoss: 9.1926
torch.Size([5000, 250])
Epochs: 118, AvgLoss: 9.1306
torch.Size([5000, 250])
Epochs: 119, AvgLoss: 9.0853
torch.Size([5000, 250])
Epochs: 120, AvgLoss: 9.0682
torch.Size([5000, 250])
Epochs: 121, AvgLoss: 9.0222
torch.Size([5000, 250])
Epochs: 122, AvgLoss: 8.9578
torch.Size([5000, 250])
Epochs: 123, AvgLoss: 8.8997
torch.Size([5000, 250])
Epochs: 124, AvgLoss: 8.8456
torch.Size([5000, 250])
Epochs: 125, AvgLoss: 8.8128
torch.Size([5000, 250])
Epochs: 126, AvgLoss: 8.7366
torch.Size([5000, 250])
Epochs: 127, AvgLoss: 8.6639
torch.Size([5000, 250])
Epochs: 128, AvgLoss: 8.6392
torch.Size([5000, 250])
Epochs: 129, AvgLoss: 8.5718
torch.Size([5000, 250])
Epochs: 130, AvgLoss: 8.5075
torch.Size([5000, 250])
Epochs: 131, AvgLoss: 8.4559
torch.Size([5000, 250])
Epochs: 132, AvgLoss: 8.3965
torch.Size([5000, 250])
Epochs: 133, AvgLoss: 8.3283
torch.Size([5000, 250])
Epochs: 134, AvgLoss: 8.2864
torch.Size([5000, 250])
Epochs: 135, AvgLoss: 8.1984
torch.Size([5000, 250])
Epochs: 136, AvgLoss: 8.1634
torch.Size([5000, 250])
Epochs: 137, AvgLoss: 8.1053
torch.Size([5000, 250])
Epochs: 138, AvgLoss: 8.0301
torch.Size([5000, 250])
Epochs: 139, AvgLoss: 7.9850
torch.Size([5000, 250])
Epochs: 140, AvgLoss: 7.9212
torch.Size([5000, 250])
Epochs: 141, AvgLoss: 7.8980
torch.Size([5000, 250])
Epochs: 142, AvgLoss: 7.8670
torch.Size([5000, 250])
Epochs: 143, AvgLoss: 7.8009
torch.Size([5000, 250])
Epochs: 144, AvgLoss: 7.7532
torch.Size([5000, 250])
Epochs: 145, AvgLoss: 7.7174
torch.Size([5000, 250])
Epochs: 146, AvgLoss: 7.6725
torch.Size([5000, 250])
Epochs: 147, AvgLoss: 7.6324
torch.Size([5000, 250])
Epochs: 148, AvgLoss: 7.5946
torch.Size([5000, 250])
Epochs: 149, AvgLoss: 7.5803
torch.Size([5000, 250])
Epochs: 150, AvgLoss: 7.5413
torch.Size([5000, 250])
Epochs: 151, AvgLoss: 7.5187
torch.Size([5000, 250])
Epochs: 152, AvgLoss: 7.5062
torch.Size([5000, 250])
Epochs: 153, AvgLoss: 7.5006
torch.Size([5000, 250])
Epochs: 154, AvgLoss: 7.4415
torch.Size([5000, 250])
Epochs: 155, AvgLoss: 7.4111
torch.Size([5000, 250])
Epochs: 156, AvgLoss: 7.4411
torch.Size([5000, 250])
Epochs: 157, AvgLoss: 7.4276
torch.Size([5000, 250])
Epochs: 158, AvgLoss: 7.4121
torch.Size([5000, 250])
Epochs: 159, AvgLoss: 7.3644
torch.Size([5000, 250])
Epochs: 160, AvgLoss: 7.3494
torch.Size([5000, 250])
Epochs: 161, AvgLoss: 7.3174
torch.Size([5000, 250])
Epochs: 162, AvgLoss: 7.3192
torch.Size([5000, 250])
Epochs: 163, AvgLoss: 7.3199
torch.Size([5000, 250])
Epochs: 164, AvgLoss: 7.2825
torch.Size([5000, 250])
Epochs: 165, AvgLoss: 7.2631
torch.Size([5000, 250])
Epochs: 166, AvgLoss: 7.2452
torch.Size([5000, 250])
Epochs: 167, AvgLoss: 7.2315
torch.Size([5000, 250])
Epochs: 168, AvgLoss: 7.2390
torch.Size([5000, 250])
Epochs: 169, AvgLoss: 7.2209
torch.Size([5000, 250])
Epochs: 170, AvgLoss: 7.2083
torch.Size([5000, 250])
Epochs: 171, AvgLoss: 7.1777
torch.Size([5000, 250])
Epochs: 172, AvgLoss: 7.1737
torch.Size([5000, 250])
Epochs: 173, AvgLoss: 7.1596
torch.Size([5000, 250])
Epochs: 174, AvgLoss: 7.1539
torch.Size([5000, 250])
Epochs: 175, AvgLoss: 7.1231
torch.Size([5000, 250])
Epochs: 176, AvgLoss: 7.1312
torch.Size([5000, 250])
Epochs: 177, AvgLoss: 7.1235
torch.Size([5000, 250])
Epochs: 178, AvgLoss: 7.0955
torch.Size([5000, 250])
Epochs: 179, AvgLoss: 7.1083
torch.Size([5000, 250])
Epochs: 180, AvgLoss: 7.0718
torch.Size([5000, 250])
Epochs: 181, AvgLoss: 7.0664
torch.Size([5000, 250])
Epochs: 182, AvgLoss: 7.0510
torch.Size([5000, 250])
Epochs: 183, AvgLoss: 7.0670
torch.Size([5000, 250])
Epochs: 184, AvgLoss: 7.0485
torch.Size([5000, 250])
Epochs: 185, AvgLoss: 7.0162
torch.Size([5000, 250])
Epochs: 186, AvgLoss: 7.0262
torch.Size([5000, 250])
Epochs: 187, AvgLoss: 7.0204
torch.Size([5000, 250])
Epochs: 188, AvgLoss: 7.0177
torch.Size([5000, 250])
Epochs: 189, AvgLoss: 7.0075
torch.Size([5000, 250])
Epochs: 190, AvgLoss: 6.9666
torch.Size([5000, 250])
Epochs: 191, AvgLoss: 6.9577
torch.Size([5000, 250])
Epochs: 192, AvgLoss: 6.9869
torch.Size([5000, 250])
Epochs: 193, AvgLoss: 6.9709
torch.Size([5000, 250])
Epochs: 194, AvgLoss: 6.9576
torch.Size([5000, 250])
Epochs: 195, AvgLoss: 6.9358
torch.Size([5000, 250])
Epochs: 196, AvgLoss: 6.9263
torch.Size([5000, 250])
Epochs: 197, AvgLoss: 6.9327
torch.Size([5000, 250])
Epochs: 198, AvgLoss: 6.9306
torch.Size([5000, 250])
Epochs: 199, AvgLoss: 6.9296
torch.Size([5000, 250])
Epochs: 200, AvgLoss: 6.9123
torch.Size([5000, 250])
Epochs: 201, AvgLoss: 6.8796
torch.Size([5000, 250])
Epochs: 202, AvgLoss: 6.8976
torch.Size([5000, 250])
Epochs: 203, AvgLoss: 6.8922
torch.Size([5000, 250])
Epochs: 204, AvgLoss: 6.8748
torch.Size([5000, 250])
Epochs: 205, AvgLoss: 6.8822
torch.Size([5000, 250])
Epochs: 206, AvgLoss: 6.8668
torch.Size([5000, 250])
Epochs: 207, AvgLoss: 6.8743
torch.Size([5000, 250])
Epochs: 208, AvgLoss: 6.8487
torch.Size([5000, 250])
Epochs: 209, AvgLoss: 6.8488
torch.Size([5000, 250])
Epochs: 210, AvgLoss: 6.8430
torch.Size([5000, 250])
Epochs: 211, AvgLoss: 6.8497
torch.Size([5000, 250])
Epochs: 212, AvgLoss: 6.8337
torch.Size([5000, 250])
Epochs: 213, AvgLoss: 6.8223
torch.Size([5000, 250])
Epochs: 214, AvgLoss: 6.8274
torch.Size([5000, 250])
Epochs: 215, AvgLoss: 6.8048
torch.Size([5000, 250])
Epochs: 216, AvgLoss: 6.7963
torch.Size([5000, 250])
Epochs: 217, AvgLoss: 6.7926
torch.Size([5000, 250])
Epochs: 218, AvgLoss: 6.8077
torch.Size([5000, 250])
Epochs: 219, AvgLoss: 6.7919
torch.Size([5000, 250])
Epochs: 220, AvgLoss: 6.7840
torch.Size([5000, 250])
Epochs: 221, AvgLoss: 6.7792
torch.Size([5000, 250])
Epochs: 222, AvgLoss: 6.7682
torch.Size([5000, 250])
Epochs: 223, AvgLoss: 6.7642
torch.Size([5000, 250])
Epochs: 224, AvgLoss: 6.7510
torch.Size([5000, 250])
Epochs: 225, AvgLoss: 6.7621
torch.Size([5000, 250])
Epochs: 226, AvgLoss: 6.7341
torch.Size([5000, 250])
Epochs: 227, AvgLoss: 6.7255
torch.Size([5000, 250])
Epochs: 228, AvgLoss: 6.7199
torch.Size([5000, 250])
Epochs: 229, AvgLoss: 6.7127
torch.Size([5000, 250])
Epochs: 230, AvgLoss: 6.7207
torch.Size([5000, 250])
Epochs: 231, AvgLoss: 6.7168
torch.Size([5000, 250])
Epochs: 232, AvgLoss: 6.7045
torch.Size([5000, 250])
Epochs: 233, AvgLoss: 6.6907
torch.Size([5000, 250])
Epochs: 234, AvgLoss: 6.6799
torch.Size([5000, 250])
Epochs: 235, AvgLoss: 6.6806
torch.Size([5000, 250])
Epochs: 236, AvgLoss: 6.6710
torch.Size([5000, 250])
Epochs: 237, AvgLoss: 6.6674
torch.Size([5000, 250])
Epochs: 238, AvgLoss: 6.6514
torch.Size([5000, 250])
Epochs: 239, AvgLoss: 6.6441
torch.Size([5000, 250])
Epochs: 240, AvgLoss: 6.6411
torch.Size([5000, 250])
Epochs: 241, AvgLoss: 6.6373
torch.Size([5000, 250])
Epochs: 242, AvgLoss: 6.6379
torch.Size([5000, 250])
Epochs: 243, AvgLoss: 6.6292
torch.Size([5000, 250])
Epochs: 244, AvgLoss: 6.6222
torch.Size([5000, 250])
Epochs: 245, AvgLoss: 6.6035
torch.Size([5000, 250])
Epochs: 246, AvgLoss: 6.6022
torch.Size([5000, 250])
Epochs: 247, AvgLoss: 6.6024
torch.Size([5000, 250])
Epochs: 248, AvgLoss: 6.5994
torch.Size([5000, 250])
Epochs: 249, AvgLoss: 6.6026
torch.Size([5000, 250])
Epochs: 250, AvgLoss: 6.5803
torch.Size([5000, 250])
Epochs: 251, AvgLoss: 6.5807
torch.Size([5000, 250])
Epochs: 252, AvgLoss: 6.5668
torch.Size([5000, 250])
Epochs: 253, AvgLoss: 6.5637
torch.Size([5000, 250])
Epochs: 254, AvgLoss: 6.5600
torch.Size([5000, 250])
Epochs: 255, AvgLoss: 6.5506
torch.Size([5000, 250])
Epochs: 256, AvgLoss: 6.5588
torch.Size([5000, 250])
Epochs: 257, AvgLoss: 6.5317
torch.Size([5000, 250])
Epochs: 258, AvgLoss: 6.5276
torch.Size([5000, 250])
Epochs: 259, AvgLoss: 6.5174
torch.Size([5000, 250])
Epochs: 260, AvgLoss: 6.5136
torch.Size([5000, 250])
Epochs: 261, AvgLoss: 6.5101
torch.Size([5000, 250])
Epochs: 262, AvgLoss: 6.5112
torch.Size([5000, 250])
Epochs: 263, AvgLoss: 6.4958
torch.Size([5000, 250])
Epochs: 264, AvgLoss: 6.4862
torch.Size([5000, 250])
Epochs: 265, AvgLoss: 6.4915
torch.Size([5000, 250])
Epochs: 266, AvgLoss: 6.4660
torch.Size([5000, 250])
Epochs: 267, AvgLoss: 6.4638
torch.Size([5000, 250])
Epochs: 268, AvgLoss: 6.4732
torch.Size([5000, 250])
Epochs: 269, AvgLoss: 6.4582
torch.Size([5000, 250])
Epochs: 270, AvgLoss: 6.4438
torch.Size([5000, 250])
Epochs: 271, AvgLoss: 6.4282
torch.Size([5000, 250])
Epochs: 272, AvgLoss: 6.4321
torch.Size([5000, 250])
Epochs: 273, AvgLoss: 6.4276
torch.Size([5000, 250])
Epochs: 274, AvgLoss: 6.4286
torch.Size([5000, 250])
Epochs: 275, AvgLoss: 6.4088
torch.Size([5000, 250])
Epochs: 276, AvgLoss: 6.4067
torch.Size([5000, 250])
Epochs: 277, AvgLoss: 6.3975
torch.Size([5000, 250])
Epochs: 278, AvgLoss: 6.3865
torch.Size([5000, 250])
Epochs: 279, AvgLoss: 6.3923
torch.Size([5000, 250])
Epochs: 280, AvgLoss: 6.3674
torch.Size([5000, 250])
Epochs: 281, AvgLoss: 6.3617
torch.Size([5000, 250])
Epochs: 282, AvgLoss: 6.3607
torch.Size([5000, 250])
Epochs: 283, AvgLoss: 6.3432
torch.Size([5000, 250])
Epochs: 284, AvgLoss: 6.3320
torch.Size([5000, 250])
Epochs: 285, AvgLoss: 6.3259
torch.Size([5000, 250])
Epochs: 286, AvgLoss: 6.3251
torch.Size([5000, 250])
Epochs: 287, AvgLoss: 6.3080
torch.Size([5000, 250])
Epochs: 288, AvgLoss: 6.3078
torch.Size([5000, 250])
Epochs: 289, AvgLoss: 6.2969
torch.Size([5000, 250])
Epochs: 290, AvgLoss: 6.2910
torch.Size([5000, 250])
Epochs: 291, AvgLoss: 6.2790
torch.Size([5000, 250])
Epochs: 292, AvgLoss: 6.2763
torch.Size([5000, 250])
Epochs: 293, AvgLoss: 6.2511
torch.Size([5000, 250])
Epochs: 294, AvgLoss: 6.2472
torch.Size([5000, 250])
Epochs: 295, AvgLoss: 6.2397
torch.Size([5000, 250])
Epochs: 296, AvgLoss: 6.2354
torch.Size([5000, 250])
Epochs: 297, AvgLoss: 6.2218
torch.Size([5000, 250])
Epochs: 298, AvgLoss: 6.2201
torch.Size([5000, 250])
Epochs: 299, AvgLoss: 6.2037
torch.Size([5000, 250])
Epochs: 300, AvgLoss: 6.2006
torch.Size([5000, 250])
Epochs: 301, AvgLoss: 6.1892
torch.Size([5000, 250])
Epochs: 302, AvgLoss: 6.1809
torch.Size([5000, 250])
Epochs: 303, AvgLoss: 6.1711
torch.Size([5000, 250])
Epochs: 304, AvgLoss: 6.1722
torch.Size([5000, 250])
Epochs: 305, AvgLoss: 6.1566
torch.Size([5000, 250])
Epochs: 306, AvgLoss: 6.1487
torch.Size([5000, 250])
Epochs: 307, AvgLoss: 6.1544
torch.Size([5000, 250])
Epochs: 308, AvgLoss: 6.1382
torch.Size([5000, 250])
Epochs: 309, AvgLoss: 6.1278
torch.Size([5000, 250])
Epochs: 310, AvgLoss: 6.1196
torch.Size([5000, 250])
Epochs: 311, AvgLoss: 6.1088
torch.Size([5000, 250])
Epochs: 312, AvgLoss: 6.1058
torch.Size([5000, 250])
Epochs: 313, AvgLoss: 6.0992
torch.Size([5000, 250])
Epochs: 314, AvgLoss: 6.0953
torch.Size([5000, 250])
Epochs: 315, AvgLoss: 6.0691
torch.Size([5000, 250])
Epochs: 316, AvgLoss: 6.0690
torch.Size([5000, 250])
Epochs: 317, AvgLoss: 6.0546
torch.Size([5000, 250])
Epochs: 318, AvgLoss: 6.0595
torch.Size([5000, 250])
Epochs: 319, AvgLoss: 6.0577
torch.Size([5000, 250])
Epochs: 320, AvgLoss: 6.0376
torch.Size([5000, 250])
Epochs: 321, AvgLoss: 6.0325
torch.Size([5000, 250])
Epochs: 322, AvgLoss: 6.0271
torch.Size([5000, 250])
Epochs: 323, AvgLoss: 6.0199
torch.Size([5000, 250])
Epochs: 324, AvgLoss: 6.0095
torch.Size([5000, 250])
Epochs: 325, AvgLoss: 5.9991
torch.Size([5000, 250])
Epochs: 326, AvgLoss: 5.9917
torch.Size([5000, 250])
Epochs: 327, AvgLoss: 5.9803
torch.Size([5000, 250])
Epochs: 328, AvgLoss: 5.9801
torch.Size([5000, 250])
Epochs: 329, AvgLoss: 5.9777
torch.Size([5000, 250])
Epochs: 330, AvgLoss: 5.9596
torch.Size([5000, 250])
Epochs: 331, AvgLoss: 5.9539
torch.Size([5000, 250])
Epochs: 332, AvgLoss: 5.9411
torch.Size([5000, 250])
Epochs: 333, AvgLoss: 5.9370
torch.Size([5000, 250])
Epochs: 334, AvgLoss: 5.9232
torch.Size([5000, 250])
Epochs: 335, AvgLoss: 5.9150
torch.Size([5000, 250])
Epochs: 336, AvgLoss: 5.9149
torch.Size([5000, 250])
Epochs: 337, AvgLoss: 5.9066
torch.Size([5000, 250])
Epochs: 338, AvgLoss: 5.8970
torch.Size([5000, 250])
Epochs: 339, AvgLoss: 5.8900
torch.Size([5000, 250])
Epochs: 340, AvgLoss: 5.8967
torch.Size([5000, 250])
Epochs: 341, AvgLoss: 5.8842
torch.Size([5000, 250])
Epochs: 342, AvgLoss: 5.8846
torch.Size([5000, 250])
Epochs: 343, AvgLoss: 5.8715
torch.Size([5000, 250])
Epochs: 344, AvgLoss: 5.8767
torch.Size([5000, 250])
Epochs: 345, AvgLoss: 5.8630
torch.Size([5000, 250])
Epochs: 346, AvgLoss: 5.8655
torch.Size([5000, 250])
Epochs: 347, AvgLoss: 5.8537
torch.Size([5000, 250])
Epochs: 348, AvgLoss: 5.8530
torch.Size([5000, 250])
Epochs: 349, AvgLoss: 5.8544
torch.Size([5000, 250])
Epochs: 350, AvgLoss: 5.8393
torch.Size([5000, 250])
Epochs: 351, AvgLoss: 5.8422
torch.Size([5000, 250])
Epochs: 352, AvgLoss: 5.8397
torch.Size([5000, 250])
Epochs: 353, AvgLoss: 5.8248
torch.Size([5000, 250])
Epochs: 354, AvgLoss: 5.8282
torch.Size([5000, 250])
Epochs: 355, AvgLoss: 5.8257
torch.Size([5000, 250])
Epochs: 356, AvgLoss: 5.8241
torch.Size([5000, 250])
Epochs: 357, AvgLoss: 5.8210
torch.Size([5000, 250])
Epochs: 358, AvgLoss: 5.8199
torch.Size([5000, 250])
Epochs: 359, AvgLoss: 5.8191
torch.Size([5000, 250])
Epochs: 360, AvgLoss: 5.8122
torch.Size([5000, 250])
Epochs: 361, AvgLoss: 5.8144
torch.Size([5000, 250])
Epochs: 362, AvgLoss: 5.8042
torch.Size([5000, 250])
Epochs: 363, AvgLoss: 5.7999
torch.Size([5000, 250])
Epochs: 364, AvgLoss: 5.8030
torch.Size([5000, 250])
Epochs: 365, AvgLoss: 5.8042
torch.Size([5000, 250])
Epochs: 366, AvgLoss: 5.7903
torch.Size([5000, 250])
Epochs: 367, AvgLoss: 5.7872
torch.Size([5000, 250])
Epochs: 368, AvgLoss: 5.7881
torch.Size([5000, 250])
Epochs: 369, AvgLoss: 5.7919
torch.Size([5000, 250])
Epochs: 370, AvgLoss: 5.7887
torch.Size([5000, 250])
Epochs: 371, AvgLoss: 5.7821
torch.Size([5000, 250])
Epochs: 372, AvgLoss: 5.7781
torch.Size([5000, 250])
Epochs: 373, AvgLoss: 5.7807
torch.Size([5000, 250])
Epochs: 374, AvgLoss: 5.7702
torch.Size([5000, 250])
Epochs: 375, AvgLoss: 5.7806
torch.Size([5000, 250])
Epochs: 376, AvgLoss: 5.7725
torch.Size([5000, 250])
Epochs: 377, AvgLoss: 5.7757
torch.Size([5000, 250])
Epochs: 378, AvgLoss: 5.7684
torch.Size([5000, 250])
Epochs: 379, AvgLoss: 5.7656
torch.Size([5000, 250])
Epochs: 380, AvgLoss: 5.7671
torch.Size([5000, 250])
Epochs: 381, AvgLoss: 5.7624
torch.Size([5000, 250])
Epochs: 382, AvgLoss: 5.7633
torch.Size([5000, 250])
Epochs: 383, AvgLoss: 5.7581
torch.Size([5000, 250])
Epochs: 384, AvgLoss: 5.7584
torch.Size([5000, 250])
Epochs: 385, AvgLoss: 5.7561
torch.Size([5000, 250])
Epochs: 386, AvgLoss: 5.7555
torch.Size([5000, 250])
Epochs: 387, AvgLoss: 5.7607
torch.Size([5000, 250])
Epochs: 388, AvgLoss: 5.7535
torch.Size([5000, 250])
Epochs: 389, AvgLoss: 5.7527
torch.Size([5000, 250])
Epochs: 390, AvgLoss: 5.7486
torch.Size([5000, 250])
Epochs: 391, AvgLoss: 5.7500
torch.Size([5000, 250])
Epochs: 392, AvgLoss: 5.7417
torch.Size([5000, 250])
Epochs: 393, AvgLoss: 5.7483
torch.Size([5000, 250])
Epochs: 394, AvgLoss: 5.7449
torch.Size([5000, 250])
Epochs: 395, AvgLoss: 5.7447
torch.Size([5000, 250])
Epochs: 396, AvgLoss: 5.7365
torch.Size([5000, 250])
Epochs: 397, AvgLoss: 5.7339
torch.Size([5000, 250])
Epochs: 398, AvgLoss: 5.7369
torch.Size([5000, 250])
Epochs: 399, AvgLoss: 5.7398
torch.Size([5000, 250])
Epochs: 400, AvgLoss: 5.7340
torch.Size([5000, 250])
Epochs: 401, AvgLoss: 5.7312
torch.Size([5000, 250])
Epochs: 402, AvgLoss: 5.7335
torch.Size([5000, 250])
Epochs: 403, AvgLoss: 5.7323
torch.Size([5000, 250])
Epochs: 404, AvgLoss: 5.7269
torch.Size([5000, 250])
Epochs: 405, AvgLoss: 5.7234
torch.Size([5000, 250])
Epochs: 406, AvgLoss: 5.7245
torch.Size([5000, 250])
Epochs: 407, AvgLoss: 5.7258
torch.Size([5000, 250])
Epochs: 408, AvgLoss: 5.7231
torch.Size([5000, 250])
Epochs: 409, AvgLoss: 5.7184
torch.Size([5000, 250])
Epochs: 410, AvgLoss: 5.7218
torch.Size([5000, 250])
Epochs: 411, AvgLoss: 5.7181
torch.Size([5000, 250])
Epochs: 412, AvgLoss: 5.7167
torch.Size([5000, 250])
Epochs: 413, AvgLoss: 5.7180
torch.Size([5000, 250])
Epochs: 414, AvgLoss: 5.7155
torch.Size([5000, 250])
Epochs: 415, AvgLoss: 5.7115
torch.Size([5000, 250])
Epochs: 416, AvgLoss: 5.7139
torch.Size([5000, 250])
Epochs: 417, AvgLoss: 5.7123
torch.Size([5000, 250])
Epochs: 418, AvgLoss: 5.7106
torch.Size([5000, 250])
Epochs: 419, AvgLoss: 5.7098
torch.Size([5000, 250])
Epochs: 420, AvgLoss: 5.7055
torch.Size([5000, 250])
Epochs: 421, AvgLoss: 5.7087
torch.Size([5000, 250])
Epochs: 422, AvgLoss: 5.7061
torch.Size([5000, 250])
Epochs: 423, AvgLoss: 5.7036
torch.Size([5000, 250])
Epochs: 424, AvgLoss: 5.7048
torch.Size([5000, 250])
Epochs: 425, AvgLoss: 5.7025
torch.Size([5000, 250])
Epochs: 426, AvgLoss: 5.7001
torch.Size([5000, 250])
Epochs: 427, AvgLoss: 5.7011
torch.Size([5000, 250])
Epochs: 428, AvgLoss: 5.7016
torch.Size([5000, 250])
Epochs: 429, AvgLoss: 5.7019
torch.Size([5000, 250])
Epochs: 430, AvgLoss: 5.6953
torch.Size([5000, 250])
Epochs: 431, AvgLoss: 5.6938
torch.Size([5000, 250])
Epochs: 432, AvgLoss: 5.6928
torch.Size([5000, 250])
Epochs: 433, AvgLoss: 5.6954
torch.Size([5000, 250])
Epochs: 434, AvgLoss: 5.6938
torch.Size([5000, 250])
Epochs: 435, AvgLoss: 5.6893
torch.Size([5000, 250])
Epochs: 436, AvgLoss: 5.6941
torch.Size([5000, 250])
Epochs: 437, AvgLoss: 5.6882
torch.Size([5000, 250])
Epochs: 438, AvgLoss: 5.6881
torch.Size([5000, 250])
Epochs: 439, AvgLoss: 5.6853
torch.Size([5000, 250])
Epochs: 440, AvgLoss: 5.6851
torch.Size([5000, 250])
Epochs: 441, AvgLoss: 5.6830
torch.Size([5000, 250])
Epochs: 442, AvgLoss: 5.6849
torch.Size([5000, 250])
Epochs: 443, AvgLoss: 5.6863
torch.Size([5000, 250])
Epochs: 444, AvgLoss: 5.6784
torch.Size([5000, 250])
Epochs: 445, AvgLoss: 5.6813
torch.Size([5000, 250])
Epochs: 446, AvgLoss: 5.6823
torch.Size([5000, 250])
Epochs: 447, AvgLoss: 5.6792
torch.Size([5000, 250])
Epochs: 448, AvgLoss: 5.6781
torch.Size([5000, 250])
Epochs: 449, AvgLoss: 5.6770
torch.Size([5000, 250])
Epochs: 450, AvgLoss: 5.6725
torch.Size([5000, 250])
Epochs: 451, AvgLoss: 5.6759
torch.Size([5000, 250])
Epochs: 452, AvgLoss: 5.6737
torch.Size([5000, 250])
Epochs: 453, AvgLoss: 5.6737
torch.Size([5000, 250])
Epochs: 454, AvgLoss: 5.6734
torch.Size([5000, 250])
Epochs: 455, AvgLoss: 5.6700
torch.Size([5000, 250])
Epochs: 456, AvgLoss: 5.6698
torch.Size([5000, 250])
Epochs: 457, AvgLoss: 5.6717
torch.Size([5000, 250])
Epochs: 458, AvgLoss: 5.6679
torch.Size([5000, 250])
Epochs: 459, AvgLoss: 5.6697
torch.Size([5000, 250])
Epochs: 460, AvgLoss: 5.6688
torch.Size([5000, 250])
Epochs: 461, AvgLoss: 5.6690
torch.Size([5000, 250])
Epochs: 462, AvgLoss: 5.6636
torch.Size([5000, 250])
Epochs: 463, AvgLoss: 5.6641
torch.Size([5000, 250])
Epochs: 464, AvgLoss: 5.6648
torch.Size([5000, 250])
Epochs: 465, AvgLoss: 5.6642
torch.Size([5000, 250])
Epochs: 466, AvgLoss: 5.6627
torch.Size([5000, 250])
Epochs: 467, AvgLoss: 5.6567
torch.Size([5000, 250])
Epochs: 468, AvgLoss: 5.6584
torch.Size([5000, 250])
Epochs: 469, AvgLoss: 5.6567
torch.Size([5000, 250])
Epochs: 470, AvgLoss: 5.6603
torch.Size([5000, 250])
Epochs: 471, AvgLoss: 5.6569
torch.Size([5000, 250])
Epochs: 472, AvgLoss: 5.6552
torch.Size([5000, 250])
Epochs: 473, AvgLoss: 5.6566
torch.Size([5000, 250])
Epochs: 474, AvgLoss: 5.6576
torch.Size([5000, 250])
Epochs: 475, AvgLoss: 5.6538
torch.Size([5000, 250])
Epochs: 476, AvgLoss: 5.6505
torch.Size([5000, 250])
Epochs: 477, AvgLoss: 5.6503
torch.Size([5000, 250])
Epochs: 478, AvgLoss: 5.6545
torch.Size([5000, 250])
Epochs: 479, AvgLoss: 5.6510
torch.Size([5000, 250])
Epochs: 480, AvgLoss: 5.6465
torch.Size([5000, 250])
Epochs: 481, AvgLoss: 5.6468
torch.Size([5000, 250])
Epochs: 482, AvgLoss: 5.6468
torch.Size([5000, 250])
Epochs: 483, AvgLoss: 5.6437
torch.Size([5000, 250])
Epochs: 484, AvgLoss: 5.6455
torch.Size([5000, 250])
Epochs: 485, AvgLoss: 5.6424
torch.Size([5000, 250])
Epochs: 486, AvgLoss: 5.6418
torch.Size([5000, 250])
Epochs: 487, AvgLoss: 5.6397
torch.Size([5000, 250])
Epochs: 488, AvgLoss: 5.6391
torch.Size([5000, 250])
Epochs: 489, AvgLoss: 5.6385
torch.Size([5000, 250])
Epochs: 490, AvgLoss: 5.6374
torch.Size([5000, 250])
Epochs: 491, AvgLoss: 5.6339
torch.Size([5000, 250])
Epochs: 492, AvgLoss: 5.6348
torch.Size([5000, 250])
Epochs: 493, AvgLoss: 5.6342
torch.Size([5000, 250])
Epochs: 494, AvgLoss: 5.6362
torch.Size([5000, 250])
Epochs: 495, AvgLoss: 5.6309
torch.Size([5000, 250])
Epochs: 496, AvgLoss: 5.6321
torch.Size([5000, 250])
Epochs: 497, AvgLoss: 5.6276
torch.Size([5000, 250])
Epochs: 498, AvgLoss: 5.6281
torch.Size([5000, 250])
Epochs: 499, AvgLoss: 5.6303
torch.Size([5000, 250])
Epochs: 500, AvgLoss: 5.6264
torch.Size([5000, 250])
Epochs: 501, AvgLoss: 5.6234
torch.Size([5000, 250])
Epochs: 502, AvgLoss: 5.6263
torch.Size([5000, 250])
Epochs: 503, AvgLoss: 5.6229
torch.Size([5000, 250])
Epochs: 504, AvgLoss: 5.6215
torch.Size([5000, 250])
Epochs: 505, AvgLoss: 5.6213
torch.Size([5000, 250])
Epochs: 506, AvgLoss: 5.6176
torch.Size([5000, 250])
Epochs: 507, AvgLoss: 5.6182
torch.Size([5000, 250])
Epochs: 508, AvgLoss: 5.6155
torch.Size([5000, 250])
Epochs: 509, AvgLoss: 5.6167
torch.Size([5000, 250])
Epochs: 510, AvgLoss: 5.6112
torch.Size([5000, 250])
Epochs: 511, AvgLoss: 5.6153
torch.Size([5000, 250])
Epochs: 512, AvgLoss: 5.6138
torch.Size([5000, 250])
Epochs: 513, AvgLoss: 5.6100
torch.Size([5000, 250])
Epochs: 514, AvgLoss: 5.6103
torch.Size([5000, 250])
Epochs: 515, AvgLoss: 5.6084
torch.Size([5000, 250])
Epochs: 516, AvgLoss: 5.6074
torch.Size([5000, 250])
Epochs: 517, AvgLoss: 5.6075
torch.Size([5000, 250])
Epochs: 518, AvgLoss: 5.6060
torch.Size([5000, 250])
Epochs: 519, AvgLoss: 5.6055
torch.Size([5000, 250])
Epochs: 520, AvgLoss: 5.6042
torch.Size([5000, 250])
Epochs: 521, AvgLoss: 5.6035
torch.Size([5000, 250])
Epochs: 522, AvgLoss: 5.6017
torch.Size([5000, 250])
Epochs: 523, AvgLoss: 5.5981
torch.Size([5000, 250])
Epochs: 524, AvgLoss: 5.5968
torch.Size([5000, 250])
Epochs: 525, AvgLoss: 5.5952
torch.Size([5000, 250])
Epochs: 526, AvgLoss: 5.5951
torch.Size([5000, 250])
Epochs: 527, AvgLoss: 5.5898
torch.Size([5000, 250])
Epochs: 528, AvgLoss: 5.5934
torch.Size([5000, 250])
Epochs: 529, AvgLoss: 5.5900
torch.Size([5000, 250])
Epochs: 530, AvgLoss: 5.5899
torch.Size([5000, 250])
Epochs: 531, AvgLoss: 5.5891
torch.Size([5000, 250])
Epochs: 532, AvgLoss: 5.5887
torch.Size([5000, 250])
Epochs: 533, AvgLoss: 5.5857
torch.Size([5000, 250])
Epochs: 534, AvgLoss: 5.5886
torch.Size([5000, 250])
Epochs: 535, AvgLoss: 5.5785
torch.Size([5000, 250])
Epochs: 536, AvgLoss: 5.5835
torch.Size([5000, 250])
Epochs: 537, AvgLoss: 5.5821
torch.Size([5000, 250])
Epochs: 538, AvgLoss: 5.5768
torch.Size([5000, 250])
Epochs: 539, AvgLoss: 5.5761
torch.Size([5000, 250])
Epochs: 540, AvgLoss: 5.5737
torch.Size([5000, 250])
Epochs: 541, AvgLoss: 5.5730
torch.Size([5000, 250])
Epochs: 542, AvgLoss: 5.5722
torch.Size([5000, 250])
Epochs: 543, AvgLoss: 5.5704
torch.Size([5000, 250])
Epochs: 544, AvgLoss: 5.5701
torch.Size([5000, 250])
Epochs: 545, AvgLoss: 5.5648
torch.Size([5000, 250])
Epochs: 546, AvgLoss: 5.5683
torch.Size([5000, 250])
Epochs: 547, AvgLoss: 5.5653
torch.Size([5000, 250])
Epochs: 548, AvgLoss: 5.5630
torch.Size([5000, 250])
Epochs: 549, AvgLoss: 5.5605
torch.Size([5000, 250])
Epochs: 550, AvgLoss: 5.5600
torch.Size([5000, 250])
Epochs: 551, AvgLoss: 5.5568
torch.Size([5000, 250])
Epochs: 552, AvgLoss: 5.5562
torch.Size([5000, 250])
Epochs: 553, AvgLoss: 5.5560
torch.Size([5000, 250])
Epochs: 554, AvgLoss: 5.5534
torch.Size([5000, 250])
Epochs: 555, AvgLoss: 5.5482
torch.Size([5000, 250])
Epochs: 556, AvgLoss: 5.5485
torch.Size([5000, 250])
Epochs: 557, AvgLoss: 5.5474
torch.Size([5000, 250])
Epochs: 558, AvgLoss: 5.5444
torch.Size([5000, 250])
Epochs: 559, AvgLoss: 5.5406
torch.Size([5000, 250])
Epochs: 560, AvgLoss: 5.5416
torch.Size([5000, 250])
Epochs: 561, AvgLoss: 5.5376
torch.Size([5000, 250])
Epochs: 562, AvgLoss: 5.5396
torch.Size([5000, 250])
Epochs: 563, AvgLoss: 5.5373
torch.Size([5000, 250])
Epochs: 564, AvgLoss: 5.5346
torch.Size([5000, 250])
Epochs: 565, AvgLoss: 5.5347
torch.Size([5000, 250])
Epochs: 566, AvgLoss: 5.5313
torch.Size([5000, 250])
Epochs: 567, AvgLoss: 5.5281
torch.Size([5000, 250])
Epochs: 568, AvgLoss: 5.5276
torch.Size([5000, 250])
Epochs: 569, AvgLoss: 5.5255
torch.Size([5000, 250])
Epochs: 570, AvgLoss: 5.5208
torch.Size([5000, 250])
Epochs: 571, AvgLoss: 5.5183
torch.Size([5000, 250])
Epochs: 572, AvgLoss: 5.5161
torch.Size([5000, 250])
Epochs: 573, AvgLoss: 5.5158
torch.Size([5000, 250])
Epochs: 574, AvgLoss: 5.5181
torch.Size([5000, 250])
Epochs: 575, AvgLoss: 5.5135
torch.Size([5000, 250])
Epochs: 576, AvgLoss: 5.5111
torch.Size([5000, 250])
Epochs: 577, AvgLoss: 5.5092
torch.Size([5000, 250])
Epochs: 578, AvgLoss: 5.5074
torch.Size([5000, 250])
Epochs: 579, AvgLoss: 5.5038
torch.Size([5000, 250])
Epochs: 580, AvgLoss: 5.5013
torch.Size([5000, 250])
Epochs: 581, AvgLoss: 5.4981
torch.Size([5000, 250])
Epochs: 582, AvgLoss: 5.4957
torch.Size([5000, 250])
Epochs: 583, AvgLoss: 5.4946
torch.Size([5000, 250])
Epochs: 584, AvgLoss: 5.4890
torch.Size([5000, 250])
Epochs: 585, AvgLoss: 5.4918
torch.Size([5000, 250])
Epochs: 586, AvgLoss: 5.4846
torch.Size([5000, 250])
Epochs: 587, AvgLoss: 5.4846
torch.Size([5000, 250])
Epochs: 588, AvgLoss: 5.4827
torch.Size([5000, 250])
Epochs: 589, AvgLoss: 5.4773
torch.Size([5000, 250])
Epochs: 590, AvgLoss: 5.4780
torch.Size([5000, 250])
Epochs: 591, AvgLoss: 5.4754
torch.Size([5000, 250])
Epochs: 592, AvgLoss: 5.4715
torch.Size([5000, 250])
Epochs: 593, AvgLoss: 5.4689
torch.Size([5000, 250])
Epochs: 594, AvgLoss: 5.4662
torch.Size([5000, 250])
Epochs: 595, AvgLoss: 5.4622
torch.Size([5000, 250])
Epochs: 596, AvgLoss: 5.4584
torch.Size([5000, 250])
Epochs: 597, AvgLoss: 5.4556
torch.Size([5000, 250])
Epochs: 598, AvgLoss: 5.4564
torch.Size([5000, 250])
Epochs: 599, AvgLoss: 5.4506
torch.Size([5000, 250])
Epochs: 600, AvgLoss: 5.4511
Training for VAE has been done.

Part 3: Showing result

In this final phase, we visualize the outcomes of our analysis by displaying both the time and frequency information for each identified gene cluster. These visualizations help in interpreting the complex dynamics captured by the model and provide insights into the temporal progression and rhythmicity of gene expression within each cluster.

[6]:
show_result(gene_info,trajectory_info)
../_images/tutorial_scRNA-seq_mouse_embryo_blood_11_0.png
../_images/tutorial_scRNA-seq_mouse_embryo_blood_11_1.png
../_images/tutorial_scRNA-seq_mouse_embryo_blood_11_2.png

Only the first eligible cluster’s plots are ploted out. Other clusters’s plots are saved to pdf files.

Note: As the mouse embryo blood dataset have no comparative data so the function of differential frequency genes/peaks can be found in the other datasets’ tutorials.

Part 4: Music sonification

The generated MusicXML files are automatically saved with show_result function and can be directly opened using MuseScore, enabling visualization of gene-specific rhythmic patterns as standard musical notation.

These scores support real-time playback and instrument switching, allowing the same gene rhythm to be rendered with different timbres (e.g., piano) for intuitive auditory comparison. This representation facilitates both visual inspection of rhythmic density and frequency structure, as well as interactive auditory exploration of gene expression dynamics, as demonstrated in the GeneRhythm browser (http://dinglab.rimuhc.ca/generhythm/ ).image.png

Convert the .musicxml to .wav music sound.

This step renders the symbolic musical scores encoded in MusicXML format into waveform audio files. Unlike symbolic notation, WAV files provide a continuous acoustic signal that can be directly played, shared, and further analyzed. The conversion enables auditory inspection of gene-specific rhythmic patterns and facilitates downstream signal-based analyses such as spectral characterization, feature extraction, or comparative acoustic evaluation across conditions.

[7]:
!powershell -NoProfile -Command "ls *.musicxml | % { & 'C:\Program Files\MuseScore 4\bin\MuseScore4.exe' -o ($_.BaseName + '.wav') $_ }"

Convert the .musicxml to .pdf sheet music.

This conversion produces publication-ready sheet music layouts, allowing consistent visual interpretation of the symbolic musical encoding. The PDF format ensures software-independent accessibility and facilitates qualitative comparison of rhythmic and melodic patterns across genes and conditions.

[8]:
!powershell -NoProfile -Command "ls *.musicxml | % { & 'C:\Program Files\MuseScore 4\bin\MuseScore4.exe' -o ($_.BaseName + '.pdf') $_ }"