Deep Learning Models: VGG16, ResNet, DenseNet & CNNs, Cheat Sheet of Medical imaging

An overview of several deep learning models, including vgg16, resnet, densenet, and inception. It details the architecture and key features of each model, such as the number of layers, connectivity patterns, and specific techniques used to improve performance. The document also includes a code snippet that defines a function for generating augmented versions of medical image data, which is used for training deep learning models. The code performs image processing steps such as resizing, padding, and creating multi-channel projections. Additionally, the document outlines the structure and training process of a convolutional neural network (cnn) model for volume regression, including the use of residual blocks, regularization techniques, and early stopping.

Typology: Cheat Sheet

2023/2024

Uploaded on 08/06/2025

norma-rosales-7
norma-rosales-7 🇺🇸

1 document

1 / 23

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
Modelos:
VGG 16
o16 layers: weights and biases
are learned.
o13 Conv layers + 3 FC
oThe input to the Cov1 layer is
of a fixed size of 224 x 224
RGB image.
oThe final layer is the softmax
layer.
oAll hidden layers are
equipped with rectification (ReLU) non-linearity.
ResNet
oSolves for
vanishing
gradient, the
gradients can flow directly through the skip connections
backwards from later layers to initial filters.
DenseNet
oConvolutional neural
network where each
layer is connected to
all other layers that
are deeper in the
network, that is, the
first layer is
connected to the 2nd,
3rd, 4th and so on, the second layer is connected to the 3rd,
4th, 5th and so on.
Inception
oConsists of repeating
blocks where the
output of a block act
as an input to the next block.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17

Partial preview of the text

Download Deep Learning Models: VGG16, ResNet, DenseNet & CNNs and more Cheat Sheet Medical imaging in PDF only on Docsity!

Modelos:

 VGG 16

o 16 layers: weights and biases

are learned.

o 13 Conv layers + 3 FC

o The input to the Cov1 layer is

of a fixed size of 224 x 224

RGB image.

o The final layer is the softmax

layer.

o All hidden layers are

equipped with rectification (ReLU) non-linearity.

 ResNet

o Solves for

vanishing

gradient, the

gradients can flow directly through the skip connections

backwards from later layers to initial filters.

 DenseNet

o Convolutional neural

network where each

layer is connected to

all other layers that

are deeper in the

network, that is, the

first layer is

connected to the 2nd,

3rd, 4th and so on, the second layer is connected to the 3rd,

4th, 5th and so on.

 Inception

o Consists of repeating

blocks where the

output of a block act

as an input to the next block.

o Este modelo aumenta el número de parámetros entrenables

y la computación requerida, pero mejora considerablemente

la precisión.

o Estos actúan como múltiples filtros aplicados a un mismo

valor de entrada mediante capas convolucionales y de

pooling. Esto permite sacar provecho de la extracción de

patrones que brindan diferentes tama nos en los filtros.

Luego, el resultado de estos filtros es concatenado y

utilizado como el valor de salida del módulo.

Código completo:

what does this code do? def create_threechannel(mask): print(i) lung = nib.load(mask).get_fdata().astype('uint8') idno = mask.split('/')[-1].split('lungseg') [0] scan = nib.load(glob.glob(lidc_scans_path +idno+'/.nii.gz') [0]).get_fdata().astype('float') print(idno) reso = [float(resolutions[mask][0]), float(resolutions[mask][2])] lung[lung>0] = 1 shp = np.round(max_mm/np.array([reso[0],reso[0],reso[1]]))-np.shape(lung) try: for j in range(5): print(j) options = np.random.uniform(0,1,6) lung2 = lung.copy() scan2 = scan.copy() if options[0]>0.5: lung2 = lung2[::-1,:,:] scan2 = scan2[::-1,:,:] xtranslate, ytranslate, ztranslate = options[1:4] arrz = np.shape(lung)[2] top_slice = np.argmax(np.max(lung,axis=(0,1))>0) bottom_slice = np.argmax(np.max(lung[:,:,::-1],axis=(0,1))>0) arrz = np.shape(lung)[2]- bottom_slice-top_slice lung2[:,:,:top_slice + int(np.round((0.20+0.20options[4])arrz))] = 0 lung2[:,:,-bottom_slice - int(np.round((0.15options[5])arrz)):] = 0 scan2[:,:,:top_slice + int(np.round((0.20+0.20options[4])arrz))] = -1024 scan2[:,:,-bottom_slice - int(np.round((0.15options[5])arrz)):] = -1024 lung2 = np.pad(lung2, ((int(np.floor(shp[0]xtranslate)),int(np.ceil(shp[0](1-xtranslate)))), (int(np.floor(shp[1]ytranslate)),int(np.ceil(shp[1](1-ytranslate)))), (int(np.floor(shp[2]ztranslate)),int(np.ceil(shp[2](1-ztranslate)))))) scan2 = np.pad(scan2,((int(np.floor(shp[0]xtranslate)),int(np.ceil(shp[0](1-xtranslate)))), (int(np.floor(shp[1]ytranslate)),int(np.ceil(shp[1](1-ytranslate)))), (int(np.floor(shp[2]ztranslate)),int(np.ceil(shp[2]*(1-ztranslate))))), mode='constant',constant_values=-1024.0) lung2 = scipy.ndimage.zoom(lung2, (224/np.shape(lung2)[0],224/np.shape(lung2)[1],224/np.shape(lung2)[2]),order=0) scan2 = scipy.ndimage.zoom(scan2,(224/np.shape(scan2)[0],224/np.shape(scan2) [1],224/np.shape(scan2)[2]),order=1) for k,view in enumerate(['sagittal','coronal','axial']): silhouette = np.sum(lung2,axis=k)/224. mip = np.max(scan2,axis=k) mip = (np.clip(mip,-1024,1024)+1024)/2048. lungavg = scan2.copy() lungavg[lung2==0]=np.nan lungavg = np.nanmean(lungavg,axis=k) lungavg = np.nan_to_num(lungavg,nan=-1024) lungavg = (np.clip(lungavg,-1024,0)+1024)/1024 img = np.stack((silhouette,mip,lungavg),axis=-1).astype('float32') tifffile.imwrite(save_projection_path + idno + '' + str(j) + '_' + view + '.tif',img,photometric='rgb') except Exception as e: print('%s Excepted: %s' % (str(idno),str(e))) pass This code defines a function called create_threechannel that takes in a file path to a mask and does the following:

  1. Reads the mask file and loads it as a NumPy array of type uint.
  2. Extracts the ID number from the mask file path.
  3. Loads the corresponding scan data from a NIfTI file in a specified directory.
  4. Calculates the resolution of the scan.
  5. Sets all non-zero values in the mask to 1.
  6. Generates 5 augmented versions of the mask and corresponding scan data using random translations, flips, and cropping.

