{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":4117,"databundleVersionId":46665,"sourceType":"competition"},{"sourceId":8383492,"sourceType":"datasetVersion","datasetId":4985809},{"sourceId":8385703,"sourceType":"datasetVersion","datasetId":4987455},{"sourceId":8385770,"sourceType":"datasetVersion","datasetId":4987510},{"sourceId":8406915,"sourceType":"datasetVersion","datasetId":5002785}],"dockerImageVersionId":30700,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow.keras import layers\nfrom PIL import Image\nfrom math import log\nimport pandas as pd\nimport numpy as np\nimport threading\nimport cv2\nimport os\nimport matplotlib.pyplot as plt\nimport time","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-14T12:20:49.488810Z","iopub.execute_input":"2024-05-14T12:20:49.489570Z","iopub.status.idle":"2024-05-14T12:20:49.494932Z","shell.execute_reply.started":"2024-05-14T12:20:49.489535Z","shell.execute_reply":"2024-05-14T12:20:49.493864Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Num GPUs Available: \", len(tf.config.list_physical_devices('GPU')))","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:20:52.336465Z","iopub.execute_input":"2024-05-14T12:20:52.337173Z","iopub.status.idle":"2024-05-14T12:20:52.341997Z","shell.execute_reply.started":"2024-05-14T12:20:52.337141Z","shell.execute_reply":"2024-05-14T12:20:52.341008Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_LABELS = pd.read_csv(\"/kaggle/input/trainlabels1/trainLabels.csv\")\nTRAIN_LABELS[\"ID\"] = TRAIN_LABELS[\"ID\"].astype(str)\nTRAIN_LABELS[\"Class\"] = TRAIN_LABELS[\"Class\"].astype(int)-1\nprint(TRAIN_LABELS.head())","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:20:54.117337Z","iopub.execute_input":"2024-05-14T12:20:54.118144Z","iopub.status.idle":"2024-05-14T12:20:54.137062Z","shell.execute_reply.started":"2024-05-14T12:20:54.118112Z","shell.execute_reply":"2024-05-14T12:20:54.136148Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classCounts = TRAIN_LABELS['Class'].value_counts()\nprint(classCounts)\nplt.bar(classCounts.index, classCounts)\nplt.xlabel('Class')\nplt.ylabel('Frequency')\nplt.title('Frequency of Each Class')\nplt.xticks(classCounts.index)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:20:56.115257Z","iopub.execute_input":"2024-05-14T12:20:56.115648Z","iopub.status.idle":"2024-05-14T12:20:56.324885Z","shell.execute_reply.started":"2024-05-14T12:20:56.115608Z","shell.execute_reply":"2024-05-14T12:20:56.323963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def loadTrainAndImageLabels(count, directoryPath):\n    trainImages = []\n    imagePaths = []\n    trainImageLabels = []\n    for root, _, files in os.walk(directoryPath):\n        for file in files:\n            imagePath = os.path.join(root, file)\n            imageName = imagePath[47:len(imagePath) - 4]\n            result = TRAIN_LABELS[TRAIN_LABELS[\"ID\"] == imageName]\n            if not result.empty:\n                imagePaths.append(imagePath[47:len(imagePath) - 4])\n                classValue = result[\"Class\"].iloc[0]\n                trainImageLabels.append(classValue)\n                image = cv2.imread(imagePath, cv2.IMREAD_GRAYSCALE)\n                trainImages.append(image)\n        return trainImages, imagePaths, trainImageLabels\n    \n\nimages, paths, labels = loadTrainAndImageLabels(10873, \"/kaggle/input/ms-train/TrainImagesBWResized128/\")\nimages = np.array(images)\ntrain_images = images.astype('float32')\ntrain_images = (train_images - 127.5) / 127.5\nprint(len(train_images))","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:21:04.155047Z","iopub.execute_input":"2024-05-14T12:21:04.155385Z","iopub.status.idle":"2024-05-14T12:21:56.346368Z","shell.execute_reply.started":"2024-05-14T12:21:04.155359Z","shell.execute_reply":"2024-05-14T12:21:56.345358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainImages, testImages, trainPaths, testPaths, trainLabels, testLabels = train_test_split(\n    train_images, paths, labels, test_size=0.2, random_state=42\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:21:56.348257Z","iopub.execute_input":"2024-05-14T12:21:56.348631Z","iopub.status.idle":"2024-05-14T12:21:56.555288Z","shell.execute_reply.started":"2024-05-14T12:21:56.348583Z","shell.execute_reply":"2024-05-14T12:21:56.554260Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valImages1 = np.array(valImages)","metadata":{"execution":{"iopub.status.busy":"2024-05-14T11:55:45.046077Z","iopub.execute_input":"2024-05-14T11:55:45.046975Z","iopub.status.idle":"2024-05-14T11:55:45.094414Z","shell.execute_reply.started":"2024-05-14T11:55:45.046933Z","shell.execute_reply":"2024-05-14T11:55:45.093403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from collections import Counter\n\ntrainFrequencyCount = Counter(trainLabels)\nprint(\"Train Distribution\")\nfor element, count in trainFrequencyCount.items():\n    print(f\"{element}: {count} times\")\n\nprint(\"Test Distribution\")\ntestFrequencyCount = Counter(testLabels)\nfor element, count in testFrequencyCount.items():\n    print(f\"{element}: {count} times\")\n    \nprint(\"Validation Distribution\")\nvalFrequencyCount = Counter(valLabels)\nfor element, count in valFrequencyCount.items():\n    print(f\"{element}: {count} times\")","metadata":{"execution":{"iopub.status.busy":"2024-05-14T11:31:48.828886Z","iopub.execute_input":"2024-05-14T11:31:48.829197Z","iopub.status.idle":"2024-05-14T11:31:48.839546Z","shell.execute_reply.started":"2024-05-14T11:31:48.829171Z","shell.execute_reply":"2024-05-14T11:31:48.838637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"numRows = 4\nnumCols = 4\n\nfig, axes = plt.subplots(numRows, numCols, figsize=(10, 10))\n\nfor i in range(numRows):\n    for j in range(numCols):\n        index = i * numCols + j\n        if index < len(trainImages):\n            axes[i, j].imshow(trainImages[index], cmap='gray') \n            axes[i, j].axis('off')\n\nplt.subplots_adjust(wspace=0.2, hspace=0.2)\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-05-14T11:31:48.840689Z","iopub.execute_input":"2024-05-14T11:31:48.840993Z","iopub.status.idle":"2024-05-14T11:31:49.569007Z","shell.execute_reply.started":"2024-05-14T11:31:48.840969Z","shell.execute_reply":"2024-05-14T11:31:49.568107Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BUFFER_SIZE = 5000\nBATCH_SIZE = 128\ntrainDataset = tf.data.Dataset.from_tensor_slices(trainImages).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)","metadata":{"execution":{"iopub.status.busy":"2024-05-14T06:03:09.812840Z","iopub.execute_input":"2024-05-14T06:03:09.813582Z","iopub.status.idle":"2024-05-14T06:03:10.861160Z","shell.execute_reply.started":"2024-05-14T06:03:09.813549Z","shell.execute_reply":"2024-05-14T06:03:10.860236Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def makeGeneratorModel():\n    model = tf.keras.Sequential()\n\n    model.add(layers.Dense(8*8*1024, use_bias=False, input_shape=(100,)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n    model.add(layers.Reshape((8, 8, 1024)))\n    assert model.output_shape == (None, 8, 8, 1024)\n\n    model.add(layers.Conv2DTranspose(512, (5, 5), strides=(2, 2), padding='same', use_bias=False))\n    assert model.output_shape == (None, 16, 16, 512)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2DTranspose(256, (5, 5), strides=(2, 2), padding='same', use_bias=False))\n    assert model.output_shape == (None, 32, 32, 256)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(2, 2), padding='same', use_bias=False))\n    assert model.output_shape == (None, 64, 64, 128)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(2, 2), padding='same', use_bias=False))\n    assert model.output_shape == (None, 128, 128, 128)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(1, 1), padding='same', use_bias=False))\n    assert model.output_shape == (None, 128, 128, 64)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2DTranspose(1, (5, 5), strides=(1, 1), padding='same', use_bias=False, activation='tanh'))\n    assert model.output_shape == (None, 128, 128, 1)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-05-14T05:11:54.582269Z","iopub.execute_input":"2024-05-14T05:11:54.582888Z","iopub.status.idle":"2024-05-14T05:11:54.595986Z","shell.execute_reply.started":"2024-05-14T05:11:54.582859Z","shell.execute_reply":"2024-05-14T05:11:54.594860Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"generator = makeGeneratorModel()\ngenerator.summary()","metadata":{"execution":{"iopub.status.busy":"2024-05-14T05:11:57.933998Z","iopub.execute_input":"2024-05-14T05:11:57.934360Z","iopub.status.idle":"2024-05-14T05:11:58.227656Z","shell.execute_reply.started":"2024-05-14T05:11:57.934332Z","shell.execute_reply":"2024-05-14T05:11:58.226752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"noise = tf.random.normal([1, 100])\ngeneratedImage = generator(noise, training=False)\nprint(generatedImage.shape)\nplt.imshow(generatedImage[0, :, :, 0], cmap='gray')","metadata":{"execution":{"iopub.status.busy":"2024-05-14T05:12:01.484666Z","iopub.execute_input":"2024-05-14T05:12:01.485404Z","iopub.status.idle":"2024-05-14T05:12:02.917685Z","shell.execute_reply.started":"2024-05-14T05:12:01.485373Z","shell.execute_reply":"2024-05-14T05:12:02.916773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def makeDiscriminatorModel():\n    model = tf.keras.Sequential()\n\n    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape=[128, 128, 1]))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2D(256, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2D(512, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2D(1024, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n    \n\n    model.add(layers.Flatten())\n    model.add(layers.Dense(1, activation='sigmoid'))\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:22:19.994218Z","iopub.execute_input":"2024-05-14T12:22:19.994589Z","iopub.status.idle":"2024-05-14T12:22:20.004858Z","shell.execute_reply.started":"2024-05-14T12:22:19.994559Z","shell.execute_reply":"2024-05-14T12:22:20.003943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"discriminator = makeDiscriminatorModel()\ndiscriminator.summary()","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:22:22.284223Z","iopub.execute_input":"2024-05-14T12:22:22.284644Z","iopub.status.idle":"2024-05-14T12:22:22.504775Z","shell.execute_reply.started":"2024-05-14T12:22:22.284611Z","shell.execute_reply":"2024-05-14T12:22:22.503908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"decision = discriminator(generatedImage)\nprint (decision)","metadata":{"execution":{"iopub.status.busy":"2024-05-13T09:57:43.329768Z","iopub.execute_input":"2024-05-13T09:57:43.330717Z","iopub.status.idle":"2024-05-13T09:57:43.781174Z","shell.execute_reply.started":"2024-05-13T09:57:43.330680Z","shell.execute_reply":"2024-05-13T09:57:43.780172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"crossEntropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)\n\ndef discriminatorLoss(real_output, fake_output):\n    real_loss = crossEntropy(tf.ones_like(real_output), real_output)\n    fake_loss = crossEntropy(tf.zeros_like(fake_output), fake_output)\n    total_loss = real_loss + fake_loss\n    return total_loss\n\ndef generatorLoss(fake_output):\n    return crossEntropy(tf.ones_like(fake_output), fake_output)","metadata":{"execution":{"iopub.status.busy":"2024-05-13T09:57:53.191152Z","iopub.execute_input":"2024-05-13T09:57:53.191543Z","iopub.status.idle":"2024-05-13T09:57:53.197719Z","shell.execute_reply.started":"2024-05-13T09:57:53.191511Z","shell.execute_reply":"2024-05-13T09:57:53.196610Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"generatorOptimizer = tf.keras.optimizers.Adam(1e-4)\ndiscriminatorOptimizer = tf.keras.optimizers.Adam(1e-4)","metadata":{"execution":{"iopub.status.busy":"2024-05-13T09:58:18.331524Z","iopub.execute_input":"2024-05-13T09:58:18.332152Z","iopub.status.idle":"2024-05-13T09:58:18.343985Z","shell.execute_reply.started":"2024-05-13T09:58:18.332122Z","shell.execute_reply":"2024-05-13T09:58:18.343078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"checkpointDir = '/kaggle/working/training_checkpoints/FinalePakkaWala512EpochsKaDabba'\ncheckpointPrefix = os.path.join(checkpointDir, \"ckpt\")\ncheckpoint = tf.train.Checkpoint(generator_optimizer=generatorOptimizer,\n                                 discriminator_optimizer=discriminatorOptimizer,\n                                 generator=generator,\n                                 discriminator=discriminator)","metadata":{"execution":{"iopub.status.busy":"2024-05-13T09:58:40.826489Z","iopub.execute_input":"2024-05-13T09:58:40.827344Z","iopub.status.idle":"2024-05-13T09:58:40.833292Z","shell.execute_reply.started":"2024-05-13T09:58:40.827314Z","shell.execute_reply":"2024-05-13T09:58:40.832273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EPOCHS = 512\nnoise_dim = 100\nnum_examples_to_generate = 2\n\nseed = tf.random.normal([num_examples_to_generate, noise_dim])","metadata":{"execution":{"iopub.status.busy":"2024-05-13T09:58:52.799928Z","iopub.execute_input":"2024-05-13T09:58:52.800786Z","iopub.status.idle":"2024-05-13T09:58:52.806295Z","shell.execute_reply.started":"2024-05-13T09:58:52.800756Z","shell.execute_reply":"2024-05-13T09:58:52.805277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"@tf.function\ndef train_step(images):\n    noise = tf.random.normal([BATCH_SIZE, noise_dim])\n\n    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n      generated_images = generator(noise, training=True)\n\n      real_output = discriminator(images, training=True)\n      fake_output = discriminator(generated_images, training=True)\n\n      gen_loss = generatorLoss(fake_output)\n      disc_loss = discriminatorLoss(real_output, fake_output)\n\n    gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)\n    gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)\n\n    generatorOptimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))\n    discriminatorOptimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))","metadata":{"execution":{"iopub.status.busy":"2024-05-13T09:59:00.459875Z","iopub.execute_input":"2024-05-13T09:59:00.460690Z","iopub.status.idle":"2024-05-13T09:59:00.469927Z","shell.execute_reply.started":"2024-05-13T09:59:00.460657Z","shell.execute_reply":"2024-05-13T09:59:00.468862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def generateAndSaveImages(model, epoch, test_input):\n  predictions = model(test_input, training=False)\n  fig = plt.figure(figsize=(10, 10))\n  for i in range(predictions.shape[0]):\n    plt.plot(10, 10, 521+i+1)\n    plt.imshow(predictions[i, :, :, 0] * 127.5 + 127.5, cmap='gray')\n    plt.axis('off')\n    plt.savefig(\"/kaggle/working/image_at_epoch_\"+str(i)+\"_\"+str(epoch)+\".png\")\n    plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-05-13T10:03:09.382082Z","iopub.execute_input":"2024-05-13T10:03:09.382428Z","iopub.status.idle":"2024-05-13T10:03:09.389342Z","shell.execute_reply.started":"2024-05-13T10:03:09.382400Z","shell.execute_reply":"2024-05-13T10:03:09.388330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(dataset, epochs):\n  for epoch in range(epochs):\n    start = time.time()\n\n    for image_batch in dataset:\n      train_step(image_batch)\n    display.clear_output(wait=True)\n    generateAndSaveImages(generator, epoch + 1, seed)\n\n    if (epoch + 1) % 15 == 0:\n      checkpoint.save(file_prefix = checkpointPrefix)\n\n    print ('Time for epoch {} is {} sec'.format(epoch + 1, time.time()-start))\n\n  display.clear_output(wait=True)\n  generateAndSaveImages(generator, epochs, seed)","metadata":{"execution":{"iopub.status.busy":"2024-05-13T10:03:32.658774Z","iopub.execute_input":"2024-05-13T10:03:32.659615Z","iopub.status.idle":"2024-05-13T10:03:32.665969Z","shell.execute_reply.started":"2024-05-13T10:03:32.659583Z","shell.execute_reply":"2024-05-13T10:03:32.665040Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from IPython import display\ntrain(trainDataset, EPOCHS)","metadata":{"execution":{"iopub.status.busy":"2024-05-13T10:03:34.929478Z","iopub.execute_input":"2024-05-13T10:03:34.929859Z","iopub.status.idle":"2024-05-13T19:10:56.610271Z","shell.execute_reply.started":"2024-05-13T10:03:34.929834Z","shell.execute_reply":"2024-05-13T19:10:56.609022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"discriminator.save_weights(\"/kaggle/working/training_checkpoints/discriminatorWeights.weights.h5\")","metadata":{"execution":{"iopub.status.busy":"2024-05-13T19:12:41.628212Z","iopub.execute_input":"2024-05-13T19:12:41.628840Z","iopub.status.idle":"2024-05-13T19:12:41.790754Z","shell.execute_reply.started":"2024-05-13T19:12:41.628810Z","shell.execute_reply":"2024-05-13T19:12:41.789769Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras import layers, models\nfrom tensorflow.keras.optimizers import Adam\ndiscriminator = makeDiscriminatorModel()\ndiscriminator.load_weights(\"/kaggle/input/modelmeow/discriminatorWeights.weights.h5\")\nprint(type(trainImages))\nprint(type(trainLabels))\nprint(type(testImages))\nprint(type(testLabels))\ntrainLabels = np.array(trainLabels)\ntestLabels = np.array(testLabels)","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:42:37.426915Z","iopub.execute_input":"2024-05-14T12:42:37.427300Z","iopub.status.idle":"2024-05-14T12:42:39.046871Z","shell.execute_reply.started":"2024-05-14T12:42:37.427269Z","shell.execute_reply":"2024-05-14T12:42:39.045932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transfer_model = models.Sequential()\n\n# Add layers from the pre-trained discriminator up to a certain point\nfor layer in discriminator.layers[:-1]:  # Exclude the last three layers\n    layer.trainable = False  # Freeze layers\n    transfer_model.add(layer)\n    \ntransfer_model.add(layers.Dense(1024, activation='relu'))\ntransfer_model.add(layers.Dropout(0.5))\ntransfer_model.add(layers.Dense(512, activation='relu'))\ntransfer_model.add(layers.Dropout(0.6))  # Add dropout after first dense layer with rate 0.2\ntransfer_model.add(layers.BatchNormalization())\ntransfer_model.add(layers.Dense(256, activation='relu'))\ntransfer_model.add(layers.Dropout(0.5))  # Add dropout after first dense layer with rate 0.2\ntransfer_model.add(layers.BatchNormalization())\ntransfer_model.add(layers.Dense(128, activation='relu'))\ntransfer_model.add(layers.Dropout(0.4))  # Add dropout after first dense layer with rate 0.2\ntransfer_model.add(layers.BatchNormalization())\ntransfer_model.add(layers.Dense(64, activation='relu'))\ntransfer_model.add(layers.Dropout(0.3))  # Add dropout after second dense layer with rate 0.3\ntransfer_model.add(layers.BatchNormalization())\ntransfer_model.add(layers.Dense(32, activation='relu'))\ntransfer_model.add(layers.Dropout(0.2))  # Add dropout after third dense layer with rate 0.4\ntransfer_model.add(layers.BatchNormalization())\ntransfer_model.add(layers.Dense(16, activation='relu'))\ntransfer_model.add(layers.Dropout(0.1))  # Add dropout after third dense layer with rate 0.4\ntransfer_model.add(layers.BatchNormalization())\ntransfer_model.add(layers.Dense(9, activation='softmax'))\n\n# Compile the new model\ntransfer_model.compile(optimizer=Adam(learning_rate=0.001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n\n# Train the new model on the classification task\n#transfer_model.fit(trainImages, trainLabels, epochs=128, batch_size=128)\n\n\n# Evaluate the new model on the test dataset\n#test_loss, test_accuracy = transfer_model.evaluate(testImages, testLabels)\n#print(f'Test Accuracy: {test_accuracy}')\n\n# Save the new model for future use\n#transfer_model.save('malware_classification_model.h5')","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:55:55.998579Z","iopub.execute_input":"2024-05-14T12:55:55.999286Z","iopub.status.idle":"2024-05-14T12:55:56.544406Z","shell.execute_reply.started":"2024-05-14T12:55:55.999250Z","shell.execute_reply":"2024-05-14T12:55:56.543646Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nfrom sklearn.metrics import f1_score, log_loss\n\n# Create lists to store metrics during training\ntrain_loss_history = []\ntrain_accuracy_history = []\ntrain_f1_score_history = []\ntrain_log_loss_history = []\n\n# Train the new model on the classification task\nhistory = transfer_model.fit(trainImages, trainLabels, epochs=128, batch_size=128)\n\n# Extract metrics from training history\ntrain_loss_history = history.history['loss']\ntrain_accuracy_history = history.history['accuracy']\n\n# Calculate F1 score and log loss during training\nfor epoch in range(len(history.history['loss'])):\n    train_pred = transfer_model.predict(trainImages)\n    train_f1 = f1_score(trainLabels, train_pred.argmax(axis=1), average='macro')\n    train_logloss = log_loss(trainLabels, train_pred)\n    train_f1_score_history.append(train_f1)\n    train_log_loss_history.append(train_logloss)\n\n# Plot training graphs\nplt.figure(figsize=(12, 5))\n\n# Plot accuracy\nplt.subplot(1, 3, 1)\nplt.plot(train_accuracy_history, label='Training Accuracy')\nplt.title('Training Accuracy')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.legend()\n\n# Plot F1 score\nplt.subplot(1, 3, 2)\nplt.plot(train_f1_score_history, label='Training F1 Score')\nplt.title('Training F1 Score')\nplt.xlabel('Epoch')\nplt.ylabel('F1 Score')\nplt.legend()\n\n# Plot log loss\nplt.subplot(1, 3, 3)\nplt.plot(train_log_loss_history, label='Training Log Loss')\nplt.title('Training Log Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Log Loss')\nplt.legend()\n\nplt.tight_layout()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:56:10.896481Z","iopub.execute_input":"2024-05-14T12:56:10.897368Z","iopub.status.idle":"2024-05-14T13:12:13.872361Z","shell.execute_reply.started":"2024-05-14T12:56:10.897334Z","shell.execute_reply":"2024-05-14T13:12:13.871382Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import log_loss\npredicted_probabilities = transfer_model.predict(testImages)\nlog_loss_value = log_loss(testLabels, predicted_probabilities)\n\nprint(\"Log Loss:\", log_loss_value)\nfrom numpy import argmax\n\npredicted_labels = argmax(predicted_probabilities, axis=1)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:29:19.049573Z","iopub.execute_input":"2024-05-14T12:29:19.050419Z","iopub.status.idle":"2024-05-14T12:29:21.834243Z","shell.execute_reply.started":"2024-05-14T12:29:19.050386Z","shell.execute_reply":"2024-05-14T12:29:21.833298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n\n# Generate predictions\npredicted_probabilities = transfer_model.predict(testImages)\npredicted_labels = np.argmax(predicted_probabilities, axis=1)\n\n# Define class names (if available)\nclass_names = [0,1,2,3,4,5,6,7,8]\n\n# Plot some images along with their predicted and true labels\nplt.figure(figsize=(15, 10))\nfor i in range(10):  # Adjust the range as needed\n    plt.subplot(2, 5, i + 1)\n    plt.imshow(testImages[i], cmap='gray')  # Assuming images are grayscale\n    plt.title(f'Predicted: {class_names[predicted_labels[i]]}\\nTrue: {class_names[testLabels[i]]}')\n    plt.axis('off')\nplt.tight_layout()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-05-14T13:22:46.107683Z","iopub.execute_input":"2024-05-14T13:22:46.108341Z","iopub.status.idle":"2024-05-14T13:22:48.585703Z","shell.execute_reply.started":"2024-05-14T13:22:46.108309Z","shell.execute_reply":"2024-05-14T13:22:48.584779Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nfrom sklearn.metrics import accuracy_score, f1_score, confusion_matrix\naccuracy = accuracy_score(testLabels, predicted_labels)\nlog_loss_value = log_loss(testLabels, predicted_probabilities)\n\n# Macro-averaging for F1-score (consider micro-averaging if class imbalance is a concern)\nf1 = f1_score(testLabels, predicted_labels, average='micro')\nprint(f1)\n# Confusion matrix for all classes\nconfusion_matrix_output = confusion_matrix(testLabels, predicted_labels)\nprint(confusion_matrix_output)\n\n# F1-score per class (macro-averaged)\nf1_per_class = f1_score(testLabels, predicted_labels, average='micro')\nprint(f1_per_class)\nimport seaborn as sns\nclass_labels = [0,1,2,3,4,5,6,7,8]\nplt.figure(figsize=(10, 8))\nsns.heatmap(confusion_matrix_output, annot=True, fmt='d', cmap='Blues', cbar=False)\n\nplt.title('Confusion Matrix')\nplt.xlabel('Predicted Label')\nplt.ylabel('True Label')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-14T13:14:39.617559Z","iopub.execute_input":"2024-05-14T13:14:39.618264Z","iopub.status.idle":"2024-05-14T13:14:39.985081Z","shell.execute_reply.started":"2024-05-14T13:14:39.618231Z","shell.execute_reply":"2024-05-14T13:14:39.984152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 6))\nplt.bar(class_labels, f1_per_class)\nplt.xlabel('Class')\nplt.ylabel('F1-score')\nplt.title('F1-score Per Class (Micro-averaged)')\nplt.grid(True)\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:39:14.566664Z","iopub.execute_input":"2024-05-14T12:39:14.567027Z","iopub.status.idle":"2024-05-14T12:39:14.773777Z","shell.execute_reply.started":"2024-05-14T12:39:14.566996Z","shell.execute_reply":"2024-05-14T12:39:14.772938Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 6))\nplt.imshow(confusion_matrix_output, cmap='Blues')\nplt.colorbar()\nplt.xticks(range(len(class_labels)), class_labels)\nplt.yticks(range(len(class_labels)), class_labels)\nplt.xlabel('Predicted Class')\nplt.ylabel('True Class')\nplt.title('Confusion Matrix')\nplt.grid(False)  # Remove grid for better heatmap visualization\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:40:19.731344Z","iopub.execute_input":"2024-05-14T12:40:19.732236Z","iopub.status.idle":"2024-05-14T12:40:20.069440Z","shell.execute_reply.started":"2024-05-14T12:40:19.732196Z","shell.execute_reply":"2024-05-14T12:40:20.068531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 6))\nplt.imshow(confusion_matrix_output, cmap='Blues')\nplt.colorbar()\nplt.xticks(range(len(class_labels)), class_labels, rotation=45)\nplt.yticks(range(len(class_labels)), class_labels)\nplt.xlabel('Predicted Class')\nplt.ylabel('True Class')\nplt.title('Confusion Matrix')\nplt.grid(False) \nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:40:41.627649Z","iopub.execute_input":"2024-05-14T12:40:41.628503Z","iopub.status.idle":"2024-05-14T12:40:41.974236Z","shell.execute_reply.started":"2024-05-14T12:40:41.628468Z","shell.execute_reply":"2024-05-14T12:40:41.973299Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def loadTrainAndImageLabels(count, directoryPath):\n    trainImages = []\n    imagePaths = []\n    files = os.walk(directoryPath)\n    print(files)\n    for root, _, files in os.walk(directoryPath):\n        for file in files:\n            imagePath = os.path.join(root, file)\n            imagePaths.append(imagePath[26:len(imagePath) - 4])\n            image = cv2.imread(imagePath, cv2.IMREAD_GRAYSCALE)\n            trainImages.append(image)\n        return trainImages, imagePaths\n        \nimages = []\nimages, paths = loadTrainAndImageLabels(10872, \"/kaggle/input/ms-test/TestImagesBWResized128\")\nimages = np.array(images)\ntrain_images = images.astype('float32')\ntestImages = (train_images - 127.5) / 127.5","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:08:01.722800Z","iopub.execute_input":"2024-05-14T12:08:01.723637Z","iopub.status.idle":"2024-05-14T12:09:33.450614Z","shell.execute_reply.started":"2024-05-14T12:08:01.723581Z","shell.execute_reply":"2024-05-14T12:09:33.449540Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"probabilities = transfer_model.predict(testImages)\nprint(len(probabilities))\n\n\n# Save the new model for future use\ntransfer_model.save('malware_classification_model_with_probs.h5')","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:09:33.452019Z","iopub.execute_input":"2024-05-14T12:09:33.452313Z","iopub.status.idle":"2024-05-14T12:09:41.008171Z","shell.execute_reply.started":"2024-05-14T12:09:33.452288Z","shell.execute_reply":"2024-05-14T12:09:41.007367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nfilenames = paths  # List of filenames\nclass_probabilities = probabilities\ncolumns = [\"ID\"] + [f\"prediction{i}\" for i in range(1, 10)]\ndf = pd.DataFrame(columns=columns)\nfor filename, probs in zip(filenames, class_probabilities):\n    row_data = [filename[19:]] + [str(p) for p in probs]\n    df.loc[len(df)] = row_data\ndf.to_csv(\"/kaggle/working/predictions.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2024-05-14T12:09:44.396332Z","iopub.execute_input":"2024-05-14T12:09:44.396829Z","iopub.status.idle":"2024-05-14T12:10:00.826783Z","shell.execute_reply.started":"2024-05-14T12:09:44.396796Z","shell.execute_reply":"2024-05-14T12:10:00.825860Z"},"trusted":true},"execution_count":null,"outputs":[]}]}