%matplotlib inline

Convolutional Neural Network hyperparameters for image embeddings

In Bering model, image embeddings are learned from CNN models and used to capture cell boundary information from staining images, such as DAPI and membrane staining. The hyperparameters of CNN, such as number of CNN layers, and the layer sizes, may impact the model performance. In this tutorial, we use Nanostring CosMx data as an example to show the influences of CNN model structures.

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_seg = pd.read_csv('/data/aronow/Kang/spatial/Bering/demo/bm2_cosmx_nsclc/spots_seg.txt', sep='\t', header=0, index_col=0)
df_spots_unseg = pd.read_csv('/data/aronow/Kang/spatial/Bering/demo/bm2_cosmx_nsclc/spots_unseg.txt', sep='\t', header=0, index_col=0)

img = tiff.imread('image.tif')
channels = ['Nuclei', 'PanCK', 'Membrane']

shallow image encoder

bg = br.BrGraph(df_spots_seg, df_spots_unseg, image = img, channels = channels)
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_image_conv2d_hidden_dims = [6, 256]
edge_image_mlp_hidden_dims = [32, 64]
br.train.Training(
    bg,
    edge_image_conv2d_hidden_dims = edge_image_conv2d_hidden_dims,
    edge_image_mlp_hidden_dims = edge_image_mlp_hidden_dims,
)
Training node classifier:  98%|█████████▊| 49/50 [00:22<00:00,  2.83it/s]
../../../_images/b52bed41a167ba152951839dc6c4e525ddf01c6cf8cf5810ac96f3b9147d95d3.png
Training node classifier: 100%|██████████| 50/50 [00:23<00:00,  2.11it/s]
Training edge classifier:  98%|█████████▊| 49/50 [35:57<00:42, 42.12s/it]
../../../_images/626a749282c135b82a01b0d5764f02a27e70b09aa7eeff9a368fd09478899221.png
Training edge classifier: 100%|██████████| 50/50 [36:53<00:00, 44.28s/it]
# plot cell segmentation
random_cell = cells = random.sample(bg.segmented.index.values.tolist(), 1)[0]
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/fb60452df0aa3d3b4eb4b34584b1b1652019a421e8531c7adc59d1cc77f21f2e.png ../../../_images/fb60452df0aa3d3b4eb4b34584b1b1652019a421e8531c7adc59d1cc77f21f2e.png

deep image encoder

bg = br.BrGraph(df_spots_seg, df_spots_unseg, image = img, channels = channels)
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_image_conv2d_hidden_dims = [6, 32, 64, 128, 256]
edge_image_mlp_hidden_dims = [32, 64]
br.train.Training(
    bg,
    edge_image_conv2d_hidden_dims = edge_image_conv2d_hidden_dims,
    edge_image_mlp_hidden_dims = edge_image_mlp_hidden_dims,
)
Training node classifier:  98%|█████████▊| 49/50 [00:20<00:00,  2.88it/s]
../../../_images/d71b253b358d8f54adf82280fa5d9defd7dc006b9b83444bc5a1112537bec569.png
Training node classifier: 100%|██████████| 50/50 [00:22<00:00,  2.25it/s]
Training edge classifier:  98%|█████████▊| 49/50 [36:48<00:43, 43.92s/it]
../../../_images/1295f9ee42af5a0aec430651d354e845f973b18773a3b4a1510e7e4e4e353020.png
Training edge classifier: 100%|██████████| 50/50 [37:46<00:00, 45.33s/it]
# plot cell segmentation
random_cell = cells = random.sample(bg.segmented.index.values.tolist(), 1)[0]
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/3865a29d29052359f07ec33e8c70952e8a29529c8666d4084f24017896edad6e.png ../../../_images/3865a29d29052359f07ec33e8c70952e8a29529c8666d4084f24017896edad6e.png