tf.keras.layers.MaxPool2D(3,padding='same',name='mp2')(x1) x1 = resblock(x1,3,64,kr,'block3') x1 = tf.keras.layers.MaxPool2D(3,padding='same',name='mp3')(x1) x1 = resblock(x1,3,128,kr,'block4') x1 = tf.keras.layers.MaxPool2D(3,padding='same',name='mp4')(x1) x1 = resblock(x1,3,256,kr,'block5') x1 = tf.keras.layers.GlobalAveragePooling2D(name='gap')(x1) return x1 def get_model(l2,l1): l2_weight = l2 l1_weight = l1 kr = tf.keras.regularizers.l1_l2(l1=l1_weight, l2=l2_weight) # inputs_sag = tf.keras.Input(shape=(224,224,1)) # inputs_cor = tf.keras.Input(shape=(224,224,1)) # inputs_ax = tf.keras.Input(shape=(224,224,1)) inputs = tf.keras.Input(shape=(224,224,3),name='input') inputs = tf.cast(inputs,dtype='float32') x = conv_net(inputs,kr) x = tf.keras.layers.Dense(256,activation='relu',kernel_regularizer = kr,name='dense1') (x) x = tf.keras.layers.Dense(128,activation='relu',kernel_regularizer = kr,name='dense2')(x) x = tf.keras.layers.Dense(1,activation='linear',kernel_regularizer = kr,name='dense3') (x) # summarize the model model = keras.Model(inputs=inputs,outputs=x) model.summary() return model def trainup(train_x,train_y,dev_x,dev_y,epoch_num,lr,l2,l1,beta,version_name): tf.random.set_seed(42) l2_weight = l2 l1_weight = l1 model = get_model(l2_weight,l1_weight) model.compile(optimizer=keras.optimizers.Adam(learning_rate=lr,beta_1=beta), loss=keras.losses.MeanSquaredError(), metrics=['mean_squared_error']) checkpoint_filepath = '/DATA_SSD/process_AW/test_run_LIDC/' + version_name + '' + str(epoch_num) + '' + str(lr).replace('.','p') + '' + str(l2).replace('.','p') + ''

  • str(l1).replace('.','p') + '/' model_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint( # filepath=checkpoint_filepath + 'epoch_{epoch:03d}', filepath=checkpoint_filepath, save_weights_only=True, monitor='val_mean_squared_error', mode='min', save_best_only=True, verbose=1) early_stopping_callback = tf.keras.callbacks.EarlyStopping( monitor="val_mean_squared_error", min_delta=0, patience=25, verbose=0, mode="auto", baseline=None, restore_best_weights=True) params = np.array([epoch_num, lr, l2, beta, l1]) model_history = model.fit(train_x,train_y, validation_data=(dev_x,dev_y), epochs=epoch_num, batch_size = 300, verbose=1, callbacks = [model_checkpoint_callback, early_stopping_callback], shuffle=True) model.save(checkpoint_filepath + 'final_model') f = open(checkpoint_filepath + 'model_history.pckl', 'wb') pickle.dump(model_history.history, f) f.close return model, model_history, params models = [] hists = [] params_lists = [] lrs = 10np.random.uniform(-6,-4,(20)) l2s = 10np.random.uniform(-4,-1,(20)) for run in range(1): lr = lrs[run] l2 = l2s[run] l1 = 0 beta = 0.9 epochs = 150 print('LR: %.5e | L2: %.5e | L1: %.5e' % (lr,l2,l1)) version_name = 'LIDC_corCNN' model, model_hist,params = trainup(train_images,train_y,dev_images,dev_y,epochs,lr,l2,l1,beta,version_name) models.append(model) hists.append(model_hist) params_lists.append(params) tf.keras.backend.clear_session() min_losses = [] plt.figure() for hist,name in zip(hists,params_lists): plt.plot(np.arange(1,len(hist.history['mean_squared_error']) +1),hist.history['mean_squared_error']) plt.plot(np.arange(1,len(hist.history['val_mean_squared_error']) +1),hist.history['val_mean_squared_error']) print('Best epoch: %d | Minimum MSE: %.5f' % (np.argmin(hist.history['val_mean_squared_error']),np.min(hist.history['val_mean_s quared_error']))) print(name) plt.ylim((0,1)) plt.show() min_losses.append(np.min(hist.history['val_mean_squared_error'])) np.argmin(min_losses) from scipy import stats train_preds = models[np.argmin(min_losses)].predict(train_images) dev_preds = models[np.argmin(min_losses)].predict(dev_images) test_preds =

models[np.argmin(min_losses)].predict(test_images) print(np.mean(train_preds- np.expand_dims(np.array(train_y),axis=-1))) print(np.std(train_preds- np.expand_dims(np.array(train_y),axis=-1))) print(np.mean(dev_preds- np.expand_dims(np.array(dev_y),axis=-1))) print(np.std(dev_preds- np.expand_dims(np.array(dev_y),axis=-1))) print(np.mean(test_preds- np.expand_dims(np.array(test_y),axis=-1))) print(np.std(test_preds- np.expand_dims(np.array(test_y),axis=-1))) print(stats.pearsonr(test_preds.flatten(),np.array(test_y))[0]2) plt.figure() plt.scatter(test_preds,np.expand_dims(np.array(test_y),axis=-1),s=1) plt.show() Notebook FOR_STUDENTS_LIDC_create_input: import glob import nibabel as nib import scipy from scipy import io, ndimage import numpy as np import matplotlib.pyplot as plt from concurrent import futures from concurrent.futures import ThreadPoolExecutor # import tensorflow as tf # from tensorflow import keras, random, config import pickle from PIL import Image import os import zipfile import pydicom lidc_scans_path = '/DATA_SSD/process_AW/LIDC_Nifty/' lidc_in = glob.glob('/DATA_SSD/process_AW/LIDC_Nifty//.nii.gz') lidc_masks = glob.glob('/DATA_SSD/process_AW/LIDC_lung_mask/.nii.gz') pickle_dir = "/DATA_SSD/process_AW/" # load the volumes dictionary with open(os.path.join(pickle_dir, "LIDC_volumes.pckl"), "rb") as f: volumes = pickle.load(f) # load the resolutions dictionary with open(os.path.join(pickle_dir, "LIDC_resolutions.pckl"), "rb") as f: resolutions = pickle.load(f) # load the array sizes dictionary with open(os.path.join(pickle_dir, "LIDC_array_sizes.pckl"), "rb") as f: array_sizes = pickle.load(f) volumes_arr = np.array(list(volumes.values())) reso_arr = np.array(list(resolutions.values())) size_arr = np.array(list(array_sizes.values())) physical_size = reso_arrsize_arr max_mm = np.max(physical_size,axis=0) import tifffile save_projection_path = '/DATA_SSD/process_AW/LIDC_input_images/' if not os.path.isdir(save_projection_path): os.mkdir(save_projection_path) def create_threechannel(mask): print(i) lung = nib.load(mask).get_fdata().astype('uint8') idno = mask.split('/')[-1].split('_lungseg') [0] scan = nib.load(glob.glob(lidc_scans_path +idno+'/.nii.gz') [0]).get_fdata().astype('float') print(idno) reso = [float(resolutions[mask][0]), float(resolutions[mask][2])] lung[lung>0] = 1 shp = np.round(max_mm/np.array([reso[0],reso[0],reso[1]]))-np.shape(lung) try: for j in range(5): print(j) options = np.random.uniform(0,1,6) lung2 = lung.copy() scan2 = scan.copy() if options[0]>0.5: lung2 = lung2[::-1,:,:] scan2 = scan2[::-1,:,:] xtranslate, ytranslate, ztranslate = options[1:4] arrz = np.shape(lung)[2] top_slice = np.argmax(np.max(lung,axis=(0,1))>0) bottom_slice = np.argmax(np.max(lung[:,:,::-1],axis=(0,1))>0) arrz = np.shape(lung)[2]- bottom_slice-top_slice lung2[:,:,:top_slice + int(np.round((0.20+0.20options[4])arrz))] = 0 lung2[:,:,-bottom_slice - int(np.round((0.15options[5])arrz)):] = 0 scan2[:,:,:top_slice + int(np.round((0.20+0.20options[4])arrz))] = -1024 scan2[:,:,-bottom_slice - int(np.round((0.15options[5])arrz)):] = -1024 lung2 = np.pad(lung2, ((int(np.floor(shp[0]xtranslate)),int(np.ceil(shp[0](1-xtranslate)))), (int(np.floor(shp[1]ytranslate)),int(np.ceil(shp[1](1-ytranslate)))), (int(np.floor(shp[2]ztranslate)),int(np.ceil(shp[2](1-ztranslate)))))) scan2 = np.pad(scan2,((int(np.floor(shp[0]xtranslate)),int(np.ceil(shp[0](1-xtranslate)))), (int(np.floor(shp[1]ytranslate)),int(np.ceil(shp[1](1-ytranslate)))), (int(np.floor(shp[2]ztranslate)),int(np.ceil(shp[2]*(1-ztranslate))))), mode='constant',constant_values=-1024.0) lung2 = scipy.ndimage.zoom(lung2, (224/np.shape(lung2)[0],224/np.shape(lung2)[1],224/np.shape(lung2)[2]),order=0) scan2 = scipy.ndimage.zoom(scan2,(224/np.shape(scan2)[0],224/np.shape(scan2) [1],224/np.shape(scan2)[2]),order=1) for k,view in enumerate(['sagittal','coronal','axial']): silhouette = np.sum(lung2,axis=k)/224. mip = np.max(scan2,axis=k) mip = (np.clip(mip,-1024,1024)+1024)/2048. lungavg = scan2.copy() lungavg[lung2==0]=np.nan lungavg = np.nanmean(lungavg,axis=k) lungavg = np.nan_to_num(lungavg,nan=-1024) lungavg = (np.clip(lungavg,-1024,0)+1024)/1024 img =

import matplotlib.pyplot as plt import json import sklearn from sklearn import model_selection from PIL import Image import pickle synthetic_data_path = '/DATA_SSD/process_AW/SPIROMICS_V1_lungmask_projections/MESA_CAC_Ex5_3Ap r2022/' gpus = tf.config.experimental.list_physical_devices('GPU') print(tf.version) if gpus: try: # Currently, memory growth needs to be the same across GPUs for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) tf.config.experimental.set_visible_devices(gpus[0], 'GPU') # GPU index! logical_gpus = tf.config.experimental.list_logical_devices('GPU') print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs") except RuntimeError as e: # Memory growth must be set before GPUs have been initialized print(e) f = open(synthetic_data_path + 'MESA_Ex5_training_data.pckl','rb') train_data = pickle.load(f) f.close() f = open(synthetic_data_path + 'MESA_Ex5_validation_data.pckl','rb') val_data = pickle.load(f) f.close() f = open(synthetic_data_path + 'MESA_Ex5_test_data.pckl','rb') test_data = pickle.load(f) f.close() def resblock(x,kernelsize,filters,kr,nm): x = tf.keras.layers.Conv2D(filters, kernelsize, padding='same',kernel_regularizer=kr,name=nm+'_conv1')(x) x = tf.keras.layers.BatchNormalization(name=nm+'_bn1')(x) x = tf.keras.layers.ReLU(name=nm+'_relu1')(x) fx = x x = tf.keras.layers.Conv2D(filters, kernelsize, padding='same',kernel_regularizer=kr,name=nm+'_conv2')(x) x = tf.keras.layers.BatchNormalization(name=nm+'_bn2')(x) x = tf.keras.layers.ReLU(name=nm+'_relu2')(x) x = tf.keras.layers.Conv2D(filters, kernelsize, padding='same',kernel_regularizer=kr,name=nm+'_conv3')(x) x = tf.keras.layers.BatchNormalization(name=nm+'_bn3')(x) out = tf.keras.layers.Add(name=nm+'_add')([x,fx]) out = tf.keras.layers.ReLU(name=nm+'_relu3')(out) return out def conv_net(x1,kr): x1 = resblock(x1,5,32,kr,'block1') x1 = tf.keras.layers.MaxPool2D(3,padding='same',name='mp1')(x1) x1 = resblock(x1,5,64,kr,'block2') x1 = tf.keras.layers.MaxPool2D(3,padding='same',name='mp2')(x1) x1 = resblock(x1,3,64,kr,'block3') x1 = tf.keras.layers.MaxPool2D(3,padding='same',name='mp3')(x1) x1 = resblock(x1,3,128,kr,'block4') x1 = tf.keras.layers.MaxPool2D(3,padding='same',name='mp4')(x1) x1 = resblock(x1,3,256,kr,'block5') x1 = tf.keras.layers.GlobalAveragePooling2D(name='gap')(x1) return x1 def get_model(l2,l1): l2_weight = l2 l1_weight = l1 kr = tf.keras.regularizers.l1_l2(l1=l1_weight, l2=l2_weight) # inputs_sag = tf.keras.Input(shape=(224,224,1)) # inputs_cor = tf.keras.Input(shape=(224,224,1)) # inputs_ax = tf.keras.Input(shape=(224,224,1)) inputs = tf.keras.Input(shape=(224,224,3),name='input') inputs = tf.cast(inputs,dtype='float32') inp1 = tf.keras.layers.Lambda(lambda x: x[:,:,:,0]/224.0)(inputs) inp1 = tf.expand_dims(inp1,axis=-1) inp2 = tf.keras.layers.Lambda(lambda x: x[:,:,:,1]/2048)(inputs) inp2 = tf.expand_dims(inp2,axis=-1) inp3 = tf.keras.layers.Lambda(lambda x: x[:,:,:,2]/1024)(inputs) inp3 = tf.expand_dims(inp3,axis=-1) # inputs = tf.keras.layers.Concatenate([inp1,inp2,inp3],axis=-1) pass_inputs = tf.keras.layers.Concatenate(axis=-1)([inp1,inp2,inp3]) x = conv_net(pass_inputs,kr) x = tf.keras.layers.Dense(256,activation='relu',kernel_regularizer = kr,name='dense1')(x) x = tf.keras.layers.Dense(128,activation='relu',kernel_regularizer = kr,name='dense2') (x) x = tf.keras.layers.Dense(1,activation='linear',kernel_regularizer = kr,name='dense3')(x) # summarize the model model = keras.Model(inputs=inputs,outputs=x) model.summary() return model def get_bottleneck(l2,l1): l2_weight = l2 l1_weight = l1 kr = tf.keras.regularizers.l1_l2(l1=l1_weight, l2=l2_weight) # inputs_sag = tf.keras.Input(shape=(224,224,1)) # inputs_cor =

tf.keras.Input(shape=(224,224,1)) # inputs_ax = tf.keras.Input(shape=(224,224,1)) inputs = tf.keras.Input(shape=(224,224,3),name='input') inputs = tf.cast(inputs,dtype='float32') x_out = conv_net(inputs,kr) x = tf.keras.layers.Dense(256,activation='relu',kernel_regularizer = kr,name='dense1') (x_out) x = tf.keras.layers.Dense(128,activation='relu',kernel_regularizer = kr,name='dense2')(x) x = tf.keras.layers.Dense(1,activation='linear',kernel_regularizer = kr,name='dense3') (x) # summarize the model model = keras.Model(inputs=inputs,outputs=x_out) model.summary() return model def retrieve_data_oneset(dataset): paths = [] y = [] for point in dataset: print(point) idno = point[0] volume = point[1] for i in range(10): paths.append(synthetic_data_path + idno + '' + str(i) + '' + view + '.tif') y.append(volume) images = [tifffile.imread(path) for path in paths] images = np.stack(images,axis=0) y = np.stack(y,axis=0) return images, y def retrieve_data(view): train_images, train_y = retrieve_data_oneset(train_data) dev_images, dev_y = retrieve_data_oneset(val_data) test_images, test_y = retrieve_data_oneset(test_data) return train_images, dev_images, test_images, train_paths, dev_paths, test_paths, train_y, dev_y, test_y best_sag = '/'.join(dirx_sag[int(np.argmin(np.array(min_sag)[:,0]))].split('/')[:-1]) #.split('model')[0]+'') print(best_sag) /DATA_SSD/process_AW/volume_estimation/25Apr2022_sagCNN_v7_256out_150_ p549414370110902e-05_0p00011385689053732937_0 model = get_model(0,0) model.load_weights(best_sag + '/') train_preds = model.predict(train_images) dev_preds = model.predict(dev_images) test_preds = model.predict(test_images) np.mean((dev_preds-np.expand_dims(np.array(dev_y)/1e6,axis=-1))*2) plt.figure() plt.scatter(dev_preds,np.array(dev_y)/1e6,s=1) dev_preds.T- np.array(dev_y)/1e6 plt.figure() plt.hist((dev_preds.T-np.array(dev_y)/1e6)[0]) plt.show() x = dev_preds.T-dev_y/1e6 print(np.mean(np.abs(x))) print(np.mean(x)) print(np.std(x)) md = get_bottleneck(0,0) md.load_weights(best_sag + '/') sag_bottle_train = md.predict(train_images) sag_bottle_dev = md.predict(dev_images) sag_bottle_test = md.predict(test_images) import sklearn from sklearn import decomposition pc = sklearn.decomposition.PCA(n_components=2) pc.fit(sag_bottle_train) pc.explained_variance_ratio_ sag_pc = pc.transform(sag_bottle_train) plt.figure() plt.scatter(sag_pc[:,0],sag_pc[:,1],s=1,c=train_y) plt.show() sag_pc_test = pc.transform(sag_bottle_test) plt.figure() plt.scatter(sag_pc_test[:,0],sag_pc_test[:,1],s=1,c=test_y) plt.show() best_cor = '/'.join(dirx_cor[int(np.argmin(np.array(min_cor)[:,0]))].split('/')[:-1]) print(best_cor) train_images, dev_images, test_images, train_paths, dev_paths, test_paths, train_y, dev_y, test_y = retrieve_data('coronal') model_cor = get_model(0,0) model_cor.load_weights(best_cor + '/') train_preds_cor = model_cor.predict(train_images) dev_preds_cor = model_cor.predict(dev_images) test_preds_cor = model_cor.predict(test_images) print(np.std(test_preds_cor.T- test_y/1e6)) print(np.mean(test_preds_cor.T-test_y/1e6)) md_cor = get_bottleneck(0,0) md_cor.load_weights(best_cor+ '/') cor_bottle_train = md_cor.predict(train_images) cor_bottle_dev = md_cor.predict(dev_images) cor_bottle_test = md_cor.predict(test_images) pc_cor = sklearn.decomposition.PCA(n_components=2) pc_cor.fit(cor_bottle_train) print(pc_cor.explained_variance_ratio_) cor_pc = pc.transform(cor_bottle_train) plt.figure() plt.scatter(cor_pc[:,0],cor_pc[:,1],s=1,c=train_y) plt.show() best_ax = '/'.join(dirx_ax[int(np.argmin(np.array(min_ax)[:,0]))].split('/')[:-1]) print(best_ax) train_images, dev_images, test_images, train_paths, dev_paths, test_paths, train_y, dev_y, test_y = retrieve_data('axial') model_ax = get_model(0,0) model_ax.load_weights(best_ax + '/') pc_ax = sklearn.decomposition.PCA(n_components=2) pc_ax.fit(ax_bottle_train) print(pc_ax.explained_variance_ratio_) ax_pc = pc.transform(ax_bottle_train) plt.figure() plt.scatter(ax_pc[:,0],ax_pc[:,1],s=1,c=train_y) plt.show() version_name = '25Apr2022_sagCNN_v7_256out' f = open(base_path + version_name + '_bottleneck_512_train.pckl', 'wb') pickle.dump(sag_bottle_train, f) f.close f =

v8Dec x = tf.keras.layers.Dense(128,activation='relu',kernel_regularizer = kr)(x) x = tf.keras.layers.Dense(1,activation='linear',kernel_regularizer = kr)(x) #x = Dense(2,activation='softmax')(x) # summarize the model model = keras.Model(inputs=inputs,outputs=x) model.summary() return model def trainup(train_x,train_y,dev_x,dev_y,epoch_num,lr,l2,l1,beta,version_name): tf.random.set_seed(42) l2_weight = l2 l1_weight = l1 model = get_model(l2_weight,l1_weight) model.compile(optimizer=keras.optimizers.Adam(learning_rate=lr,beta_1=beta), loss=keras.losses.MeanSquaredError(), metrics=['mean_squared_error']) checkpoint_filepath = base_path + version_name + '' + str(epoch_num) + '' + str(lr).replace('.','p') + '' + str(l2).replace('.','p') + '' + str(l1).replace('.','p') + '/' model_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint( filepath=checkpoint_filepath, save_weights_only=True, monitor='val_mean_squared_error', mode='min', save_best_only=True) early_stopping_callback = tf.keras.callbacks.EarlyStopping( monitor="val_mean_squared_error", min_delta=0, patience=100, verbose=0, mode="auto", baseline=None, restore_best_weights=True) params = np.array([epoch_num, lr, l2, beta, l1]) model_history = model.fit(train_x,train_y/1e6, validation_data=(dev_x,dev_y/1e6), epochs=epoch_num, batch_size = 300, verbose=1, callbacks = [model_checkpoint_callback, early_stopping_callback], shuffle=True) f = open(checkpoint_filepath + 'model_history.pckl', 'wb') pickle.dump(model_history.history, f) f.close model.save(checkpoint_filepath + 'final_model') tf.keras.backend.clear_session() return model, model_history, params models = [] model_hists = [] params_lists = [] for run in range(35): lr = 10np.random.uniform(-6.5,-4) l2 = 10np.random.uniform(-4,-1) #before (-5,-1) l1 = 10np.random.uniform(-7,-3) beta = 0.9 # should I also let this vary? If so, how? epochs = 200 print('LR: %.5e | L2: %.5e | L1: %.5e' % (lr,l2,l1)) model, model_hist,params = trainup(train_x,train_y,dev_x,dev_y,epochs,lr,l2,l1,beta,version_name) models.append(model) model_hists.append(model_hist) params_lists.append(params) min_losses = [] plt.figure() for hist,name in zip(model_hists,params_lists): plt.plot(np.arange(1,len(hist.history['mean_squared_error']) +1),hist.history['mean_squared_error']) plt.plot(np.arange(1,len(hist.history['val_mean_squared_error']) +1),hist.history['val_mean_squared_error']) print('Best epoch: %d | Minimum MSE: %.5f' % (np.argmin(hist.history['val_mean_squared_error']),np.min(hist.history['val_mean_s quared_error']))) print(name) plt.ylim((0,1)) plt.show() min_losses.append(np.min(hist.history['val_mean_squared_error'])) best_idx = int(np.argmin(min_losses)) print(best_idx) print(np.min(model_hists[best_idx].history['val_mean_squared_error'])) dev_preds = models[best_idx].predict(dev_x) train_preds = models[best_idx].predict(train_x) test_preds = models[best_idx].predict(test_x) params_lists[best_idx] np.mean((np.squeeze(dev_preds)-np.array(dev_y)/1e6)2) print(np.mean(np.abs(np.squeeze(test_preds)-np.array(test_y)/1e6))) print(np.mean(np.abs(np.squeeze(dev_preds)-np.array(dev_y)/1e6))) print(np.mean(np.abs(np.squeeze(train_preds)-np.array(train_y)/1e6))) print(np.std(np.abs(np.squeeze(test_preds)-np.array(test_y)/1e6))) print(np.std(np.abs(np.squeeze(dev_preds)-np.array(dev_y)/1e6))) print(np.std(np.abs(np.squeeze(train_preds)-np.array(train_y)/1e6))) from scipy import stats print(np.mean(np.squeeze(test_preds)-np.array(test_y)/1e6)) print(np.mean(np.squeeze(dev_preds)-np.array(dev_y)/1e6)) print(np.mean(np.squeeze(train_preds)-np.array(train_y)/1e6)) print(np.std(np.squeeze(test_preds)-np.array(test_y)/1e6)) print(np.std(np.squeeze(dev_preds)-np.array(dev_y)/1e6)) print(np.std(np.squeeze(train_preds)-np.array(train_y)/1e6)) print(stats.pearsonr(test_preds.flatten(),np.array(test_y))[0]**2) plt.figure()

plt.scatter(np.array(test_y)/1e6,test_preds,s=5,label='Test predictions') plt.plot([2,10],[2,10],'r',label='Identity') plt.xlim([1,11]) plt.ylim([1,11]) plt.xlabel('True volume (L)') plt.ylabel('Predicted volume (L)') #plt.legend({'Validation predictions','Identity'}) plt.legend() plt.title('Predicted volume vs. ground truth: MESA Exam 5 test set') #plt.savefig('/DATA_SSD/process_AW/volume_estimation/' + version_name + '/validation_predictions.png',dpi=600) plt.show() model_history = model_hists[best_idx] plt.figure() plt.plot(np.arange(1,len(model_history.history['mean_squared_error']) +1),model_history.history['mean_squared_error'],label='Train MSE') plt.plot(np.arange(1,len(model_history.history['mean_squared_error']) +1),model_history.history['val_mean_squared_error'], label = 'Validation MSE') plt.ylim((0,0.5)) plt.plot([np.argmin(model_history.history['val_mean_squared_error']),np.argmin(m odel_history.history['val_mean_squared_error'])],[0,1],'g',label = 'Best epoch') plt.xlabel('Epoch') plt.ylabel('Mean squared error') #plt.legend({'Train MSE','Validation MSE', 'Best epoch'}) plt.legend() #plt.savefig('/DATA_SSD/process_AW/volume_estimation/' + version_name + '/loss_curve.png',dpi=600) plt.show() plt.figure() plt.scatter(0.5(np.array(test_y)/1e6+np.squeeze(test_preds)), (np.squeeze(test_preds)-np.squeeze(test_y/1e6)),s=1,label='Test predictions') #plt.plot([2,10],[2,10],'r',label='Identity') mean_err = np.mean(np.squeeze(test_preds)-np.squeeze(test_y/1e6)) plt.plot([1,11], [mean_err,mean_err],'r') plt.plot([1,11], [mean_err+1.96np.std(np.squeeze(test_preds)-np.squeeze(test_y/ 1e6)),mean_err+1.96np.std(np.squeeze(test_preds)-np.squeeze(test_y/1e6))],'r--') plt.plot([1,11],[mean_err-1.96np.std(np.squeeze(test_preds)-np.squeeze(test_y/ 1e6)),mean_err-1.96*np.std(np.squeeze(test_preds)-np.squeeze(test_y/1e6))],'r--') plt.xlim([1,11]) #plt.ylim([1,11]) plt.xlabel('Mean of GT and predicted volume (L)') plt.ylabel('Difference of GT and predicted volume (L)') #plt.legend({'Validation predictions','Identity'}) plt.legend() plt.title('Bland-Altman: MESA Exam 5 test set') #plt.savefig('/DATA_SSD/process_AW/volume_estimation/' + version_name + '/validation_predictions.png',dpi=600) plt.show() plt.figure() plt.hist(np.squeeze(test_preds)-np.array(test_y)/1e6,bins=20) plt.xlabel('(Predicted

  • ground truth) (L)') plt.ylabel('Count') plt.title('Volume prediction error, MESA Exam 5 test set') #plt.savefig('/DATA_SSD/process_AW/volume_estimation/' + version_name + '/prediction_error_histogram.png',dpi=600) plt.show() def get_bottleneck(l2,l1): l2_weight = l2 l1_weight = l1 kr = tf.keras.regularizers.l1_l2(l1=l1_weight, l2=l2_weight) # inputs_sag = tf.keras.Input(shape=(224,224,1)) # inputs_cor = tf.keras.Input(shape=(224,224,1)) # inputs_ax = tf.keras.Input(shape=(224,224,1)) inputs = tf.keras.Input(shape=(768,)) x = tf.keras.layers.Dense(512,activation='relu',kernel_regularizer = kr)(inputs) #x = tf.keras.layers.Dense(512,activation='relu',kernel_regularizer = kr)(x) x = tf.keras.layers.Dense(256,activation='relu',kernel_regularizer = kr)(x) #x = tf.keras.layers.Dense(256,activation='relu',kernel_regularizer = kr)(x) #added v8Dec x = tf.keras.layers.Dense(128,activation='relu',kernel_regularizer = kr)(x) x2 = tf.keras.layers.Dense(1,activation='linear',kernel_regularizer = kr)(x) #x = Dense(2,activation='softmax')(x) # summarize the model model = keras.Model(inputs=inputs,outputs=x) model.summary() return model best_checkpoint_filepath = base_path + version_name + '' + str(int(params_lists[best_idx][0])) + '' + str(params_lists[best_idx] [1]).replace('.','p') + '' + str(params_lists[best_idx][2]).replace('.','p') + '' + str(params_lists[best_idx][4]).replace('.','p') + '/' md = get_bottleneck(0,0) md.load_weights(best_checkpoint_filepath) dev_preds = md.predict(dev_x) train_preds = md.predict(train_x) test_preds = md.predict(test_x) from sklearn.decomposition import PCA pc_train = sklearn.decomposition.PCA(n_components=2) pc_train.fit(train_preds) print(pc_train.explained_variance_ratio_) train_pc = pc_train.transform(train_preds)

