<jupyter_start><jupyter_text><NAME> Acute Myeloid / Lymphoblastic Leukemia AI Research Project  Detecting Acute Lymphoblastic Leukemia With Keras & Tensorflow **Using the ACUTE LEUKEMIA CLASSIFICATION USING CONVOLUTION NEURAL NETWORK IN CLINICAL DECISION SUPPORT SYSTEM paper & ALL_IDB1**    ![P<NAME> Acute Myeloid / Lymphoblastic Leukemia AI Research Project](https://www.PeterMossAmlAllResearch.com/media/images/banner.png)In this notebook you will create and train a Convolutional Neural Network, (KAllCNN_IDB1), to detect Acute Lymphoblastic Leukemia (ALL) using Keras & Tensorflow on Google Colab. The architecture you will create is based on the network proposed in the [ACUTE LEUKEMIA CLASSIFICATION USING CONVOLUTION NEURAL NETWORK IN CLINICAL DECISION SUPPORT SYSTEM](https://airccj.org/CSCP/vol7/csit77505.pdf "ACUTE LEUKEMIA CLASSIFICATION USING CONVOLUTION NEURAL NETWORK IN CLINICAL DECISION SUPPORT SYSTEM") paper by Thanh.TTP, <NAME>, Jin-Hyeok Park, Kwang-Seok Moon, Suk-Hwan Lee, and Ki-Ryong Kwon.This notebook is written by [<NAME>](https://www.petermossamlallresearch.com/team/adam-milton-barker/profile "<NAME>") and based on a notebook written by [<NAME>](https://www.petermossamlallresearch.com/team/amita-kapoor/profile "<NAME>"), and [<NAME>](https://www.petermossamlallresearch.com/students/student/taru-jain/profile "<NAME>"), one of the students from the [AML/ALL AI Student Program](https://www.petermossamlallresearch.com/students/ "AML/ALL AI Student Program").  ALL Image Database for Image Processing![Acute Lymphoblastic Leukemia Image Database for Image Processing](https://www.petermossamlallresearch.com/media/images/repositories/ALL_IDB1_Augmented_Slides.png)_Fig 1. Samples of augmented data generated using ALL_IDB1 from the Acute Lymphoblastic Leukemia Image Database for Image Processing dataset._  The [Acute Lymphoblastic Leukemia Image Database for Image Processing](https://homes.di.unimi.it/scotti/all/) dataset created by [<NAME>, Associate Professor Dipartimento di Informatica, Università degli Studi di Milano](https://homes.di.unimi.it/scotti/) is used in this notebook, you will use the **ALL_IDB1** dataset.  Gain Access To ALL-IDBYou you need to be granted access to use the Acute Lymphoblastic Leukemia Image Database for Image Processing dataset. You can find the application form and information about getting access to the dataset on [this page](https://homes.di.unimi.it/scotti/all/download) as well as information on how to contribute back to the project [here](https://homes.di.unimi.it/scotti/all/results.php).  Clone AML & ALL Classifiers RepositoryFirst of all you should clone the [AML & ALL Classifiers](https://github.com/AMLResearchProject/AML-ALL-Classifiers/ "AML & ALL Classifiers") repo to your device. To do this you can navigate to the location you want to clone the repository to on your device using terminal (cd Your/Clone/Location), and then use the following command:```  $ git clone https://github.com/AMLResearchProject/AML-ALL-Classifiers.git```Once you have used the command above you will see a directory called **AML-ALL-Classifiers** in the location you chose to clone the repo to. In terminal, navigate to the **AML-ALL-Classifiers/Python/_Keras/AllCNN/Paper_1/ALL_IDB1/Non_Augmented/** directory, this is your project root directory.  Google Drive / Colab   Upload Project Root To Google DriveNow you need to upload the project root to your Google Drive, placing the jpg files from the ALL_IDB1 dataset in the **Model/Data/Training/** directory.  Mount Google Drive In Colab  ![P<NAME> Acute Myeloid / Lymphoblastic Leukemia AI Research Project](https://www.PeterMossAmlAllResearch.com/media/images/repositories/Colab.png)_Fig 2. Example of Colab connected to Google Drive._The first step is to mount your Google Drive in Colab.  **To do this execute the following code block:**<jupyter_code>%matplotlib inline

import sys
from google.colab import drive
drive.mount('/content/gdrive', force_remount=True)<jupyter_output>Go to this URL in a browser: ###
Enter your authorization code:
··········
Mounted at /content/gdrive<jupyter_text>Install & Import Requirements**Install and import requirements by executing the following code block:**<jupyter_code>!pip install keras_metrics

import os,  cv2, keras, keras_metrics, matplotlib.image, random
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '0' 

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from keras import backend as K
from keras import layers
from keras.layers import Activation, Dense, Dropout, Conv2D
from keras.layers import Flatten, MaxPooling2D, ZeroPadding2D
from keras.models import load_model, Model, model_from_json, Sequential
from keras.optimizers import Adam
from keras.preprocessing import image
from keras.utils import np_utils

from numpy.random import seed

from pathlib import Path

from scipy import ndimage
from sklearn.utils import shuffle
from sklearn.metrics import confusion_matrix, precision_score, recall_score
from sklearn.metrics import roc_auc_score

from tensorflow import set_random_seed

%matplotlib inline

seed(3)
set_random_seed(3)<jupyter_output>Collecting keras_metrics
  Downloading https://files.pythonhosted.org/packages/32/c9/a87420da8e73de944e63a8e9cdcfb1f03ca31a7c4cdcdbd45d2cdf13275a/keras_metrics-1.1.0-py2.py3-none-any.whl
Requirement already satisfied: Keras>=2.1.5 in /usr/local/lib/python3.6/dist-packages (from keras_metrics) (2.2.5)
Requirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.6/dist-packages (from Keras>=2.1.5->keras_metrics) (1.3.1)
Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from Keras>=2.1.5->keras_metrics) (1.12.0)
Requirement already satisfied: keras-preprocessing>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from Keras>=2.1.5->keras_metrics) (1.1.0)
Requirement already satisfied: numpy>=1.9.1 in /usr/local/lib/python3.6/dist-packages (from Keras>=2.1.5->keras_metrics) (1.17.3)
Requirement already satisfied: keras-applications>=1.0.8 in /usr/local/lib/python3.6/dist-packages (from Keras>=2.1.5->keras_metrics) (1.0.8)
Requirement already satisfi[...]<jupyter_text>Program SettingsUpdate the settings below to match the locations of the dataset, augmented and test directories on your Google Drive.. The Classes directory path is added allowing the files in the Classes directory to be executed. **Once you have updated the settings below, execute the following code block:**<jupyter_code>local_drive = "/content/gdrive/My Drive/"
project_root = "AMLResearchProject/AML-ALL-Classifiers/Python/_Keras/AllCNN/Paper_1/ALL_IDB1/Non_Augmented/"
project_root_full = local_drive + project_root

