%matplotlib inline

RBF Kernel hyperparameters

The RBF kernel can be learnable and fine-tuned. It includes number of kernels, and the scale of kernel means. Here we use the Nanostring CosMx data as an example to show how to fine-tune the hyperparameters of RBF kernels.

Import packages & data

import random
import numpy as np
import pandas as pd
import tifffile as tiff
import matplotlib.pyplot as plt 

import Bering as br
# load data
df_spots_all = br.datasets.cosmx_nsclc_he()
df_spots_seg = df_spots_all[df_spots_all['labels'] != 'background'] # foreground nodes
df_spots_unseg = df_spots_all[df_spots_all['labels'] == 'background'] # background nodes

Dense and large RBF kernels

# image-free segmentation
bg = br.BrGraph(df_spots_seg, df_spots_unseg)
br.graphs.BuildWindowGraphs(bg, n_cells_perClass = 4, window_width = 100.0, window_height = 100.0, n_neighbors = 10)
br.graphs.CreateData(bg, batch_size = 16, training_ratio = 0.8)
edge_rbf_start = 0
edge_rbf_stop = 128 
edge_rbf_n_kernels = 64 # the mean of RBF kernel is 0~128, with 64 kernels evenly distributed
edge_rbf_learnable = True # set RBF kernel to be learnable during back propagation
br.train.Training(
    bg,
    edge_rbf_start = edge_rbf_start,
    edge_rbf_stop = edge_rbf_stop,
    edge_rbf_n_kernels = edge_rbf_n_kernels, 
    edge_rbf_learnable = edge_rbf_learnable,
)
Training node classifier:  98%|█████████▊| 49/50 [00:20<00:00,  3.01it/s]
../../../_images/bb4aa0060e2d9aa575fda7c5b25331c8cc2f63da08592ade9407d0629db857fa.png
Training node classifier: 100%|██████████| 50/50 [00:22<00:00,  2.26it/s]
Training edge classifier:  98%|█████████▊| 49/50 [00:23<00:00,  2.08it/s]
../../../_images/597acfc1caf4aac113a827409e415252d314ff1235ba177f9f5d3bae909229bb.png
Training edge classifier: 100%|██████████| 50/50 [00:24<00:00,  2.00it/s]
# randomly select a cell
random_cells = cells = random.sample(bg.segmented.index.values.tolist(), 1)[:3] # 3 random cells
for random_cell in random_cells:
    br.pl.Plot_Segmentation(
        bg, 
        cell_name = random_cell,
        n_neighbors = 10, 
        zoomout_scale = 4,
        use_image = True,
        pos_thresh = 0.6,
        resolution = 0.05,
        num_edges_perSpot = 100,
        min_prob_nodeclf = 0.3,
        n_iters = 20,
    )
../../../_images/d7adc39ca759b54d8ec4b98909e3544d167d58cf5c1982acaba80d4213d1e7a5.png

Dense and small RBF kernels

# image-free segmentation
bg = br.BrGraph(df_spots_seg, df_spots_unseg)
br.graphs.BuildWindowGraphs(bg, n_cells_perClass = 4, window_width = 100.0, window_height = 100.0, n_neighbors = 10)
br.graphs.CreateData(bg, batch_size = 16, training_ratio = 0.8)
edge_rbf_start = 0
edge_rbf_stop = 32 
edge_rbf_n_kernels = 64 # the mean of RBF kernel is 0~128, with 64 kernels evenly distributed
edge_rbf_learnable = True # set RBF kernel to be learnable during back propagation
br.train.Training(
    bg,
    edge_rbf_start = edge_rbf_start,
    edge_rbf_stop = edge_rbf_stop,
    edge_rbf_n_kernels = edge_rbf_n_kernels, 
    edge_rbf_learnable = edge_rbf_learnable,
)
Training node classifier:  98%|█████████▊| 49/50 [00:18<00:00,  3.14it/s]
../../../_images/693f6792c089f4a225182061f408d60d6e3ed453070953a658b0ce96a8b7408f.png
Training node classifier: 100%|██████████| 50/50 [00:20<00:00,  2.46it/s]
Training edge classifier:  98%|█████████▊| 49/50 [00:22<00:00,  2.29it/s]
../../../_images/66018f9d0822c26dca93ebe06fd2eefaafe10393a1f99b074126734e852b2f08.png
Training edge classifier: 100%|██████████| 50/50 [00:24<00:00,  2.05it/s]
for random_cell in random_cells:
    br.pl.Plot_Segmentation(
        bg, 
        cell_name = random_cell,
        n_neighbors = 10, 
        zoomout_scale = 4,
        use_image = True,
        pos_thresh = 0.6,
        resolution = 0.05,
        num_edges_perSpot = 100,
        min_prob_nodeclf = 0.3,
        n_iters = 20,
    )
../../../_images/674737b79083e6a5d2e9b1f3e3584104f6684cdebff10869d7fd610ec6cc9ab1.png

Shallow and small RBF kernels

# image-free segmentation
bg = br.BrGraph(df_spots_seg, df_spots_unseg)
br.graphs.BuildWindowGraphs(bg, n_cells_perClass = 4, window_width = 100.0, window_height = 100.0, n_neighbors = 10)
br.graphs.CreateData(bg, batch_size = 16, training_ratio = 0.8)
edge_rbf_start = 0
edge_rbf_stop = 32 
edge_rbf_n_kernels = 8 # the mean of RBF kernel is 0~128, with 64 kernels evenly distributed
edge_rbf_learnable = True # set RBF kernel to be learnable during back propagation
br.train.Training(
    bg,
    edge_rbf_start = edge_rbf_start,
    edge_rbf_stop = edge_rbf_stop,
    edge_rbf_n_kernels = edge_rbf_n_kernels, 
    edge_rbf_learnable = edge_rbf_learnable,
)
Training node classifier:  98%|█████████▊| 49/50 [00:20<00:00,  2.92it/s]
../../../_images/7d35be428bd548e485c9eaca3f3e705e3be437ba5620bb4bad8419cf5810959a.png
Training node classifier: 100%|██████████| 50/50 [00:21<00:00,  2.31it/s]
Training edge classifier:  98%|█████████▊| 49/50 [00:23<00:00,  2.29it/s]
../../../_images/a18b03cc09062a61377263d7ed9516baf9ec5f18cb49cac22eb58c3c2e167dfa.png
Training edge classifier: 100%|██████████| 50/50 [00:25<00:00,  1.95it/s]
for random_cell in random_cells:
    br.pl.Plot_Segmentation(
        bg, 
        cell_name = random_cell,
        n_neighbors = 10, 
        zoomout_scale = 4,
        use_image = True,
        pos_thresh = 0.6,
        resolution = 0.05,
        num_edges_perSpot = 100,
        min_prob_nodeclf = 0.3,
        n_iters = 20,
    )
../../../_images/9fe4ebc217a9ca4fd5bec84d9380e6b8cfc1086583f8d45a62a34eab19b4d154.png