resblock(x1,5,64,kr,'block2') x1 =

tf.keras.layers.MaxPool2D(3,padding='same',name='mp2')(x1) x1 =

resblock(x1,3,64,kr,'block3') x1 =

tf.keras.layers.MaxPool2D(3,padding='same',name='mp3')(x1) x1 =

resblock(x1,3,128,kr,'block4') x1 =

tf.keras.layers.MaxPool2D(3,padding='same',name='mp4')(x1) x1 =

resblock(x1,3,256,kr,'block5') x1 =

tf.keras.layers.GlobalAveragePooling2D(name='gap')(x1) return x1 def

get_model(l2,l1): l2_weight = l2 l1_weight = l1 kr =

tf.keras.regularizers.l1_l2(l1=l1_weight, l2=l2_weight) # inputs_sag =

tf.keras.Input(shape=(224,224,1)) # inputs_cor =

tf.keras.Input(shape=(224,224,1)) # inputs_ax =

tf.keras.Input(shape=(224,224,1)) inputs =

tf.keras.Input(shape=(224,224,3),name='input') inputs =

tf.cast(inputs,dtype='float32') x = conv_net(inputs,kr) x =

tf.keras.layers.Dense(256,activation='relu',kernel_regularizer =

kr,name='dense1')(x) x =

