{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nimport shutil\n\n# Load the csv file\ndata_df = pd.read_csv('/kaggle/input/prostate-cancer-grade-assessment/train.csv')\n\n# Create a directory for ISUP_0 images\nos.makedirs('/kaggle/working/ISUP_0', exist_ok=True)\n\n# Copy 50 images for each isup grade to the corresponding directory\nfor grade in range(0, 6):\n    grade_dir = f'/kaggle/working/ISUP_{grade}'\n    os.makedirs(grade_dir, exist_ok=True)\n    counter = 0\n    for index, row in data_df.iterrows():\n        if row['isup_grade'] == grade and counter < 1000:\n            src = '/kaggle/input/tile-pre-processing/' + row['image_id'] + '.png'\n            src = os.path.join(\"/kaggle/input/tile-pre-processing/512x512x3\", os.path.basename(src))\n            dst = grade_dir + '/' + row['image_id'] + '.png'\n            shutil.copy(src, dst)\n            counter += 1\n        if counter == 1000: \n\n            break\n\nprint(\"Number of files in each directory:\")\nfor grade in range(6):\n    grade_dir = f'/kaggle/working/ISUP_{grade}'\n    num_files = len(os.listdir(grade_dir))\n    print(f\"{grade_dir}: {num_files} files\")\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-13T08:12:27.508075Z","iopub.execute_input":"2023-03-13T08:12:27.509246Z","iopub.status.idle":"2023-03-13T08:13:49.484751Z","shell.execute_reply.started":"2023-03-13T08:12:27.50912Z","shell.execute_reply":"2023-03-13T08:13:49.483668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport shutil\nimport random\n\n# set the parent directory\nparent_dir = '/kaggle/working/'\n\n# set the subdirectories\nsubdirs = [\"ISUP_0\", \"ISUP_1\", \"ISUP_2\", \"ISUP_3\", \"ISUP_4\", \"ISUP_5\"]\n\n# set the percentage split for train, val, and test\ntrain_split = 0.6\nval_split = 0.2\ntest_split = 0.2\n\nfor subdir in subdirs:\n    # create directories for train, val, and test data\n    train_dir = os.path.join(parent_dir, \"train\", subdir)\n    os.makedirs(train_dir, exist_ok=True)\n    val_dir = os.path.join(parent_dir, \"val\", subdir)\n    os.makedirs(val_dir, exist_ok=True)\n    test_dir = os.path.join(parent_dir, \"test\", subdir)\n    os.makedirs(test_dir, exist_ok=True)\n    \n    # get all the files in the subdirectory\n    subdir_path = os.path.join(parent_dir, subdir)\n    files = os.listdir(subdir_path)\n    num_files = len(files)\n    \n    # shuffle the files randomly\n    random.shuffle(files)\n    \n    # calculate the number of files for each split\n    num_train = int(num_files * train_split)\n    num_val = int(num_files * val_split)\n    \n    # copy the files to the corresponding directories\n    print(f\"Found {num_files} files in directory {subdir_path}\")\n    print(f\"Copying {num_train} files to train directory\")\n    for i in range(num_train):\n        file = files[i]\n        src = os.path.join(subdir_path, file)\n        dst = os.path.join(train_dir, file)\n        shutil.copy(src, dst)\n    \n    print(f\"Copying {num_val} files to validation directory\")\n    for i in range(num_train, num_train+num_val):\n        file = files[i]\n        src = os.path.join(subdir_path, file)\n        dst = os.path.join(val_dir, file)\n        shutil.copy(src, dst)\n    \n    print(f\"Copying {num_files-num_train-num_val} files to test directory\")\n    for i in range(num_train+num_val, num_files):\n        file = files[i]\n        src = os.path.join(subdir_path, file)\n        dst = os.path.join(test_dir, file)\n        shutil.copy(src, dst)\n","metadata":{"execution":{"iopub.status.busy":"2023-03-13T08:13:49.486898Z","iopub.execute_input":"2023-03-13T08:13:49.487562Z","iopub.status.idle":"2023-03-13T08:13:58.885836Z","shell.execute_reply.started":"2023-03-13T08:13:49.487522Z","shell.execute_reply":"2023-03-13T08:13:58.882385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Splits your data into training, validation, and test sets and moves the files instead of copying them**","metadata":{}},{"cell_type":"code","source":"import os\nimport shutil\n\ndata_dir = '/kaggle/working'\n\n# list of directories to remove\ndirs_to_remove = ['ISUP_0', 'ISUP_1', 'ISUP_2', 'ISUP_3', 'ISUP_4', 'ISUP_5']\n\n# iterate over directories and remove them\nfor directory in dirs_to_remove:\n    dir_path = os.path.join(data_dir, directory)\n    if os.path.exists(dir_path):\n        shutil.rmtree(dir_path)","metadata":{"execution":{"iopub.status.busy":"2023-03-13T08:14:42.074456Z","iopub.execute_input":"2023-03-13T08:14:42.074946Z","iopub.status.idle":"2023-03-13T08:14:42.664325Z","shell.execute_reply.started":"2023-03-13T08:14:42.074904Z","shell.execute_reply":"2023-03-13T08:14:42.663263Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Permanently delete the directories and their contents**","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom PIL import Image\nImage.MAX_IMAGE_PIXELS = 10000000000\n\n# Set the seed for reproducibility\nnp.random.seed(0)\ntf.random.set_seed(0)\n\n# Set the directories\ntrain_dir = \"/kaggle/working/train\"\nval_dir = \"/kaggle/working/val\"\ntest_dir = \"/kaggle/working/test\"\n\n# Set the parameters\nimg_size = (224, 224)\nbatch_size = 32\n\n# Create the train data generator with data augmentation\ntrain_datagen = keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode=\"nearest\",\n)\n\n# Create the validation and test data generators\nval_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\ntest_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\n# Load the train, validation, and test data\ntrain_data = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=True,\n    seed=0,\n)\n\nval_data = val_datagen.flow_from_directory(\n    val_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\ntest_data = test_datagen.flow_from_directory(\n    test_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\n# Define the model\nmodel = keras.Sequential(\n    [\n        layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\", input_shape=(224, 224, 3)),\n        layers.MaxPooling2D(pool_size=(2, 2)),\n        layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"),\n        layers.MaxPooling2D(pool_size=(2, 2)),\n        layers.Flatten(),\n        layers.Dense(128, activation=\"relu\"),\n        layers.Dropout(0.5),\n        layers.Dense(6, activation=\"softmax\"),\n    ]\n)\n\n# Compile the model\nmodel.compile(\n    optimizer=\"adam\",\n    loss=\"categorical_crossentropy\",\n    metrics=[\"accuracy\"],\n)\n\n# Train the model\nhistory = model.fit(\n    train_data,\n    validation_data=val_data,\n    epochs=10,\n)\n\n# Evaluate the model on the test data\ntest_loss, test_acc = model.evaluate(test_data)\nprint(\"Test loss:\", test_loss)\nprint(\"Test accuracy:\", test_acc)\n","metadata":{"execution":{"iopub.status.busy":"2023-02-23T16:05:12.87374Z","iopub.execute_input":"2023-02-23T16:05:12.8742Z","iopub.status.idle":"2023-02-23T16:48:20.016356Z","shell.execute_reply.started":"2023-02-23T16:05:12.874164Z","shell.execute_reply":"2023-02-23T16:48:20.014489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Training the Model 1**","metadata":{}},{"cell_type":"code","source":"from PIL import Image\nimport os\n\n# Path to the image file\nimage_path = \"/kaggle/input/tile-pre-processing/512x512x3/0005f7aaab2800f6170c399693a96917.png\"\n\n# Load the image file\nimage = Image.open(image_path)\n\n# Get the image size\nwidth, height = image.size\n\n# Get the image format (e.g. JPEG, PNG, etc.)\nimage_format = image.format\n\n# Get the color mode (e.g. RGB, grayscale, etc.)\ncolor_mode = image.mode\n\n# Print the image details\nprint(\"Image size: {} x {}\".format(width, height))\nprint(\"Image format: {}\".format(image_format))\nprint(\"Color mode: {}\".format(color_mode))\n\n# Close the image file\nimage.close()\n","metadata":{"execution":{"iopub.status.busy":"2023-02-23T19:37:45.237761Z","iopub.execute_input":"2023-02-23T19:37:45.238143Z","iopub.status.idle":"2023-02-23T19:37:45.294865Z","shell.execute_reply.started":"2023-02-23T19:37:45.238113Z","shell.execute_reply":"2023-02-23T19:37:45.293794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom PIL import Image\nImage.MAX_IMAGE_PIXELS = 10000000000\n\n# Set the seed for reproducibility\nnp.random.seed(0)\ntf.random.set_seed(0)\n\n# Set the directories\ntrain_dir = \"/kaggle/working/train\"\nval_dir = \"/kaggle/working/val\"\ntest_dir = \"/kaggle/working/test\"\n\n# Set the parameters\nimg_size = (224, 224)\nbatch_size = 32\n\n# Create the train data generator with data augmentation\ntrain_datagen = keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode=\"nearest\",\n)\n\n# Create the validation and test data generators\nval_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\ntest_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\n# Load the train, validation, and test data\ntrain_data = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=True,\n    seed=0,\n)\n\nval_data = val_datagen.flow_from_directory(\n    val_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\ntest_data = test_datagen.flow_from_directory(\n    test_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\n# Load the pre-trained model without the top layers\nbase_model = keras.applications.vgg16.VGG16(\n    weights=\"imagenet\",\n    include_top=False,\n    input_shape=(224, 224, 3),\n)\n\n# Freeze the base model layers\nbase_model.trainable = False\n\n# Add new classification layers on top of the pre-trained model\ninputs = keras.Input(shape=(224, 224, 3))\nx = base_model(inputs, training=False)\nx = keras.layers.Flatten()(x)\nx = keras.layers.Dense(128, activation=\"relu\")(x)\nx = keras.layers.Dropout(0.5)(x)\noutputs = keras.layers.Dense(6, activation=\"softmax\")(x)\nmodel = keras.Model(inputs, outputs)\n\n# Compile the model\nmodel.compile(\n    optimizer=keras.optimizers.Adam(),\n    loss=\"categorical_crossentropy\",\n    metrics=[\"accuracy\"],\n)\n\n# Train the model\nhistory = model.fit(\n    train_data,\n    validation_data=val_data,\n    epochs=10,\n)\n\n# Evaluate the model on the test data\ntest_loss, test_acc = model.evaluate(test_data)\nprint(\"Test loss:\", test_loss)\nprint(\"Test accuracy:\", test_acc)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**VGG16**","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom PIL import Image\nImage.MAX_IMAGE_PIXELS = 10000000000\n\n# Set the seed for reproducibility\nnp.random.seed(0)\ntf.random.set_seed(0)\n\n# Set the directories\ntrain_dir = \"/kaggle/working/train\"\nval_dir = \"/kaggle/working/val\"\ntest_dir = \"/kaggle/working/test\"\n\n# Set the parameters\nimg_size = (224, 224)\nbatch_size = 32\n\n# Create the train data generator with data augmentation\ntrain_datagen = keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode=\"nearest\",\n)\n\n# Create the validation and test data generators\nval_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\ntest_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\n# Load the train, validation, and test data\ntrain_data = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=True,\n    seed=0,\n)\n\nval_data = val_datagen.flow_from_directory(\n    val_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\ntest_data = test_datagen.flow_from_directory(\n    test_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\n# Load the pre-trained model without the top layers\nbase_model = keras.applications.vgg16.VGG16(\n    weights=\"imagenet\",\n    include_top=False,\n    input_shape=(224, 224, 3),\n)\n\n# Freeze the base model layers\nbase_model.trainable = False\n\n# Add new classification layers on top of the pre-trained model\ninputs = keras.Input(shape=(224, 224, 3))\nx = base_model(inputs, training=False)\nx = keras.layers.Flatten()(x)\nx = keras.layers.Dense(512, activation=\"relu\")(x)\nx = keras.layers.Dropout(0.5)(x)\noutputs = keras.layers.Dense(6, activation=\"softmax\")(x)\nmodel = keras.Model(inputs, outputs)\n\n# Compile the model\nmodel.compile(\n    optimizer=keras.optimizers.Adam(learning_rate=0.0001),\n    loss=\"categorical_crossentropy\",\n    metrics=[\"accuracy\"],\n)\n\n# Set early stopping callback\nearly_stopping = keras.callbacks.EarlyStopping(\n    monitor=\"val_loss\",\n    patience=5,\n    verbose=1,\n    mode=\"min\",\n    restore_best_weights=True,\n)\n\n# Train the model\nhistory = model.fit(\n    train_data,\n    validation_data=val_data,\n    epochs=25,\n    callbacks=[early_stopping],\n)\n\n# Evaluate the model on the test data\ntest_loss, test_acc = model.evaluate(test_data)\nprint(\"Test loss:\", test_loss)\nprint(\"Test accuracy:\", test_acc)\n","metadata":{"execution":{"iopub.status.busy":"2023-02-23T17:48:44.264915Z","iopub.execute_input":"2023-02-23T17:48:44.26551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Trial 2 Model**","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom PIL import Image\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport matplotlib.pyplot as plt\n\nImage.MAX_IMAGE_PIXELS = 10000000000\n\n# Set the seed for reproducibility\nnp.random.seed(0)\ntf.random.set_seed(0)\n\n# Set GPU options\n# physical_devices = tf.config.list_physical_devices('GPU')\n# if len(physical_devices) > 0:\n#     tf.config.experimental.set_memory_growth(physical_devices[0], True)\n\n# Set the directories\ntrain_dir = \"/kaggle/working/train\"\nval_dir = \"/kaggle/working/val\"\ntest_dir = \"/kaggle/working/test\"\n\n# Set the parameters\nimg_size = (224, 224)\nbatch_size = 32\nepochs = 10\n\n# Create the train data generator with data augmentation\ntrain_datagen = keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode=\"nearest\",\n)\n\n# Create the validation and test data generators\nval_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\ntest_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\n# Load the train, validation, and test data\ntrain_data = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=True,\n    seed=0,\n)\n\nval_data = val_datagen.flow_from_directory(\n    val_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\ntest_data = test_datagen.flow_from_directory(\n    test_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\n# Load the pre-trained model without the top layers\nbase_model = keras.applications.vgg16.VGG16(\n    weights=\"imagenet\",\n    include_top=False,\n    input_shape=(224, 224, 3),\n)\n\n# Freeze the base model layers\nbase_model.trainable = False\n\n# Add new classification layers on top of the pre-trained model\ninputs = keras.Input(shape=(224, 224, 3))\nx = base_model(inputs, training=False)\nx = keras.layers.Flatten()(x)\nx = keras.layers.Dense(512, activation=\"relu\")(x)\nx = keras.layers.Dropout(0.5)(x)\noutputs = keras.layers.Dense(6, activation=\"softmax\")(x)\nmodel = keras.Model(inputs, outputs)\n\n# Compile the model\nmodel.compile(\n    optimizer=keras.optimizers.Adam(learning_rate=0.0001),\n    loss=\"categorical_crossentropy\",\n    metrics=[\"accuracy\"],\n)\n\n# Set early stopping callback\nearly_stopping = keras.callbacks.EarlyStopping(\n    monitor=\"val_loss\",\n    patience=5,\n    verbose=1,\n    mode=\"min\",\n    restore_best_weights=True,\n)\n\n# Set checkpoint callback to save the best model during training\ncheckpoint = keras.callbacks.ModelCheckpoint(\n    \"best_model.h5\",\n    monitor=\"val_accuracy\",\n    verbose=1,\n    save_best_only=True,\n    mode=\"max\",\n    save_freq=\"epoch\",\n)\n\ntrain_datagen = ImageDataGenerator(rescale=1./255,\n                                   shear_range=0.2,\n                                   zoom_range=0.2,\n                                   horizontal_flip=True)\n\ntrain_generator = train_datagen.flow_from_directory(train_dir,\n                                                    target_size=(224, 224),\n                                                    batch_size=batch_size,\n                                                    class_mode='categorical')\n\n# Train the model\nhistory = model.fit(train_generator,\n                    steps_per_epoch=train_steps,\n                    epochs=epochs,\n                    validation_data=val_generator,\n                    validation_steps=val_steps,\n                    callbacks=[checkpoint_cb, early_stopping_cb])\n\n# Evaluate the model on test set\nmodel.load_weights(checkpoint_path)\ntest_loss, test_acc = model.evaluate(test_generator, steps=test_steps)\nprint(\"Test accuracy:\", test_acc)\n\n# Plot training and validation accuracy/loss curves\nacc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nepochs_range = range(1, len(acc) + 1)\n\nplt.figure(figsize=(16, 8))\nplt.subplot(1, 2, 1)\nplt.plot(epochs_range, acc, label='Training Accuracy')\nplt.plot(epochs_range, val_acc, label='Validation Accuracy')\nplt.legend(loc='lower right')\nplt.title('Training and Validation Accuracy')\n\nplt.subplot(1, 2, 2)\nplt.plot(epochs_range, loss, label='Training Loss')\nplt.plot(epochs_range, val_loss, label='Validation Loss')\nplt.legend(loc='upper right')\nplt.title('Training and Validation Loss')\nplt.show()\n\n# Evaluate the model on the test data\ntest_loss, test_acc = model.evaluate(test_data)\nprint(\"Test loss:\", test_loss)\nprint(\"Test accuracy:\", test_acc)","metadata":{"execution":{"iopub.status.busy":"2023-02-23T19:58:41.337133Z","iopub.execute_input":"2023-02-23T19:58:41.338025Z","iopub.status.idle":"2023-02-23T19:58:42.172872Z","shell.execute_reply.started":"2023-02-23T19:58:41.337973Z","shell.execute_reply":"2023-02-23T19:58:42.171342Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom PIL import Image\nImage.MAX_IMAGE_PIXELS = 10000000000\n\n# Set the seed for reproducibility\nnp.random.seed(0)\ntf.random.set_seed(0)\n\n# Set the directories\ntrain_dir = \"/kaggle/working/train\"\nval_dir = \"/kaggle/working/val\"\ntest_dir = \"/kaggle/working/test\"\n\n# Set the parameters\nimg_size = (224, 224)\nbatch_size = 32\n\n# Create the train data generator with data augmentation\ntrain_datagen = keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode=\"nearest\",\n)\n\n# Create the validation and test data generators\nval_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\ntest_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\n# Load the train, validation, and test data\ntrain_data = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=True,\n    seed=0,\n)\n\nval_data = val_datagen.flow_from_directory(\n    val_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\ntest_data = test_datagen.flow_from_directory(\n    test_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\n# Load the pre-trained model without the top layers\nbase_model = keras.applications.vgg16.VGG16(\n    weights=\"imagenet\",\n    include_top=False,\n    input_shape=(224, 224, 3),\n)\n\n# Freeze the base model layers\nbase_model.trainable = False\n\n# Add new classification layers on top of the pre-trained model\ninputs = keras.Input(shape=(224, 224, 3))\nx = base_model(inputs, training=False)\nx = keras.layers.Flatten()(x)\nx = keras.layers.Dense(512, activation=\"relu\")(x)\nx = keras.layers.Dropout(0.5)(x)\noutputs = keras.layers.Dense(6, activation=\"softmax\")(x)\nmodel = keras.Model(inputs, outputs)\n\n# Compile the model\nmodel.compile(\n    optimizer=keras.optimizers.Adam(learning_rate=0.0001),\n    loss=\"categorical_crossentropy\",\n    metrics=[\"accuracy\"],\n)\n\n# Set early stopping callback\nearly_stopping = keras.callbacks.EarlyStopping(\n    monitor=\"val_loss\",\n    patience=5,\n    verbose=1,\n    mode=\"min\",\n    restore_best_weights=True,\n)\n\n# Set model checkpoint callback\ncheckpoint_callback = keras.callbacks.ModelCheckpoint(\n    filepath='model_checkpoint.h5',\n    monitor='val_loss',\n    verbose=1,\n    save_best_only=True,\n    save_weights_only=False,\n    mode='min',\n    save_freq='epoch'\n)\n\n# Train the model with GPU acceleration and model checkpoint callback\nwith tf.device('/GPU:0'):\n    history = model.fit(\n        train_data,\n        validation_data=val_data,\n        epochs=25,\n        callbacks=[early_stopping, checkpoint_callback],\n    )\n\n# Evaluate the model on the test data\ntest_loss, test_acc = model.evaluate(test_data)\nprint(\"Test loss:\", test_loss)\nprint(\"Test accuracy:\", test_acc)","metadata":{"execution":{"iopub.status.busy":"2023-03-13T08:27:23.279218Z","iopub.execute_input":"2023-03-13T08:27:23.279597Z","iopub.status.idle":"2023-03-13T09:04:40.905874Z","shell.execute_reply.started":"2023-03-13T08:27:23.279565Z","shell.execute_reply":"2023-03-13T09:04:40.904981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Using GPU**","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.applications import EfficientNetB0\nfrom PIL import Image\nImage.MAX_IMAGE_PIXELS = 10000000000\n\n# Set the seed for reproducibility\nnp.random.seed(0)\ntf.random.set_seed(0)\n\n# Set the directories\ntrain_dir = \"/kaggle/working/train\"\nval_dir = \"/kaggle/working/val\"\ntest_dir = \"/kaggle/working/test\"\n\n# Set the parameters\nimg_size = (224, 224)\nbatch_size = 32\n\n# Create the train data generator with data augmentation\ntrain_datagen = keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode=\"nearest\",\n)\n\n# Create the validation and test data generators\nval_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\ntest_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\n# Load the train, validation, and test data\ntrain_data = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=True,\n    seed=0,\n)\n\nval_data = val_datagen.flow_from_directory(\n    val_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\ntest_data = test_datagen.flow_from_directory(\n    test_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\n# Load the pre-trained model without the top layers\nbase_model = EfficientNetB0(\n    include_top=False,\n    input_shape=(224, 224, 3),\n    weights='imagenet'\n)\n\n# Freeze the base model layers\nbase_model.trainable = False\n\n# Add new classification layers on top of the pre-trained model\ninputs = keras.Input(shape=(224, 224, 3))\nx = base_model(inputs, training=False)\nx = keras.layers.GlobalAveragePooling2D()(x)\nx = keras.layers.Dense(512, activation=\"relu\")(x)\nx = keras.layers.Dropout(0.5)(x)\noutputs = keras.layers.Dense(6, activation=\"softmax\")(x)\nmodel = keras.Model(inputs, outputs)\n\n# Compile the model\nmodel.compile(\n    optimizer=keras.optimizers.Adam(learning_rate=0.0001),\n    loss=\"categorical_crossentropy\",\n    metrics=[\"accuracy\"],\n)\n\n# Set early stopping callback\nearly_stopping = keras.callbacks.EarlyStopping(\n    monitor=\"val_loss\",\n    patience=5,\n    verbose=1,\n    mode=\"min\",\n    restore_best_weights=True,\n)\n\n# Set model checkpoint callback\ncheckpoint_callback = keras.callbacks.ModelCheckpoint(\n    filepath='model_checkpoint.h5',\n    monitor='val_loss',\n    verbose=1,\n    save_best_only=True,\n    save_weights_only=False,\n    mode='min',\n    save_freq='epoch'\n)\n\n# Train the model with GPU acceleration and model checkpoint callback\nwith tf.device('/GPU:0'):\n    history = model.fit(\n        train_data,\n        validation_data=val_data,\n        epochs=25,\n        callbacks=[early_stopping, checkpoint_callback],\n    )\n\n# Evaluate the model on the test data\ntest_loss, test_acc = model.evaluate(test_data)\nprint(\"Test loss:\", test_loss)\nprint(\"Test accuracy:\", test_acc)\n","metadata":{"execution":{"iopub.status.busy":"2023-03-13T09:04:50.942619Z","iopub.execute_input":"2023-03-13T09:04:50.943004Z","iopub.status.idle":"2023-03-13T09:23:41.784655Z","shell.execute_reply.started":"2023-03-13T09:04:50.942972Z","shell.execute_reply":"2023-03-13T09:23:41.783454Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Using EffectiveNetB0**","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom PIL import Image\n\nImage.MAX_IMAGE_PIXELS = 10000000000\n\n# Set the seed for reproducibility\nnp.random.seed(0)\ntf.random.set_seed(0)\n\n# Set the directories\ntrain_dir = \"/kaggle/working/train\"\nval_dir = \"/kaggle/working/val\"\ntest_dir = \"/kaggle/working/test\"\n\n# Set the parameters\nimg_size = (224, 224)\nbatch_size = 64\nlearning_rate = 0.001\ndropout_rate = 0.5\nepochs = 100\n\n# Create the train data generator with data augmentation\ntrain_datagen = keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode=\"nearest\",\n)\n\n# Create the validation and test data generators\nval_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\ntest_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\n# Load the train, validation, and test data\ntrain_data = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=True,\n    seed=0,\n)\n\nval_data = val_datagen.flow_from_directory(\n    val_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\ntest_data = test_datagen.flow_from_directory(\n    test_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    shuffle=False,\n)\n\n# Load the pre-trained model without the top layers\nbase_model = keras.applications.vgg16.VGG16(\n    weights=\"imagenet\",\n    include_top=False,\n    input_shape=(224, 224, 3),\n)\n\n# Fine-tune the pre-trained model\nbase_model.trainable = True\n\nset_trainable = False\nfor layer in base_model.layers:\n    if layer.name == 'block5_conv1':\n        set_trainable = True\n    if set_trainable:\n        layer.trainable = True\n    else:\n        layer.trainable = False\n\n# Add new classification layers on top of the pre-trained model\ninputs = keras.Input(shape=(224, 224, 3))\nx = base_model(inputs, training=False)\nx = keras.layers.GlobalAveragePooling2D()(x)\nx = keras.layers.Dense(512, activation=\"relu\")(x)\nx = keras.layers.Dropout(dropout_rate)(x)\noutputs = keras.layers.Dense(6, activation=\"softmax\")(x)\nmodel = keras.Model(inputs, outputs)\n\n# Compile the model\noptimizer = keras.optimizers.SGD(learning_rate=learning_rate, momentum=0.9)\nmodel.compile(\n    optimizer=optimizer,\n    loss=\"categorical_crossentropy\",\n    metrics=[\"accuracy\"],\n)\n\n# Set early stopping callback\nearly_stopping = keras.callbacks.EarlyStopping(\n    monitor=\"val_loss\",\n    patience=5,\n    verbose=1,\n    mode=\"min\",\n    restore_best_weights=True,\n)\n\n# Set model checkpoint callback\ncheckpoint_callback = keras.callbacks.ModelCheckpoint(\n    filepath='model_checkpoint.h5',\n    monitor='val_loss',\n    verbose=1,\n    save_best_only=True,\n    save_weights_only=False,\n    mode='min',\n    save_freq='epoch'\n)\n\n# Train the model with GPU acceleration and model checkpoint callback\nwith tf.device('/GPU:0'):\n    history = model.fit(\n        train_data,\n        validation_data=val_data,\n        epochs=100,\n        callbacks=[early_stopping, checkpoint_callback],\n    )\n\n# Evaluate the model on the test data\ntest_loss, test_acc = model.evaluate(test_data)\nprint(\"Test loss:\", test_loss)\nprint(\"Test accuracy:\", test_acc)","metadata":{"execution":{"iopub.status.busy":"2023-03-13T08:15:39.542229Z","iopub.execute_input":"2023-03-13T08:15:39.542596Z","iopub.status.idle":"2023-03-13T08:27:16.688982Z","shell.execute_reply.started":"2023-03-13T08:15:39.542566Z","shell.execute_reply":"2023-03-13T08:27:16.686839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}