diff --git a/lymphoma-cancer-classification/README.md b/lymphoma-cancer-classification/README.md new file mode 100644 index 0000000..5887b3c --- /dev/null +++ b/lymphoma-cancer-classification/README.md @@ -0,0 +1,27 @@ +# Lymphoma Cancer Classification +In this implementation, three different Lymphoma subtypes are considered to classify from pathological images: +- Chronic lymphocytic leukemia (CLL) +- Follicular lymphoma (FL) +- Mantle cell lymphoma (MCL). + +The following figure shows three different type of cancer cells. + +### Dataset Preparation +The [dataset](http://www.andrewjanowczyk.com/use-case-7-lymphoma-sub-type-classification/) consist of 374 images of size 1388 x 1040. These are further broken down into 113 for the CLL class, 139 for the FL class and 122 for the MCL class. The data has been curated from multiple sources to create a real-world type cohort which contains typical stain and scanning variances. +Non-overlapping patches of size 256 x 256 are extracted from each image. 15% from the total data is set apart of validation. Data is augmented using Keras' ImageDataGenerator. +### Inception Recurrent Convolutional Neural Network +The IRCNN architecture consists of general convolution layers, IRCNN blocks, transaction blocks, and a softmax logistic regression layer. + +The IRCNN block, performs recurrent convolution operations on different sized kernels. + +As the input and output dimensions do not change, this is simply an accumulation of feature maps with respect to the time step considered. This helps to strengthen the extraction of the target features. +In the transaction block, three operations (convolution, pooling, and drop-out) are performed depending upon the placement of the block in the network. According to Figure, all of the operations are applied in the very first transaction block and second transaction block. The third transaction block consists of convolution, global-average pooling, and drop-out layer. The GlobalAveragePooling layer is used as an alternative to a fully connected layer. +The Stochastics Gradient Descent (SGD) optimization method is used with initial learning rate 0.01 +### Usage +The models folder contains Keras model and it's corresponding tensorflowjs model. Download the .zip file of repository and load the model in caMicrscope. +### References +- Advanced Deep Convolutional Neural Network Approaches for Digital Pathology Image Analysis: a comprehensive evaluation with different use cases +Md Zahangir Alom, Theus Aspiras, Tarek M. Taha, Vijayan K. Asari, TJ Bowen, Dave Billiter, Simon Arkell +- M. Liang, X. Hu, "Recurrent convolutional neural network for object recognition", CVPR, pp. 3367-3375, 2015. +- Inception Recurrent Convolutional Neural Network for Object Recognition +Md Zahangir Alom, Mahmudul Hasan, Chris Yakopcic, Tarek M. Taha diff --git a/lymphoma-cancer-classification/imgs/arch.png b/lymphoma-cancer-classification/imgs/arch.png new file mode 100644 index 0000000..1f76db8 Binary files /dev/null and b/lymphoma-cancer-classification/imgs/arch.png differ diff --git a/lymphoma-cancer-classification/imgs/lymp_samples.png b/lymphoma-cancer-classification/imgs/lymp_samples.png new file mode 100644 index 0000000..7508123 Binary files /dev/null and b/lymphoma-cancer-classification/imgs/lymp_samples.png differ diff --git a/lymphoma-cancer-classification/imgs/lymph.jpg b/lymphoma-cancer-classification/imgs/lymph.jpg new file mode 100644 index 0000000..433e100 Binary files /dev/null and b/lymphoma-cancer-classification/imgs/lymph.jpg differ diff --git a/lymphoma-cancer-classification/model.ipynb b/lymphoma-cancer-classification/model.ipynb new file mode 100644 index 0000000..f1fa150 --- /dev/null +++ b/lymphoma-cancer-classification/model.ipynb @@ -0,0 +1,527 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Lymphoma_cancer_classification.ipynb", + "version": "0.3.2", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "pc9UCDPps2SI", + "colab_type": "text" + }, + "source": [ + "## Google Colab Setup" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "PL_GqMswqQ4h", + "colab_type": "code", + "outputId": "4655e3a8-3ff4-4c8b-e9de-c41f4e7c6712", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "from google.colab import drive\n", + "drive.mount('./gdrive')" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Drive already mounted at ./gdrive; to attempt to forcibly remount, call drive.mount(\"./gdrive\", force_remount=True).\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-vO4fMdxQna6", + "colab_type": "code", + "outputId": "e77c6255-cd9f-4f73-95b0-16813855f8d8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "cd ./gdrive/\"My Drive\"/model3bmi " + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/content/gdrive/My Drive/model3bmi\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lJGXIK8AEMzY", + "colab_type": "text" + }, + "source": [ + "### Preparing Dataset" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Weu7RsyiQ-ia", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Credits: ICIAR2018 by ImagingLabs\n", + "class PatchExtractor:\n", + " def __init__(self, img, patch_size, stride):\n", + " '''\n", + " :param img: :py:class:`~PIL.Image.Image`\n", + " :param patch_size: integer, size of the patch\n", + " :param stride: integer, size of the stride\n", + " '''\n", + " self.img = img\n", + " self.size = patch_size\n", + " self.stride = stride\n", + "\n", + " def extract_patches(self):\n", + " \"\"\"\n", + " extracts all patches from an image\n", + " :returns: A list of :py:class:`~PIL.Image.Image` objects.\n", + " \"\"\"\n", + " wp, hp = self.shape()\n", + " return [self.extract_patch((w, h)) for h in range(hp) for w in range(wp)]\n", + "\n", + " def extract_patch(self, patch):\n", + " \"\"\"\n", + " extracts a patch from an input image\n", + " :param patch: a tuple\n", + " :rtype: :py:class:`~PIL.Image.Image`\n", + " :returns: An :py:class:`~PIL.Image.Image` object.\n", + " \"\"\"\n", + " return self.img.crop((\n", + " patch[0] * self.stride, # left\n", + " patch[1] * self.stride, # up\n", + " patch[0] * self.stride + self.size, # right\n", + " patch[1] * self.stride + self.size # down\n", + " ))\n", + "\n", + " def shape(self):\n", + " wp = int((self.img.width - self.size) / self.stride + 1)\n", + " hp = int((self.img.height - self.size) / self.stride + 1)\n", + " return wp, hp" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "sOEfGa4OTrm_", + "colab_type": "code", + "colab": {} + }, + "source": [ + "mkdir new_train/MCL new_train/FL new_train/CLL" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ccYl8m-rTHKd", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import glob\n", + "from PIL import Image\n", + "\n", + "LABELS = ['CLL', 'FL', 'MCL']\n", + "PATCH_SIZE = 256\n", + "STRIDE = 256\n", + "\n", + "# The folder containing training data\n", + "train_folder = './train'\n", + "labels = {name: LABELS[index] for index in range(len(LABELS)) for name in glob.glob(train_folder + '/' + LABELS[index] + '/*.tif')}\n", + "\n", + "for key, value in labels.items():\n", + " try:\n", + " with Image.open(key) as img:\n", + " # the patch-size and stride is according to the paper\n", + " extractor = PatchExtractor(img=img, patch_size=PATCH_SIZE, stride=STRIDE)\n", + " patches = extractor.extract_patches()\n", + " count = 0\n", + " for p in patches:\n", + " count += 1\n", + " p.save('./new_train/' + value + '/' + str(count) + '_' + key.split('/')[-1])\n", + " except Exception as error:\n", + " print('error with', key, error)\n", + "\n" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "y4j-cShYT6Mz" + }, + "source": [ + "## Inception Recurrent Convolutional Neural Network (IRCNN)" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "v7PLwcGm5jHz", + "colab_type": "code", + "outputId": "ae0d9538-3d52-4a4a-efd2-f66d02554054", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "import numpy as np\n", + "\n", + "# Sys\n", + "import warnings\n", + "# Keras Core\n", + "from keras.layers.convolutional import MaxPooling2D, Convolution2D, AveragePooling2D\n", + "from keras.layers.pooling import GlobalAveragePooling2D\n", + "from keras.layers import Input, Dropout, Dense, Flatten, Activation\n", + "from keras.layers.normalization import BatchNormalization\n", + "from keras.layers.merge import concatenate\n", + "from keras.layers import Add\n", + "from keras import regularizers\n", + "from keras import initializers\n", + "from keras.models import Model\n", + "\n", + "# Backend\n", + "from keras import backend as K\n" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "DdmOO-QX5o3n", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Convolution 2D with batch norm\n", + "def conv2d_bn(x, nb_filter, num_row, num_col,\n", + " padding='same', strides=(1, 1), use_bias=False):\n", + " \"\"\"\n", + " Utility function to apply conv + BN. \n", + " (Slightly modified from https://github.com/fchollet/keras/blob/master/keras/applications/inception_v3.py)\n", + " \"\"\"\n", + " if K.image_data_format() == 'channels_first':\n", + " channel_axis = 1\n", + " else:\n", + " channel_axis = -1\n", + " x = Convolution2D(nb_filter, (num_row, num_col),\n", + " strides=strides,\n", + " padding=padding,\n", + " use_bias=use_bias,\n", + " kernel_regularizer=regularizers.l2(0.00004),\n", + " kernel_initializer=initializers.VarianceScaling(scale=2.0, mode='fan_in', distribution='normal', seed=None))(x)\n", + " x = BatchNormalization(axis=channel_axis, momentum=0.9997, scale=False)(x)\n", + " x = Activation('relu')(x)\n", + " return x\n", + "\n", + "# Recurrent convolutional layer\n", + "def RCL(input, kernel_size, filedepth):\n", + " if K.image_data_format() == 'channels_first':\n", + " channel_axis = 1\n", + " else:\n", + " channel_axis = -1\n", + "\n", + " conv1 = Convolution2D(filters=filedepth, kernel_size=kernel_size, strides=(1, 1), padding='same',\n", + " kernel_regularizer=regularizers.l2(0.00004),\n", + " kernel_initializer=initializers.VarianceScaling(scale=2.0, mode='fan_in', distribution='normal', seed=None))(input)\n", + "\n", + " stack2 = BatchNormalization(axis=channel_axis, momentum=0.9997, scale=False)(conv1)\n", + " stack2 = Activation('relu')(stack2)\n", + "\n", + " RCL = Convolution2D(filters=filedepth, kernel_size=kernel_size, strides=(1, 1), padding='same', \n", + " kernel_regularizer=regularizers.l2(0.00004),\n", + " kernel_initializer=initializers.VarianceScaling(scale=2.0, mode='fan_in', distribution='normal', seed=None))\n", + "\n", + " conv2 = RCL(stack2)\n", + " stack3 = Add()([conv1, conv2])\n", + " stack4 = BatchNormalization(axis=channel_axis, momentum=0.9997, scale=False)(stack3)\n", + " stack4 = Activation('relu')(stack4)\n", + "\n", + "\n", + " conv3 = Convolution2D(filters=filedepth, kernel_size=kernel_size, strides=(1, 1), padding='same',\n", + " weights=RCL.get_weights(),\n", + " kernel_regularizer=regularizers.l2(0.00004),\n", + " kernel_initializer=initializers.VarianceScaling(scale=2.0, mode='fan_in', distribution='normal', seed=None))(stack4)\n", + " stack5 = Add()([conv1, conv3])\n", + " stack6 = BatchNormalization(axis=channel_axis, momentum=0.9997, scale=False)(stack5)\n", + " stack6 = Activation('relu')(stack6)\n", + "\n", + "\n", + " conv4 = Convolution2D(filters=filedepth, kernel_size=kernel_size, strides=(1, 1), padding='same',\n", + " weights=RCL.get_weights(),\n", + " kernel_regularizer=regularizers.l2(0.00004),\n", + " kernel_initializer=initializers.VarianceScaling(scale=2.0, mode='fan_in', distribution='normal', seed=None))(stack6)\n", + " stack7 = Add()([conv1, conv4])\n", + " stack8 = BatchNormalization(axis=channel_axis, momentum=0.9997, scale=False)(stack7)\n", + " stack8 = Activation('relu')(stack8)\n", + "\n", + " return stack8\n", + "\n", + "\n", + "def IRCNN_block(input):\n", + " if K.image_data_format() == 'channels_first':\n", + " channel_axis = 1\n", + " else:\n", + " channel_axis = -1\n", + "\n", + " branch_0 = RCL(input, (1, 1), 64)\n", + "\n", + " branch_1 = RCL(input, (3, 3), 128)\n", + "\n", + " branch_2 = AveragePooling2D((3,3), strides=(1,1), padding='same')(input)\n", + " branch_2 = RCL(branch_2, (1, 1), 64)\n", + "\n", + " x = concatenate([branch_0, branch_1, branch_2], axis=channel_axis)\n", + " return x\n", + "\n", + "\n", + "def IRCNN_base(input):\n", + "\n", + " if K.image_data_format() == 'channels_first':\n", + "# inputShape = (3, 256, 256)\n", + " channel_axis = 1\n", + " else:\n", + "# inputShape = (256, 256, 3)\n", + " channel_axis = -1\n", + "\n", + " # Input Shape is 3 x 256 x 256\n", + " net = Convolution2D(32, (3, 3), strides=(2,2), padding='valid')(input)\n", + " net = conv2d_bn(net, 32, 3, 3, padding='valid')\n", + " net = conv2d_bn(net, 64, 3, 3)\n", + "\n", + " net = IRCNN_block(input)\n", + " \n", + " net = conv2d_bn(net, 32, 3, 3, strides=(2,2), padding='valid')\n", + " net = MaxPooling2D((3,3), strides=(2,2), padding='valid')(net)\n", + " net = Dropout(0.5)(net)\n", + "\n", + " net = IRCNN_block(input)\n", + " \n", + " net = conv2d_bn(net, 32, 3, 3, strides=(2,2), padding='valid')\n", + " net = MaxPooling2D((3,3), strides=(2,2), padding='valid')(net)\n", + " net = Dropout(0.5)(net)\n", + " \n", + " net = IRCNN_block(input)\n", + " \n", + " net = conv2d_bn(net, 32, 3, 3, strides=(2,2), padding='valid')\n", + " net = GlobalAveragePooling2D()(net)\n", + " net = Dropout(0.5)(net)\n", + " \n", + " \n", + " return net\n", + " \n", + "\t\t\t" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "jHqGqiMIoGlY", + "colab_type": "code", + "colab": {} + }, + "source": [ + "if K.image_data_format() == 'channels_first':\n", + " inputs = Input(shape = (3, 256, 256))\n", + "else:\n", + " inputs = Input(shape = (256, 256, 3))\n", + "\n", + "x = Convolution2D(32, (3, 3), strides=(2,2), padding='valid')(inputs)\n", + "x = IRCNN_base(x)\n", + "x = Dense(units=3, activation='softmax')(x)\n", + "\n", + "model = Model(inputs, x, name='IRCNN')\n" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "GYHzanvs8N0V", + "colab_type": "code", + "colab": {} + }, + "source": [ + "model.summary()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "outputId": "fc655dea-8a77-4df1-de18-14ead9b66048", + "id": "nUSWmOqfp4Yn", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + } + }, + "source": [ + "from keras_preprocessing.image import ImageDataGenerator\n", + "\n", + "aug = ImageDataGenerator(rotation_range=45,\n", + " fill_mode='wrap',\n", + " samplewise_center=True,\n", + " samplewise_std_normalization=True,\n", + " horizontal_flip=True, \n", + " vertical_flip=True, \n", + " validation_split=0.15)\n", + "bs = 16\n", + "train_path = './train'\n", + "\n", + "train_generator = aug.flow_from_directory(\n", + " train_path,\n", + " target_size=(256, 256),\n", + " batch_size=bs,\n", + " subset='training') # set as training data\n", + "\n", + "validation_generator = aug.flow_from_directory(\n", + " train_path, # same directory as training data\n", + " target_size=(256, 256),\n", + " batch_size=bs,\n", + " subset='validation') # set as validation data" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Found 6358 images belonging to 3 classes.\n", + "Found 1122 images belonging to 3 classes.\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "XT2zm3q7p4Yv", + "colab": {} + }, + "source": [ + "train_step=train_generator.n//train_generator.batch_size\n", + "valid_step=validation_generator.n//validation_generator.batch_size" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "T8j-sPf8p4Yx", + "colab": {} + }, + "source": [ + "from keras import optimizers\n", + "from keras import callbacks\n", + "import math\n", + "\n", + "# adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999)\n", + "sgd = optimizers.SGD(lr=0.01)\n", + "\n", + "filepath=\"./models/weights-{epoch:02d}-{val_acc:.2f}.hdf5\"\n", + "\n", + "mcp = callbacks.ModelCheckpoint(filepath=filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')\n", + "callbacks_list = [mcp]\n", + "\n", + "model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=[\"accuracy\"])" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "bu95wKXcp4Y3", + "colab": {} + }, + "source": [ + "model.fit_generator(\n", + " train_generator,\n", + " steps_per_epoch=train_step,\n", + " validation_data=validation_generator,\n", + " validation_steps=valid_step,\n", + " epochs=20,\n", + " callbacks=callbacks_list,\n", + " verbose=1)\n", + "\n", + "# make lr=0.001 after 20 epochs" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "rijstjXinbJM", + "colab_type": "code", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": 0, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/lymphoma-cancer-classification/model/tfjs_model/group1-shard1of1 b/lymphoma-cancer-classification/model/tfjs_model/group1-shard1of1 new file mode 100644 index 0000000..ebd38e1 Binary files /dev/null and b/lymphoma-cancer-classification/model/tfjs_model/group1-shard1of1 differ diff --git a/lymphoma-cancer-classification/model/tfjs_model/model.json b/lymphoma-cancer-classification/model/tfjs_model/model.json new file mode 100644 index 0000000..cbb21f1 --- /dev/null +++ b/lymphoma-cancer-classification/model/tfjs_model/model.json @@ -0,0 +1 @@ +{"modelTopology": {"keras_version": "2.2.4", "backend": "tensorflow", "model_config": {"class_name": "Model", "config": {"name": "IRCNN", "layers": [{"name": "input_1", "class_name": "InputLayer", "config": {"batch_input_shape": [null, 256, 256, 3], "dtype": "float32", "sparse": false, "name": "input_1"}, "inbound_nodes": []}, {"name": "conv2d_1", "class_name": "Conv2D", "config": {"name": "conv2d_1", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [2, 2], "padding": "valid", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["input_1", 0, 0, {}]]]}, {"name": "average_pooling2d_3", "class_name": "AveragePooling2D", "config": {"name": "average_pooling2d_3", "trainable": true, "pool_size": [3, 3], "padding": "same", "strides": [1, 1], "data_format": "channels_last"}, "inbound_nodes": [[["conv2d_1", 0, 0, {}]]]}, {"name": "conv2d_31", "class_name": "Conv2D", "config": {"name": "conv2d_31", "trainable": true, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["conv2d_1", 0, 0, {}]]]}, {"name": "conv2d_35", "class_name": "Conv2D", "config": {"name": "conv2d_35", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["conv2d_1", 0, 0, {}]]]}, {"name": "conv2d_39", "class_name": "Conv2D", "config": {"name": "conv2d_39", "trainable": true, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["average_pooling2d_3", 0, 0, {}]]]}, {"name": "batch_normalization_29", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_29", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["conv2d_31", 0, 0, {}]]]}, {"name": "batch_normalization_33", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_33", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["conv2d_35", 0, 0, {}]]]}, {"name": "batch_normalization_37", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_37", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["conv2d_39", 0, 0, {}]]]}, {"name": "activation_29", "class_name": "Activation", "config": {"name": "activation_29", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_29", 0, 0, {}]]]}, {"name": "activation_33", "class_name": "Activation", "config": {"name": "activation_33", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_33", 0, 0, {}]]]}, {"name": "activation_37", "class_name": "Activation", "config": {"name": "activation_37", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_37", 0, 0, {}]]]}, {"name": "conv2d_32", "class_name": "Conv2D", "config": {"name": "conv2d_32", "trainable": true, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_29", 0, 0, {}]]]}, {"name": "conv2d_36", "class_name": "Conv2D", "config": {"name": "conv2d_36", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_33", 0, 0, {}]]]}, {"name": "conv2d_40", "class_name": "Conv2D", "config": {"name": "conv2d_40", "trainable": true, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_37", 0, 0, {}]]]}, {"name": "add_19", "class_name": "Add", "config": {"name": "add_19", "trainable": true}, "inbound_nodes": [[["conv2d_31", 0, 0, {}], ["conv2d_32", 0, 0, {}]]]}, {"name": "add_22", "class_name": "Add", "config": {"name": "add_22", "trainable": true}, "inbound_nodes": [[["conv2d_35", 0, 0, {}], ["conv2d_36", 0, 0, {}]]]}, {"name": "add_25", "class_name": "Add", "config": {"name": "add_25", "trainable": true}, "inbound_nodes": [[["conv2d_39", 0, 0, {}], ["conv2d_40", 0, 0, {}]]]}, {"name": "batch_normalization_30", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_30", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["add_19", 0, 0, {}]]]}, {"name": "batch_normalization_34", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_34", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["add_22", 0, 0, {}]]]}, {"name": "batch_normalization_38", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_38", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["add_25", 0, 0, {}]]]}, {"name": "activation_30", "class_name": "Activation", "config": {"name": "activation_30", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_30", 0, 0, {}]]]}, {"name": "activation_34", "class_name": "Activation", "config": {"name": "activation_34", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_34", 0, 0, {}]]]}, {"name": "activation_38", "class_name": "Activation", "config": {"name": "activation_38", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_38", 0, 0, {}]]]}, {"name": "conv2d_33", "class_name": "Conv2D", "config": {"name": "conv2d_33", "trainable": true, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_30", 0, 0, {}]]]}, {"name": "conv2d_37", "class_name": "Conv2D", "config": {"name": "conv2d_37", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_34", 0, 0, {}]]]}, {"name": "conv2d_41", "class_name": "Conv2D", "config": {"name": "conv2d_41", "trainable": true, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_38", 0, 0, {}]]]}, {"name": "add_20", "class_name": "Add", "config": {"name": "add_20", "trainable": true}, "inbound_nodes": [[["conv2d_31", 0, 0, {}], ["conv2d_33", 0, 0, {}]]]}, {"name": "add_23", "class_name": "Add", "config": {"name": "add_23", "trainable": true}, "inbound_nodes": [[["conv2d_35", 0, 0, {}], ["conv2d_37", 0, 0, {}]]]}, {"name": "add_26", "class_name": "Add", "config": {"name": "add_26", "trainable": true}, "inbound_nodes": [[["conv2d_39", 0, 0, {}], ["conv2d_41", 0, 0, {}]]]}, {"name": "batch_normalization_31", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_31", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["add_20", 0, 0, {}]]]}, {"name": "batch_normalization_35", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_35", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["add_23", 0, 0, {}]]]}, {"name": "batch_normalization_39", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_39", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["add_26", 0, 0, {}]]]}, {"name": "activation_31", "class_name": "Activation", "config": {"name": "activation_31", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_31", 0, 0, {}]]]}, {"name": "activation_35", "class_name": "Activation", "config": {"name": "activation_35", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_35", 0, 0, {}]]]}, {"name": "activation_39", "class_name": "Activation", "config": {"name": "activation_39", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_39", 0, 0, {}]]]}, {"name": "conv2d_34", "class_name": "Conv2D", "config": {"name": "conv2d_34", "trainable": true, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_31", 0, 0, {}]]]}, {"name": "conv2d_38", "class_name": "Conv2D", "config": {"name": "conv2d_38", "trainable": true, "filters": 128, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_35", 0, 0, {}]]]}, {"name": "conv2d_42", "class_name": "Conv2D", "config": {"name": "conv2d_42", "trainable": true, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["activation_39", 0, 0, {}]]]}, {"name": "add_21", "class_name": "Add", "config": {"name": "add_21", "trainable": true}, "inbound_nodes": [[["conv2d_31", 0, 0, {}], ["conv2d_34", 0, 0, {}]]]}, {"name": "add_24", "class_name": "Add", "config": {"name": "add_24", "trainable": true}, "inbound_nodes": [[["conv2d_35", 0, 0, {}], ["conv2d_38", 0, 0, {}]]]}, {"name": "add_27", "class_name": "Add", "config": {"name": "add_27", "trainable": true}, "inbound_nodes": [[["conv2d_39", 0, 0, {}], ["conv2d_42", 0, 0, {}]]]}, {"name": "batch_normalization_32", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_32", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["add_21", 0, 0, {}]]]}, {"name": "batch_normalization_36", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_36", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["add_24", 0, 0, {}]]]}, {"name": "batch_normalization_40", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_40", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["add_27", 0, 0, {}]]]}, {"name": "activation_32", "class_name": "Activation", "config": {"name": "activation_32", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_32", 0, 0, {}]]]}, {"name": "activation_36", "class_name": "Activation", "config": {"name": "activation_36", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_36", 0, 0, {}]]]}, {"name": "activation_40", "class_name": "Activation", "config": {"name": "activation_40", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_40", 0, 0, {}]]]}, {"name": "concatenate_3", "class_name": "Concatenate", "config": {"name": "concatenate_3", "trainable": true, "axis": -1}, "inbound_nodes": [[["activation_32", 0, 0, {}], ["activation_36", 0, 0, {}], ["activation_40", 0, 0, {}]]]}, {"name": "conv2d_43", "class_name": "Conv2D", "config": {"name": "conv2d_43", "trainable": true, "filters": 32, "kernel_size": [3, 3], "strides": [2, 2], "padding": "valid", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 3.9999998989515007e-05}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["concatenate_3", 0, 0, {}]]]}, {"name": "batch_normalization_41", "class_name": "BatchNormalization", "config": {"name": "batch_normalization_41", "trainable": true, "axis": -1, "momentum": 0.9997, "epsilon": 0.001, "center": true, "scale": false, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["conv2d_43", 0, 0, {}]]]}, {"name": "activation_41", "class_name": "Activation", "config": {"name": "activation_41", "trainable": true, "activation": "relu"}, "inbound_nodes": [[["batch_normalization_41", 0, 0, {}]]]}, {"name": "global_average_pooling2d_1", "class_name": "GlobalAveragePooling2D", "config": {"name": "global_average_pooling2d_1", "trainable": true, "data_format": "channels_last"}, "inbound_nodes": [[["activation_41", 0, 0, {}]]]}, {"name": "dropout_3", "class_name": "Dropout", "config": {"name": "dropout_3", "trainable": true, "rate": 0.5, "noise_shape": null, "seed": null}, "inbound_nodes": [[["global_average_pooling2d_1", 0, 0, {}]]]}, {"name": "dense_1", "class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "units": 3, "activation": "softmax", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_3", 0, 0, {}]]]}], "input_layers": [["input_1", 0, 0]], "output_layers": [["dense_1", 0, 0]]}}, "training_config": {"optimizer_config": {"class_name": "SGD", "config": {"lr": 0.009999999776482582, "momentum": 0.0, "decay": 0.0, "nesterov": false}}, "loss": "categorical_crossentropy", "metrics": ["accuracy"], "sample_weight_mode": null, "loss_weights": null}}, "weightsManifest": [{"paths": ["group1-shard1of1"], "weights": [{"name": "batch_normalization_29/beta", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_29/moving_mean", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_29/moving_variance", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_30/beta", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_30/moving_mean", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_30/moving_variance", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_31/beta", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_31/moving_mean", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_31/moving_variance", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_32/beta", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_32/moving_mean", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_32/moving_variance", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_33/beta", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_33/moving_mean", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_33/moving_variance", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_34/beta", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_34/moving_mean", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_34/moving_variance", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_35/beta", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_35/moving_mean", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_35/moving_variance", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_36/beta", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_36/moving_mean", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_36/moving_variance", "shape": [128], "dtype": "float32"}, {"name": "batch_normalization_37/beta", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_37/moving_mean", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_37/moving_variance", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_38/beta", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_38/moving_mean", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_38/moving_variance", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_39/beta", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_39/moving_mean", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_39/moving_variance", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_40/beta", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_40/moving_mean", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_40/moving_variance", "shape": [64], "dtype": "float32"}, {"name": "batch_normalization_41/beta", "shape": [32], "dtype": "float32"}, {"name": "batch_normalization_41/moving_mean", "shape": [32], "dtype": "float32"}, {"name": "batch_normalization_41/moving_variance", "shape": [32], "dtype": "float32"}, {"name": "conv2d_1/kernel", "shape": [3, 3, 3, 32], "dtype": "float32"}, {"name": "conv2d_1/bias", "shape": [32], "dtype": "float32"}, {"name": "conv2d_31/kernel", "shape": [1, 1, 32, 64], "dtype": "float32"}, {"name": "conv2d_31/bias", "shape": [64], "dtype": "float32"}, {"name": "conv2d_32/kernel", "shape": [1, 1, 64, 64], "dtype": "float32"}, {"name": "conv2d_32/bias", "shape": [64], "dtype": "float32"}, {"name": "conv2d_33/kernel", "shape": [1, 1, 64, 64], "dtype": "float32"}, {"name": "conv2d_33/bias", "shape": [64], "dtype": "float32"}, {"name": "conv2d_34/kernel", "shape": [1, 1, 64, 64], "dtype": "float32"}, {"name": "conv2d_34/bias", "shape": [64], "dtype": "float32"}, {"name": "conv2d_35/kernel", "shape": [3, 3, 32, 128], "dtype": "float32"}, {"name": "conv2d_35/bias", "shape": [128], "dtype": "float32"}, {"name": "conv2d_36/kernel", "shape": [3, 3, 128, 128], "dtype": "float32"}, {"name": "conv2d_36/bias", "shape": [128], "dtype": "float32"}, {"name": "conv2d_37/kernel", "shape": [3, 3, 128, 128], "dtype": "float32"}, {"name": "conv2d_37/bias", "shape": [128], "dtype": "float32"}, {"name": "conv2d_38/kernel", "shape": [3, 3, 128, 128], "dtype": "float32"}, {"name": "conv2d_38/bias", "shape": [128], "dtype": "float32"}, {"name": "conv2d_39/kernel", "shape": [1, 1, 32, 64], "dtype": "float32"}, {"name": "conv2d_39/bias", "shape": [64], "dtype": "float32"}, {"name": "conv2d_40/kernel", "shape": [1, 1, 64, 64], "dtype": "float32"}, {"name": "conv2d_40/bias", "shape": [64], "dtype": "float32"}, {"name": "conv2d_41/kernel", "shape": [1, 1, 64, 64], "dtype": "float32"}, {"name": "conv2d_41/bias", "shape": [64], "dtype": "float32"}, {"name": "conv2d_42/kernel", "shape": [1, 1, 64, 64], "dtype": "float32"}, {"name": "conv2d_42/bias", "shape": [64], "dtype": "float32"}, {"name": "conv2d_43/kernel", "shape": [3, 3, 256, 32], "dtype": "float32"}, {"name": "dense_1/kernel", "shape": [32, 3], "dtype": "float32"}, {"name": "dense_1/bias", "shape": [3], "dtype": "float32"}]}]} \ No newline at end of file diff --git a/lymphoma-cancer-classification/model/weights-keras.hdf5 b/lymphoma-cancer-classification/model/weights-keras.hdf5 new file mode 100644 index 0000000..c699111 Binary files /dev/null and b/lymphoma-cancer-classification/model/weights-keras.hdf5 differ