sys.path.append(project_root_full + 'Classes')

import Data as AllCnnData
import Helpers as AllCnnHelpers
import Test as AllCnnTest

core = AllCnnHelpers.Helpers("Classifier", project_root_full)
configs = core.confs

model_root_path = project_root_full + configs["model_root"]
model_path = model_root_path + "/" + configs["model_file"]

data_dir = model_root_path + configs["data_dir"]
training_dir = model_root_path + data_dir + "/" + configs["training_dir"]
validation_dir = model_root_path + data_dir + "/" + configs["validation_dir"]

batch_size = configs["batch_size"]
epochs = configs["epochs"]
val_steps = configs["val_steps"]

core.logger.info("Class Path: " + project_root + 'Classes')
core.logger.info("Data Path: " + data_dir)
core.logger.info("Model Path: " + model_path)
core.logger.info("Model Root Dir: " + model_root_path)
core.logger.info("Project Root: " + project_root)
core.logger.info("Program settings setup complete.")<jupyter_output>2019-10-26 18:26:13,274 - Classifier - INFO - Helpers class initialization complete.
2019-10-26 18:26:13,589 - Classifier - INFO - Class Path: AMLResearchProject/AML-ALL-Classifiers/Python/_Keras/AllCNN/Paper_1/ALL_IDB1/Non_Augmented/Classes
2019-10-26 18:26:13,591 - Classifier - INFO - Data Path: /content/gdrive/My Drive/AMLResearchProject/AML-ALL-Classifiers/Python/_Keras/AllCNN/Paper_1/ALL_IDB1/Non_Augmented/Model/Data/Training
2019-10-26 18:26:13,593 - Classifier - INFO - Model Path: /content/gdrive/My Drive/AMLResearchProject/AML-ALL-Classifiers/Python/_Keras/AllCNN/Paper_1/ALL_IDB1/Non_Augmented/Model/model.json
2019-10-26 18:26:13,596 - Classifier - INFO - Model Root Dir: /content/gdrive/My Drive/AMLResearchProject/AML-ALL-Classifiers/Python/_Keras/AllCNN/Paper_1/ALL_IDB1/Non_Augmented/Model
2019-10-26 18:26:13,597 - Classifier - INFO - Project Root: AMLResearchProject/AML-ALL-Classifiers/Python/_Keras/AllCNN/Paper_1/ALL_IDB1/Non_Augmented/
2019-10-26 18:26:13,599 - Classifier -[...]<jupyter_text>Prepare Your DataNow you need to prepare your training and validation data.   Proposed Training / Validation SetsThe training and validation sets proposed in the paper are as follows, where **Normal cell** refers to ALL negative examples and **Abnormal cell** refers to ALL positive examples.| | Training Set | Test Set || --- | --- | --- || Normal cell | 40 | 19 || Abnormal cell | 40 | 9 || **Total** | **80** | **28** | If you haven't already, navigate to the **AML-ALL-Classifiers/Python/_Keras/AllCNN/Paper_1/ALL_IDB1/Non_Augmented/Model/Data/Training/** directory and upload the jpg files from ALL_IDB1.  Sort Your Data**Ensure that you have completed all steps above and then execute the following code block to sort/split your data, recreating the dataset splits proposed in the paper:** (This may take some time)<jupyter_code>AllData = AllCnnData.Data(core.logger, configs)
data, labels = AllData.prepare_data(data_dir)
X_train, y_train, X_test, y_test = AllData.data_and_labels(data, labels)<jupyter_output>2019-10-26 18:26:20,251 - Classifier - INFO - Positive training data length: 49
2019-10-26 18:26:20,253 - Classifier - INFO - Negative training data length: 59
2019-10-26 18:26:20,254 - Classifier - INFO - Total training data length: 108