tf.keras.layers.Dense(128,activation='relu',kernel_regularizer =

kr,name='dense2')(x) x =

tf.keras.layers.Dense(1,activation='linear',kernel_regularizer =

kr,name='dense3')(x) # summarize the model model =

keras.Model(inputs=inputs,outputs=x) model.summary() return model

def

trainup(train_x,train_y,dev_x,dev_y,epoch_num,lr,l2,l1,beta,version_nam

e): tf.random.set_seed(42) l2_weight = l2 l1_weight = l1 model =

get_model(l2_weight,l1_weight)

model.compile(optimizer=keras.optimizers.Adam(learning_rate=lr,beta_

1=beta), loss=keras.losses.MeanSquaredError(),

metrics=['mean_squared_error']) checkpoint_filepath =

'/DATA_SSD/process_AW/test_run_LIDC/' + version_name + '_' +

str(epoch_num) + '' + str(lr).replace('.','p') + '' + str(l2).replace('.','p')

+ '_' + str(l1).replace('.','p') + '/' model_checkpoint_callback =

tf.keras.callbacks.ModelCheckpoint( # filepath=checkpoint_filepath +

'epoch_{epoch:03d}', filepath=checkpoint_filepath,

save_weights_only=True, monitor='val_mean_squared_error',

mode='min', save_best_only=True, verbose=1) early_stopping_callback