2019-10-26 18:26:20,258 - Classifier - INFO - Paper positive training dataset recreated, size: 40
2019-10-26 18:26:20,262 - Classifier - INFO - Paper negative training dataset recreated, size: 40
2019-10-26 18:26:20,264 - Classifier - INFO - Total training dataset recreated: 80

2019-10-26 18:26:20,266 - Classifier - INFO - Paper positive validation data created, size: 9
2019-10-26 18:26:20,267 - Classifier - INFO - Paper negative validation data created, size: 19
2019-10-26 18:26:20,269 - Classifier - INFO - Total validation dataset recreated: 28

2019-10-26 18:26:35,295 - Classifier - INFO - Validation data shape: (28, 50, 50, 3)
2019-10-26 18:26:35,297 - Classifier - INFO - Validation labels shape: (28, 2)

2019-10-26 18:27:15,835 - Classifier - IN[...]<jupyter_text>Shuffle Data Shuffle the new training data, remembering to use our seed of 3.**To shuffle the training date, execute the following code block:**<jupyter_code>data = np.asarray(X_train)
labels = np.asarray(y_train)

Data, Label = shuffle(data, labels, random_state = 3)
data_list = [Data, Label]<jupyter_output><empty_output><jupyter_text>View Dataset Sample**To view a sample of your dataset, execute the following code block:**<jupyter_code>y = np.argmax(Label, axis=-1)
f, ax = plt.subplots(4, 5, figsize=(30, 7))

for i in range(0, 20):
    ax[i//5, i%5].imshow(Data[i])
    if y[i]==1:
        ax[i//5, i%5].set_title("Non-ALL")
    else:
        ax[i//5, i%5].set_title("ALL")<jupyter_output><empty_output><jupyter_text>Model Architecture_Fig 3. Proposed Architecture  ([Source](https://airccj.org/CSCP/vol7/csit77505.pdf "Source"))_    Proposed ArchitectureIn the [ACUTE LEUKEMIA CLASSIFICATION USING CONVOLUTION NEURAL NETWORK IN CLINICAL DECISION SUPPORT SYSTEM](https://airccj.org/CSCP/vol7/csit77505.pdf "ACUTE LEUKEMIA CLASSIFICATION USING CONVOLUTION NEURAL NETWORK IN CLINICAL DECISION SUPPORT SYSTEM") paper the authors explain the layers they used to create their convolutional neural network.> "In this work, we proposed a network contains 4 layers. The first 3 layers for detecting featuresand the other two layers (Fully connected and Softmax) are for classifying the features. The inputimage has the size [50x50x3]. The receptive field (or the filter size) is 5x5. The stride is 1 then wemove the filters one pixel at a time. The zero-padding is 2. It will allow us to control the spatialsize of the output image (we will use it to exactly preserve the spatial size of the input volume sothe input and output width and height are the same). During the experiment, we found that in ourcase, altering the size of original image during the convolution lead to decrease the accuracyabout 40%. Thus the output image after convolution layer 1 has the same size with the inputimage."> "The convolution layer 2 has the same structure with the convolution layer 1. The filter size is 5x5,the stride is 1 and the zero-padding is 2. The number of feature maps (the channel or the depth) inour case is 30. If the number of feature maps is lower or higher than 30, the accuracy willdecrease 50%. By experiment, we found the accuracy also decrease 50% if we removeConvolution layer 2.""> "The Max-Pooling layer 25x25 has Filter size is 2 and stride is 2. The fully connected layer has 2neural. Finally, we use the Softmax layer for the classification. "**To recreate the proposed architecture, execute the following code block:**<jupyter_code>model = Sequential()
model.name="KAllCnn_IDB1"

model.add(ZeroPadding2D(padding=(2, 2), input_shape=X_train.shape[1:]))
model.add(Conv2D(30, (5, 5), strides=1, padding = "valid", input_shape = X_train.shape[1:], activation = 'relu'))
model.add(Dropout(0.4))

model.add(ZeroPadding2D(padding=(2, 2), input_shape=X_train.shape[1:]))
model.add(Conv2D(30, (5, 5), strides=1, padding = "valid", activation = 'relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2, padding = 'valid'))
model.add(Dropout(0.6))

model.add(Flatten())
model.add(Dense(2))
model.add(Activation("softmax"))<jupyter_output>WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:66: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:541: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4432: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:148: The name tf.placeholder_with_default is deprecated. Please use tf.compat.v1.placeholder_with_default instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3733: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a[...]<jupyter_text>View Network Architecture (Summary)**To view a summary of your networ architecture, execute the following code block:**<jupyter_code>model.summary()<jupyter_output>Model: "KAllCnn_IDB1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
zero_padding2d_1 (ZeroPaddin (None, 54, 54, 3)         0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 50, 50, 30)        2280      
_________________________________________________________________
dropout_1 (Dropout)          (None, 50, 50, 30)        0         
_________________________________________________________________
zero_padding2d_2 (ZeroPaddin (None, 54, 54, 30)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 50, 50, 30)        22530     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 25, 25, 30)        0         
______________________________________________________[...]<jupyter_text>Compile &  Fit Your ModelIn the following code block first the program complies the model, then fits the model. The **validation_data**, _(X_test, y_test)_, and the number of **validation_steps** are passed to the **Keras model.fit** function. This means that in addition to showing training loss, accuracy, precision and recall the program will show validation loss, accuracy, precision and recall in its output.**Assuming you have completed all above steps you can execute the following code block to beging training:**<jupyter_code>optimizer = keras.optimizers.rmsprop(lr = 0.0001, decay = 1e-6)
model.compile(loss = 'binary_crossentropy', optimizer = optimizer, 
              metrics = ['accuracy', keras_metrics.precision(), keras_metrics.recall()])

history = model.fit(X_train, y_train, validation_data = (X_test, y_test), validation_steps = val_steps, 
                    steps_per_epoch = int(len(X_train)/batch_size), epochs = epochs)
history<jupyter_output>WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/optimizers.py:793: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3657: The name tf.log is deprecated. Please use tf.math.log instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/nn_impl.py:183: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1033: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1020: The name tf.assign is deprecated. Please use tf.compat.v1[...]<jupyter_text>Evaluate Your ModelNow we will evaluate how well our model has done.  View Metrics Names**Execute the following code block to view the names of the metrics used during training:**<jupyter_code>model.metrics_names<jupyter_output><empty_output><jupyter_text>Evaluate Model & Print Metrics**Execute the following code block to evaluate your model and print the training metrics:**<jupyter_code>score = model.evaluate(X_test, y_test, verbose=0)
score<jupyter_output><empty_output><jupyter_text>Generate AUC Score**Execute the following code block to generate your AUC score:**<jupyter_code>roc_auc_score(y_test, model.predict_proba(X_test))<jupyter_output><empty_output><jupyter_text>ResultsBelow are the training results for 500 epochs.| Loss   |  Accuracy   | Precision   | Recall   | AUC ||------|---|---|--|--|| 0.131 (~0.13)  | 0.928 (~93%)   | 0.904 (~0.91)   | 0.999 (~1.0) | 0.994 (~1.0) |  Visualise Metrics  Training Loss & Accuracy<jupyter_code>training_acc = history.history['acc']
training_loss = history.history['loss']

plt.figure(figsize = (8, 8))
plt.subplot(2, 1, 1)
plt.plot(training_acc, label = 'Training Accuracy')
plt.legend(loc = 'lower right')
plt.ylabel('Accuracy')
plt.ylim([min(plt.ylim()),1])
plt.title('Training Accuracy')

plt.subplot(2, 1, 2)
plt.plot(training_loss, label = 'Training Loss')
plt.legend(loc = 'upper right')
plt.ylabel('Cross Entropy')
plt.ylim([0,max(plt.ylim())])
plt.title('Training Loss')
plt.show()<jupyter_output><empty_output><jupyter_text>Validation Loss & Accuracy<jupyter_code>validation_acc = history.history['val_acc']
validation_loss = history.history['val_loss']

plt.figure(figsize = (8, 8))
plt.subplot(2, 1, 1)
plt.plot(validation_acc, label = 'Validation Accuracy')
plt.legend(loc = 'lower right')
plt.ylabel('Accuracy')
plt.ylim([min(plt.ylim()),1])
plt.title('Validation Accuracy')

plt.subplot(2, 1, 2)
plt.plot(validation_loss, label = 'Validation Loss')
plt.legend(loc = 'upper right')
plt.ylabel('Cross Entropy')
plt.ylim([0,max(plt.ylim())])
plt.title('Validation Loss')
plt.show()<jupyter_output><empty_output><jupyter_text>Predictions<jupyter_code>y_pred = model.predict(X_test)
y_pred<jupyter_output><empty_output><jupyter_text>Confusion Matrix<jupyter_code>matrix = confusion_matrix(y_test.argmax(axis=1), y_pred.argmax(axis=1))
matrix
plt.imshow(matrix, cmap=plt.cm.Blues)
plt.xlabel("Predicted labels")
plt.ylabel("True labels")
plt.xticks([], [])
plt.yticks([], [])
plt.title('Confusion matrix ')
plt.colorbar()
plt.show()<jupyter_output><empty_output><jupyter_text>Results on ALL-IDB (Images)<jupyter_code>TN = matrix[0][0]
FN = matrix[0][1]
TP = matrix[1][0]
FP = matrix[1][1]

(TP, FP, TN, FN)
test_len = len(X_test)

TPP = (TP * 100) / test_len
FPP = (FP * 100) / test_len
FNP = (FN * 100) / test_len
TNP = (TN * 100) / test_len

(TPP, FPP, TNP, FNP)
specificity = TN/(TN+FP) 
specificity
misc = FP + FN
misc
misc = (misc * 100) / test_len
misc<jupyter_output><empty_output><jupyter_text>| Figures of merit  | Value | Percentage || ----------------  | ----- | ---------- || True Positives | 2 | 7.14% || False Positives | 7 | 25.00% | True Negatives | 19 | 67.96% || False Negatives | 0 | 0.00% || Misclassification | 7 | 25.00% || Sensitivity / Recall | 1.0 | 100% || Specificity | 0.73 | 73% |  Save Your Keras ModelNow you will save your Keras model and weights so that they can be used again.   Save Model As Json<jupyter_code>with open(model_path, "w") as file:
    file.write(model.to_json())<jupyter_output><empty_output><jupyter_text>Save Weights<jupyter_code>model.save_weights(model_root_path + "/weights.h5")<jupyter_output><empty_output><jupyter_text>Load Your Saved Keras Model<jupyter_code>with open(model_path, "r") as file:
    jmodel = file.read()

K.set_learning_phase(0)
model = model_from_json(jmodel)
model.load_weights(model_root_path + "/weights.h5")

model.summary()<jupyter_output>Model: "KAllCnn_IDB1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
zero_padding2d_1 (ZeroPaddin (None, 54, 54, 3)         0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 50, 50, 30)        2280      
_________________________________________________________________
dropout_1 (Dropout)          (None, 50, 50, 30)        0         
_________________________________________________________________
zero_padding2d_2 (ZeroPaddin (None, 54, 54, 30)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 50, 50, 30)        22530     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 25, 25, 30)        0         
______________________________________________________[...]
{'fraction_non_alphanumeric': 0.1138327904451683, 'fraction_numerical': 0.039695982627578716, 'mean_word_length': 5.228293210711388, 'pattern_counts': {'":': 0, '<': 84, '<?xml version=': 0, '>': 103, 'https://': 17, 'lorem ipsum': 0, 'www.': 7, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '20', 'dir': 'jupyter-structured-clean-dedup', 'id': '628269', 'license': 'MIT', 'n_tokens_mistral': 7926, 'n_tokens_neox': 7079, 'n_words': 2056, 'path': 'Projects/Keras/AllCNN/Paper_1/ALL_IDB1/Non_Augmented/AllCNN.ipynb', 'repo_name': 'AcuteMyeloidLeukemiaAiResearchProject/AML-ALL-Classifiers', 'size': '23089'}