= tf.keras.callbacks.EarlyStopping( monitor="val_mean_squared_error",

min_delta=0, patience=25, verbose=0, mode="auto", baseline=None,

restore_best_weights=True) params = np.array([epoch_num, lr, l2, beta,

l1]) model_history = model.fit(train_x,train_y,

validation_data=(dev_x,dev_y), epochs=epoch_num, batch_size = 300,

verbose=1, callbacks = [model_checkpoint_callback,

early_stopping_callback], shuffle=True) model.save(checkpoint_filepath

+ 'final_model') f = open(checkpoint_filepath + 'model_history.pckl',

'wb') pickle.dump(model_history.history, f) f.close return model,

model_history, params models = [] hists = [] params_lists = [] lrs =

10np.random.uniform(-6,-4,(20)) l2s = 10np.random.uniform(-4,-1,

(20)) for run in range(1): lr = lrs[run] l2 = l2s[run] l1 = 0 beta = 0.

epochs = 150 print('LR: %.5e | L2: %.5e | L1: %.5e' % (lr,l2,l1))

version_name = 'LIDC_corCNN' model, model_hist,params =

trainup(train_images,train_y,dev_images,dev_y,epochs,lr,l2,l1,beta,versi

on_name) models.append(model) hists.append(model_hist)

params_lists.append(params) tf.keras.backend.clear_session()

min_losses = [] plt.figure() for hist,name in zip(hists,params_lists):

plt.plot(np.arange(1,len(hist.history['mean_squared_error'])

+1),hist.history['mean_squared_error'])

plt.plot(np.arange(1,len(hist.history['val_mean_squared_error'])

+1),hist.history['val_mean_squared_error']) print('Best epoch: %d |

Minimum MSE: %.5f' %

(np.argmin(hist.history['val_mean_squared_error']),np.min(hist.history['v

al_mean_squared_error']))) print(name) plt.ylim((0,1)) plt.show()

min_losses.append(np.min(hist.history['val_mean_squared_error']))

np.argmin(min_losses) from scipy import stats train_preds =

models[np.argmin(min_losses)].predict(train_images) dev_preds =

models[np.argmin(min_losses)].predict(dev_images) test_preds =

models[np.argmin(min_losses)].predict(test_images)

print(np.mean(train_preds-np.expand_dims(np.array(train_y),axis=-1)))

print(np.std(train_preds-np.expand_dims(np.array(train_y),axis=-1)))

print(np.mean(dev_preds-np.expand_dims(np.array(dev_y),axis=-1)))

print(np.std(dev_preds-np.expand_dims(np.array(dev_y),axis=-1)))

print(np.mean(test_preds-np.expand_dims(np.array(test_y),axis=-1)))

print(np.std(test_preds-np.expand_dims(np.array(test_y),axis=-1)))

print(stats.pearsonr(test_preds.flatten(),np.array(test_y))[0]**2)

plt.figure() plt.scatter(test_preds,np.expand_dims(np.array(test_y),axis=-

1),s=1) plt.show() Notebook FOR_STUDENTS_LIDC_create_input: import

glob import nibabel as nib import scipy from scipy import io, ndimage

import numpy as np import matplotlib.pyplot as plt from concurrent

import futures from concurrent.futures import ThreadPoolExecutor

import tensorflow as tf # from tensorflow import keras, random, config

import pickle from PIL import Image import os import zipfile import

pydicom lidc_scans_path = '/DATA_SSD/process_AW/LIDC_Nifty/' lidc_in =

glob.glob('/DATA_SSD/process_AW/LIDC_Nifty//.nii.gz') lidc_masks =

glob.glob('/DATA_SSD/process_AW/LIDC_lung_mask/*.nii.gz') pickle_dir =

"/DATA_SSD/process_AW/" # load the volumes dictionary with

open(os.path.join(pickle_dir, "LIDC_volumes.pckl"), "rb") as f: volumes =

pickle.load(f) # load the resolutions dictionary with

open(os.path.join(pickle_dir, "LIDC_resolutions.pckl"), "rb") as f:

resolutions = pickle.load(f) # load the array sizes dictionary with

open(os.path.join(pickle_dir, "LIDC_array_sizes.pckl"), "rb") as f:

array_sizes = pickle.load(f) volumes_arr =

np.array(list(volumes.values())) reso_arr =

np.array(list(resolutions.values())) size_arr =

np.array(list(array_sizes.values())) physical_size = reso_arr*size_arr

max_mm = np.max(physical_size,axis=0) import tifffile

save_projection_path = '/DATA_SSD/process_AW/LIDC_input_images/' if

not os.path.isdir(save_projection_path): os.mkdir(save_projection_path)

def create_threechannel(mask): print(i) lung =

nib.load(mask).get_fdata().astype('uint8') idno = mask.split('/')[-

1].split('_lungseg')[0] scan = nib.load(glob.glob(lidc_scans_path

+idno+'/*.nii.gz')[0]).get_fdata().astype('float') print(idno) reso =

[float(resolutions[mask][0]), float(resolutions[mask][2])] lung[lung>0] =

1 shp = np.round(max_mm/np.array([reso[0],reso[0],reso[1]]))-

np.shape(lung) try: for j in range(5): print(j) options =

np.random.uniform(0,1,6) lung2 = lung.copy() scan2 = scan.copy() if

42,stratify=lidc_ranks_input) x_val,x_test,y_val,y_test =

model_selection.train_test_split(x_test,y_test,test_size=0.5,random_stat

e=42,stratify=y_test[:,1]) save_pickle_path = '/DATA_SSD/process_AW/'

outputs_train = [x for x in zip(x_train,y_train[:,0])] outputs_val = [x for x

in zip(x_val,y_val[:,0])] outputs_test = [x for x in zip(x_test,y_test[:,0])]

with open(save_pickle_path + '/LIDC_training_data.pckl','wb') as f:

pickle.dump(outputs_train,f) with open(save_pickle_path +

'/LIDC_validation_data.pckl','wb') as f: pickle.dump(outputs_val,f) with

open(save_pickle_path + '/LIDC_test_data.pckl','wb') as f:

pickle.dump(outputs_test,f) Notebook

FOR_STUDENTS_getBottleneck_and_3ViewFCN: import glob import

matplotlib.pyplot as plt import numpy as np import pickle import tifffile

base_path = '/DATA_SSD/process_AW/volume_estimation/' dirx_sag =

glob.glob(base_path

+'25Apr2022_sagCNN_v7_256out/model_history.pckl') dirx_cor =

glob.glob(base_path+

'25Apr2022_corCNN_v7_256out/model_history.pckl') dirx_ax =

glob.glob(base_path +

'25Apr2022_axCNN_v7_256out/model_history.pckl') def

print_curves(dirx): for file in dirx: f = open(file,'rb') hist = pickle.load(f)

f.close() print('Min epoch: %i | Min val loss: %1.5f'%

(np.argmin(hist['val_mean_squared_error']),np.min(hist['val_mean_squar

ed_error'])))

plt.plot(1+np.arange(len(hist['mean_squared_error'])),hist['mean_square

d_error'])

plt.plot(1+np.arange(len(hist['mean_squared_error'])),hist['val_mean_sq

uared_error']) plt.xlim([0, 150]) plt.ylim([0, 1]) plt.show()

print_curves(dirx_sag) print_curves(dirx_cor) print_curves(dirx_ax) def

collect_min_losses(dirx): min_losses = [] for file in dirx: f = open(file,'rb')

hist = pickle.load(f) f.close()

min_losses.append([np.min(hist['val_mean_squared_error']),np.argmin(hi

st['val_mean_squared_error'])]) return min_losses min_sag =

collect_min_losses(dirx_sag) min_cor = collect_min_losses(dirx_cor)

min_ax = collect_min_losses(dirx_ax) def get_parameters(dirx): lrs = []

l2s = [] for direct in dirx: tmp = direct.split('/')[-2]

lrs.append(float(tmp.split('_')[-3].replace('p','.')))

l2s.append(float(tmp.split('_')[-2].replace('p','.'))) return lrs,l2s

lr_sag,l2_sag = get_parameters(dirx_sag) lr_cor,l2_cor =

get_parameters(dirx_cor) lr_ax,l2_ax = get_parameters(dirx_ax) def

make_plot(lr,l2,mins): plt.figure() plt.scatter(np.log(lr),np.log(l2),c=-

np.log(np.array(mins)[:,0]),vmin=0.5,vmax=1) cb = plt.colorbar()

cb.ax.set_title('-Log(loss)') plt.xlabel('Log-LR') plt.ylabel('Log-L2')

plt.show() make_plot(lr_sag,l2_sag,min_sag)

make_plot(lr_cor,l2_cor,min_cor) make_plot(lr_ax,l2_ax,min_ax)

np.argmin(np.array(min_ax)[:,0]) import glob import tensorflow as tf

from tensorflow import keras, random, config import numpy as np import

matplotlib.pyplot as plt import json import sklearn from sklearn import

model_selection from PIL import Image import pickle

synthetic_data_path =

'/DATA_SSD/process_AW/SPIROMICS_V1_lungmask_projections/MESA_CAC

_Ex5_3Apr2022/' gpus =

tf.config.experimental.list_physical_devices('GPU') print(tf.version) if

gpus: try: # Currently, memory growth needs to be the same across

GPUs for gpu in gpus: tf.config.experimental.set_memory_growth(gpu,

True) tf.config.experimental.set_visible_devices(gpus[0], 'GPU') # GPU

index! logical_gpus = tf.config.experimental.list_logical_devices('GPU')

print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")

except RuntimeError as e: # Memory growth must be set before GPUs

have been initialized print(e) f = open(synthetic_data_path +

'MESA_Ex5_training_data.pckl','rb') train_data = pickle.load(f) f.close() f

= open(synthetic_data_path + 'MESA_Ex5_validation_data.pckl','rb')

val_data = pickle.load(f) f.close() f = open(synthetic_data_path +

'MESA_Ex5_test_data.pckl','rb') test_data = pickle.load(f) f.close() def

resblock(x,kernelsize,filters,kr,nm): x = tf.keras.layers.Conv2D(filters,

kernelsize, padding='same',kernel_regularizer=kr,name=nm+'_conv1')

(x) x = tf.keras.layers.BatchNormalization(name=nm+'_bn1')(x) x =

tf.keras.layers.ReLU(name=nm+'_relu1')(x) fx = x x =

tf.keras.layers.Conv2D(filters, kernelsize,

padding='same',kernel_regularizer=kr,name=nm+'_conv2')(x) x =

tf.keras.layers.BatchNormalization(name=nm+'_bn2')(x) x =

tf.keras.layers.ReLU(name=nm+'_relu2')(x) x =

tf.keras.layers.Conv2D(filters, kernelsize,

padding='same',kernel_regularizer=kr,name=nm+'_conv3')(x) x =

tf.keras.layers.BatchNormalization(name=nm+'_bn3')(x) out =

tf.keras.layers.Add(name=nm+'_add')([x,fx]) out =

tf.keras.layers.ReLU(name=nm+'_relu3')(out) return out def

conv_net(x1,kr): x1 = resblock(x1,5,32,kr,'block1') x1 =

tf.keras.layers.MaxPool2D(3,padding='same',name='mp1')(x1) x1 =

resblock(x1,5,64,kr,'block2') x1 =

tf.keras.layers.MaxPool2D(3,padding='same',name='mp2')(x1) x1 =

resblock(x1,3,64,kr,'block3') x1 =

tf.keras.layers.MaxPool2D(3,padding='same',name='mp3')(x1) x1 =

resblock(x1,3,128,kr,'block4') x1 =

tf.keras.layers.MaxPool2D(3,padding='same',name='mp4')(x1) x1 =

resblock(x1,3,256,kr,'block5') x1 =

tf.keras.layers.GlobalAveragePooling2D(name='gap')(x1) return x1 def

get_model(l2,l1): l2_weight = l2 l1_weight = l1 kr =

tf.keras.regularizers.l1_l2(l1=l1_weight, l2=l2_weight) # inputs_sag =

tf.keras.Input(shape=(224,224,1)) # inputs_cor =

tf.keras.Input(shape=(224,224,1)) # inputs_ax =

tf.keras.Input(shape=(224,224,1)) inputs =

tf.keras.Input(shape=(224,224,3),name='input') inputs =

tf.cast(inputs,dtype='float32') inp1 = tf.keras.layers.Lambda(lambda x:

x[:,:,:,0]/224.0)(inputs) inp1 = tf.expand_dims(inp1,axis=-1) inp2 =

tf.keras.layers.Lambda(lambda x: x[:,:,:,1]/2048)(inputs) inp2 =

tf.expand_dims(inp2,axis=-1) inp3 = tf.keras.layers.Lambda(lambda x:

x[:,:,:,2]/1024)(inputs) inp3 = tf.expand_dims(inp3,axis=-1) # inputs =

tf.keras.layers.Concatenate([inp1,inp2,inp3],axis=-1) pass_inputs =

tf.keras.layers.Concatenate(axis=-1)([inp1,inp2,inp3]) x =

conv_net(pass_inputs,kr) x =

tf.keras.layers.Dense(256,activation='relu',kernel_regularizer =

kr,name='dense1')(x) x =

tf.keras.layers.Dense(128,activation='relu',kernel_regularizer =

kr,name='dense2')(x) x =

model_cor.load_weights(best_cor + '/') train_preds_cor =

model_cor.predict(train_images) dev_preds_cor =

model_cor.predict(dev_images) test_preds_cor =

model_cor.predict(test_images) print(np.std(test_preds_cor.T-test_y/1e6))

print(np.mean(test_preds_cor.T-test_y/1e6)) md_cor =

get_bottleneck(0,0) md_cor.load_weights(best_cor+ '/') cor_bottle_train

= md_cor.predict(train_images) cor_bottle_dev =

md_cor.predict(dev_images) cor_bottle_test =

md_cor.predict(test_images) pc_cor =

sklearn.decomposition.PCA(n_components=2) pc_cor.fit(cor_bottle_train)

print(pc_cor.explained_variance_ratio_) cor_pc =

pc.transform(cor_bottle_train) plt.figure()

plt.scatter(cor_pc[:,0],cor_pc[:,1],s=1,c=train_y) plt.show() best_ax =

'/'.join(dirx_ax[int(np.argmin(np.array(min_ax)[:,0]))].split('/')[:-1])

print(best_ax) train_images, dev_images, test_images, train_paths,

dev_paths, test_paths, train_y, dev_y, test_y = retrieve_data('axial')

model_ax = get_model(0,0) model_ax.load_weights(best_ax + '/') pc_ax

= sklearn.decomposition.PCA(n_components=2)

pc_ax.fit(ax_bottle_train) print(pc_ax.explained_variance_ratio_) ax_pc =

pc.transform(ax_bottle_train) plt.figure()

plt.scatter(ax_pc[:,0],ax_pc[:,1],s=1,c=train_y) plt.show() version_name

= '25Apr2022_sagCNN_v7_256out' f = open(base_path + version_name

+ '_bottleneck_512_train.pckl', 'wb') pickle.dump(sag_bottle_train, f)

f.close f = open(base_path + version_name +

'_bottleneck_512_dev.pckl', 'wb') pickle.dump(sag_bottle_dev, f) f.close f

= open(base_path + version_name + '_bottleneck_512_test.pckl', 'wb')

pickle.dump(sag_bottle_test, f) f.close version_name =

'25Apr2022_corCNN_v7_256out' f = open(base_path + version_name +

'_bottleneck_512_train.pckl', 'wb') pickle.dump(cor_bottle_train, f) f.close

f = open(base_path + version_name + '_bottleneck_512_dev.pckl', 'wb')

pickle.dump(cor_bottle_dev, f) f.close f = open(base_path +

version_name + '_bottleneck_512_test.pckl', 'wb')

pickle.dump(cor_bottle_test, f) f.close version_name =

'25Apr2022_axCNN_v7_256out' f = open(base_path + version_name +

'_bottleneck_512_train.pckl', 'wb') pickle.dump(ax_bottle_train, f) f.close f

= open(base_path + version_name + '_bottleneck_512_dev.pckl', 'wb')

pickle.dump(ax_bottle_dev, f) f.close f = open(base_path +

version_name + '_bottleneck_512_test.pckl', 'wb')

pickle.dump(ax_bottle_test, f) f.close tf.random.set_seed(42)

version_name = '10May2022_v7_3ViewFCN_256out' sag_name =

'25Apr2022_sagCNN_v7_256out' cor_name =

'25Apr2022_corCNN_v7_256out' ax_name =

'25Apr2022_axCNN_v7_256out' f =

open(base_path+sag_name+'_bottleneck_512_train.pckl','rb') train_sag

= pickle.load(f) f.close f =

open(base_path+sag_name+'_bottleneck_512_dev.pckl','rb') dev_sag =

pickle.load(f) f.close f =

open(base_path+sag_name+'_bottleneck_512_test.pckl','rb') test_sag =

pickle.load(f) f.close f =

open(base_path+cor_name+'_bottleneck_512_train.pckl','rb') train_cor =

pickle.load(f) f.close f =

open(base_path+cor_name+'_bottleneck_512_dev.pckl','rb') dev_cor =

pickle.load(f) f.close f =

open(base_path+cor_name+'_bottleneck_512_test.pckl','rb') test_cor =

pickle.load(f) f.close f =

open(base_path+ax_name+'_bottleneck_512_train.pckl','rb') train_ax =

pickle.load(f) f.close f =

open(base_path+ax_name+'_bottleneck_512_dev.pckl','rb') dev_ax =

pickle.load(f) f.close f =

open(base_path+ax_name+'_bottleneck_512_test.pckl','rb') test_ax =

pickle.load(f) f.close train_x =

np.concatenate((train_sag,train_cor,train_ax),axis=1) dev_x =

np.concatenate((dev_sag,dev_cor,dev_ax),axis=1) test_x =

np.concatenate((test_sag,test_cor,test_ax),axis=1) synthetic_data_path

'/DATA_SSD/process_AW/SPIROMICS_V1_lungmask_projections/MESA_CAC

_Ex5_3Apr2022/' f = open(synthetic_data_path +

'MESA_Ex5_training_data.pckl','rb') train_data = pickle.load(f) f.close() f

= open(synthetic_data_path + 'MESA_Ex5_validation_data.pckl','rb')

val_data = pickle.load(f) f.close() f = open(synthetic_data_path +

'MESA_Ex5_test_data.pckl','rb') test_data = pickle.load(f) f.close() train_y

= [] dev_y = [] test_y = [] train_paths = [] dev_paths = [] test_paths = []

for point in train_data: print(point) idno = point[0] volume = point[1] for

i in range(10): train_paths.append(synthetic_data_path + idno + '_' +

str(i)) train_y.append(volume) train_y = np.stack(train_y,axis=0) for

point in val_data: print(point) idno = point[0] volume = point[1] for i in

range(10): dev_paths.append(synthetic_data_path + idno + '_' + str(i))

dev_y.append(volume) dev_y = np.stack(dev_y,axis=0) for point in

test_data: print(point) idno = point[0] volume = point[1] for i in

range(1): test_paths.append(synthetic_data_path + idno + '_' + str(i))

test_y.append(volume) test_y = np.stack(test_y,axis=0) def

get_model(l2,l1): l2_weight = l2 l1_weight = l1 kr =

tf.keras.regularizers.l1_l2(l1=l1_weight, l2=l2_weight) # inputs_sag =

tf.keras.Input(shape=(224,224,1)) # inputs_cor =

tf.keras.Input(shape=(224,224,1)) # inputs_ax =

tf.keras.Input(shape=(224,224,1)) inputs = tf.keras.Input(shape=(768,))

x = tf.keras.layers.Dense(512,activation='relu',kernel_regularizer = kr)

(inputs) #x =

tf.keras.layers.Dense(512,activation='relu',kernel_regularizer = kr)(x) x

= tf.keras.layers.Dense(256,activation='relu',kernel_regularizer = kr)(x)

#x = tf.keras.layers.Dense(256,activation='relu',kernel_regularizer = kr)

(x) #added v8Dec x =

tf.keras.layers.Dense(128,activation='relu',kernel_regularizer = kr)(x) x

= tf.keras.layers.Dense(1,activation='linear',kernel_regularizer = kr)(x)

#x = Dense(2,activation='softmax')(x) # summarize the model model =

keras.Model(inputs=inputs,outputs=x) model.summary() return model

def

trainup(train_x,train_y,dev_x,dev_y,epoch_num,lr,l2,l1,beta,version_nam

e): tf.random.set_seed(42) l2_weight = l2 l1_weight = l1 model =

get_model(l2_weight,l1_weight)

model.compile(optimizer=keras.optimizers.Adam(learning_rate=lr,beta_

1=beta), loss=keras.losses.MeanSquaredError(),

metrics=['mean_squared_error']) checkpoint_filepath = base_path +

version_name + '' + str(epoch_num) + '' + str(lr).replace('.','p') + '_' +