{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":11848,"databundleVersionId":862157,"sourceType":"competition"}],"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"\nimport numpy as np\nimport pandas as pd \nimport matplotlib.pyplot as plt\nimport sklearn\nimport os\nimport gc\nimport cv2 \n\nfrom PIL import Image\nfrom PIL import ImageDraw\ntrain_on_gpu = True\n\nfrom sklearn.model_selection import train_test_split\n\n\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras import layers,optimizers,models\nfrom keras.metrics import AUC","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-04T15:05:03.478526Z","iopub.execute_input":"2024-03-04T15:05:03.479307Z","iopub.status.idle":"2024-03-04T15:05:16.018641Z","shell.execute_reply.started":"2024-03-04T15:05:03.479258Z","shell.execute_reply":"2024-03-04T15:05:16.017852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_labels = pd.read_csv('/kaggle/input/histopathologic-cancer-detection/train_labels.csv')\ndf_samples = pd.read_csv('/kaggle/input/histopathologic-cancer-detection/sample_submission.csv')\ndf_labels = df_labels.head(10000)\ndf_samples=df_samples.head(10000)\ndf_labels.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:16.020249Z","iopub.execute_input":"2024-03-04T15:05:16.020749Z","iopub.status.idle":"2024-03-04T15:05:16.438572Z","shell.execute_reply.started":"2024-03-04T15:05:16.020724Z","shell.execute_reply":"2024-03-04T15:05:16.437670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = \"/kaggle/input/histopathologic-cancer-detection/train/\"\ntest = \"/kaggle/input/histopathologic-cancer-detection/test\"\n\nprint(\"Number of training images: {}\".format(len(os.listdir(train))))\nprint(\"Number of test images: {}\".format(len(os.listdir(test))))","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:16.439739Z","iopub.execute_input":"2024-03-04T15:05:16.440074Z","iopub.status.idle":"2024-03-04T15:05:20.604608Z","shell.execute_reply.started":"2024-03-04T15:05:16.440050Z","shell.execute_reply":"2024-03-04T15:05:20.603604Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_train = os.listdir(train)\nimg_test = os.listdir(test)","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:20.606829Z","iopub.execute_input":"2024-03-04T15:05:20.607116Z","iopub.status.idle":"2024-03-04T15:05:20.800682Z","shell.execute_reply.started":"2024-03-04T15:05:20.607092Z","shell.execute_reply":"2024-03-04T15:05:20.799931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"fig = plt.figure(figsize=(25, 4))\nfor i in range(5):\n    ax = fig.add_subplot(1, 5, i + 1, xticks=[], yticks=[])\n    im = Image.open(train + img_train[i])\n    plt.imshow(im)\n#     label = df_labels.loc[df_labels['id'] == img_train[i].split('.')[0], 'label'].values[0]\n#     ax.set_title(f'#{i+1} - Label: {label}')","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:20.801682Z","iopub.execute_input":"2024-03-04T15:05:20.801967Z","iopub.status.idle":"2024-03-04T15:05:21.321564Z","shell.execute_reply.started":"2024-03-04T15:05:20.801945Z","shell.execute_reply":"2024-03-04T15:05:21.320607Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"missing_values = df_labels.isnull().sum()\nmissing_values","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:21.322874Z","iopub.execute_input":"2024-03-04T15:05:21.323187Z","iopub.status.idle":"2024-03-04T15:05:21.333469Z","shell.execute_reply.started":"2024-03-04T15:05:21.323162Z","shell.execute_reply":"2024-03-04T15:05:21.332606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_labels[df_labels.duplicated(keep=False)]","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:21.334579Z","iopub.execute_input":"2024-03-04T15:05:21.334920Z","iopub.status.idle":"2024-03-04T15:05:21.358298Z","shell.execute_reply.started":"2024-03-04T15:05:21.334885Z","shell.execute_reply":"2024-03-04T15:05:21.357304Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_labels['label'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:21.359701Z","iopub.execute_input":"2024-03-04T15:05:21.360498Z","iopub.status.idle":"2024-03-04T15:05:21.372954Z","shell.execute_reply.started":"2024-03-04T15:05:21.360461Z","shell.execute_reply":"2024-03-04T15:05:21.371840Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"malignant = df_labels.loc[df_labels['label']==1]['id'].values    \nnormal = df_labels.loc[df_labels['label']==0]['id'].values      \ndf_labels['label'].hist()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:21.374222Z","iopub.execute_input":"2024-03-04T15:05:21.374626Z","iopub.status.idle":"2024-03-04T15:05:21.665177Z","shell.execute_reply.started":"2024-03-04T15:05:21.374588Z","shell.execute_reply":"2024-03-04T15:05:21.664187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_fig(ids,title,nrows=3,ncols=3):\n\n    fig,ax = plt.subplots(nrows,ncols,figsize=(7,7))\n    plt.subplots_adjust(wspace=0, hspace=0) \n    for i,j in enumerate(ids[:nrows*ncols]):\n        fname = os.path.join(train ,j +'.tif')\n        img = Image.open(fname)\n        idcol = ImageDraw.Draw(img)\n        idcol.rectangle(((0,0),(95,95)),outline='white')\n        plt.subplot(nrows, ncols, i+1) \n        plt.imshow(np.array(img))\n        plt.axis('off')\n\n    plt.suptitle(title, y=0.94)","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:21.669221Z","iopub.execute_input":"2024-03-04T15:05:21.669560Z","iopub.status.idle":"2024-03-04T15:05:21.676763Z","shell.execute_reply.started":"2024-03-04T15:05:21.669536Z","shell.execute_reply":"2024-03-04T15:05:21.675836Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_fig(malignant,'Malignant cases')","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:21.678001Z","iopub.execute_input":"2024-03-04T15:05:21.678341Z","iopub.status.idle":"2024-03-04T15:05:22.347510Z","shell.execute_reply.started":"2024-03-04T15:05:21.678310Z","shell.execute_reply":"2024-03-04T15:05:22.346526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_fig(normal,'Normal cases')","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:22.348576Z","iopub.execute_input":"2024-03-04T15:05:22.348875Z","iopub.status.idle":"2024-03-04T15:05:23.022381Z","shell.execute_reply.started":"2024-03-04T15:05:22.348850Z","shell.execute_reply":"2024-03-04T15:05:23.021477Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data, val_data = train_test_split(df_labels, test_size=0.2, random_state=42, stratify=df_labels['label'])","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:23.023609Z","iopub.execute_input":"2024-03-04T15:05:23.023989Z","iopub.status.idle":"2024-03-04T15:05:23.037243Z","shell.execute_reply.started":"2024-03-04T15:05:23.023959Z","shell.execute_reply":"2024-03-04T15:05:23.036371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = train_data.astype(str)\nval_data = val_data.astype(str)\nprint(train_data.shape,val_data.shape)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:23.038607Z","iopub.execute_input":"2024-03-04T15:05:23.038932Z","iopub.status.idle":"2024-03-04T15:05:23.049244Z","shell.execute_reply.started":"2024-03-04T15:05:23.038907Z","shell.execute_reply":"2024-03-04T15:05:23.048233Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Too much data (will take a long )**\n**remove half from each set**","metadata":{}},{"cell_type":"code","source":"train_data = train_data.head(len(train_data) )\n\n# Remove half of the samples from val_data\nval_data = val_data.head(len(val_data) )\n\nprint(\"Training data shape:\", train_data.shape)\nprint(\"Validation data shape:\", val_data.shape)","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:23.050390Z","iopub.execute_input":"2024-03-04T15:05:23.050695Z","iopub.status.idle":"2024-03-04T15:05:23.058494Z","shell.execute_reply.started":"2024-03-04T15:05:23.050671Z","shell.execute_reply":"2024-03-04T15:05:23.057690Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    rescale=1./255,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:23.059479Z","iopub.execute_input":"2024-03-04T15:05:23.059771Z","iopub.status.idle":"2024-03-04T15:05:23.066989Z","shell.execute_reply.started":"2024-03-04T15:05:23.059749Z","shell.execute_reply":"2024-03-04T15:05:23.066120Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_datagen = ImageDataGenerator(rescale=1./255)\ntest_datagen = ImageDataGenerator(rescale=1./255)","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:23.069302Z","iopub.execute_input":"2024-03-04T15:05:23.069587Z","iopub.status.idle":"2024-03-04T15:05:23.075183Z","shell.execute_reply.started":"2024-03-04T15:05:23.069565Z","shell.execute_reply":"2024-03-04T15:05:23.074025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data['id'] += '.tif'\nval_data['id'] += '.tif'","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:23.076282Z","iopub.execute_input":"2024-03-04T15:05:23.076617Z","iopub.status.idle":"2024-03-04T15:05:23.086656Z","shell.execute_reply.started":"2024-03-04T15:05:23.076586Z","shell.execute_reply":"2024-03-04T15:05:23.085760Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = train_datagen.flow_from_dataframe(\n    dataframe=train_data,\n    directory = train,\n    x_col = 'id',\n    y_col = 'label',\n    target_size=(96,96),\n    batch_size=32,\n    class_mode='binary'\n)\ntrain_generator_enc = train_datagen.flow_from_dataframe(\n    dataframe=train_data,\n    directory = train,\n    x_col = 'id',\n    y_col = 'label',\n    target_size=(96,96),\n    batch_size=32,\n    class_mode='input'\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:23.088129Z","iopub.execute_input":"2024-03-04T15:05:23.088557Z","iopub.status.idle":"2024-03-04T15:05:53.644696Z","shell.execute_reply.started":"2024-03-04T15:05:23.088526Z","shell.execute_reply":"2024-03-04T15:05:53.643831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_generator = val_datagen.flow_from_dataframe(\n    dataframe=val_data,\n    directory = train,\n    x_col='id',\n    y_col='label',\n    target_size=(96,96),\n    batch_size=32,\n    class_mode='binary'\n)\nval_generator_enc = val_datagen.flow_from_dataframe(\n    dataframe=val_data,\n    directory = train,\n    x_col='id',\n    y_col='label',\n    target_size=(96,96),\n    batch_size=32,\n    class_mode='input'\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:05:53.645684Z","iopub.execute_input":"2024-03-04T15:05:53.645966Z","iopub.status.idle":"2024-03-04T15:06:00.729276Z","shell.execute_reply.started":"2024-03-04T15:05:53.645943Z","shell.execute_reply":"2024-03-04T15:06:00.728325Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = df_samples.astype(str)\ntest_data = test_data[:1000]\ntest_data['id'] += '.tif'","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:06:00.730533Z","iopub.execute_input":"2024-03-04T15:06:00.730994Z","iopub.status.idle":"2024-03-04T15:06:00.741151Z","shell.execute_reply.started":"2024-03-04T15:06:00.730961Z","shell.execute_reply":"2024-03-04T15:06:00.740239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_datagen.flow_from_dataframe(\n    dataframe=test_data,\n    directory = test,\n    x_col='id',\n    y_col='label',\n    target_size=(96,96),\n    batch_size=32,\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:06:00.742437Z","iopub.execute_input":"2024-03-04T15:06:00.743418Z","iopub.status.idle":"2024-03-04T15:06:03.346166Z","shell.execute_reply.started":"2024-03-04T15:06:00.743388Z","shell.execute_reply":"2024-03-04T15:06:03.345207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training CNN Using Auto-Encoders\n","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.layers import Input, Conv2D, Flatten, Dense, Conv2DTranspose, Reshape, Lambda, MaxPooling2D, UpSampling2D\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.datasets import mnist\n\n# Step 1: Build and Train Autoencoder Models\ninput_shape = (96, 96, 3)\n\n# Define the AE architecture\ndef create_autoencoder(input_shape):\n    # Encoder\n    encoder_inputs = Input(shape=input_shape)\n    x = Conv2D(32, kernel_size=3, activation='relu', padding='same')(encoder_inputs)\n    x = MaxPooling2D(pool_size=(2, 2), padding='same')(x)\n    x = Conv2D(64, kernel_size=3, activation='relu', padding='same')(x)\n    x = MaxPooling2D(pool_size=(2, 2), padding='same')(x)\n    x = Flatten()(x)\n    encoded = Dense(128, activation='relu')(x)\n    \n    # Decoder\n    x = Dense(24*24*64, activation='relu')(encoded)  # Adjusted size for 96x96px images\n    x = Reshape((24, 24, 64))(x)\n    x = Conv2DTranspose(64, kernel_size=3, activation='relu', strides=2, padding='same')(x)\n    x = Conv2DTranspose(32, kernel_size=3, activation='relu', strides=2, padding='same')(x)\n    decoded = Conv2DTranspose(3, kernel_size=3, activation='sigmoid', padding='same')(x)  # Adjusted for color images\n    \n    autoencoder = Model(encoder_inputs, decoded)\n    autoencoder.compile(optimizer='adam', loss='binary_crossentropy')\n    \n    return autoencoder\n\n\n# Train AE model\ninput_shape = (96, 96, 3)\nae_model = create_autoencoder(input_shape)\ntrain_steps_per_epoch = len(train_data) \nval_steps_per_epoch = len(val_data) \nprint(\"==============fitting Auto encoder model =================\")\nae_model.fit(\n    train_generator_enc,\n    steps_per_epoch=100,\n    epochs=10,\n    validation_data=val_generator_enc,\n    validation_steps=val_steps_per_epoch\n)\n# Step 2: Generate Compressed Images\nprint(\"============== Image Compressing =================\")\n# Obtain compressed representations from AE model\ncompressed_train = ae_model.predict(train_generator)\ncompressed_test = ae_model.predict(test_generator)\ncompressed_val = ae_model.predict(val_generator)\n\n# Step 3: Train CNN Models for Image Classification\n\n# Define CNN architecture\ndef create_cnn_classifier(input_shape):\n    inputs = Input(shape=input_shape)\n    x = Conv2D(32, kernel_size=3, activation='relu')(inputs)\n    x = MaxPooling2D(pool_size=(2, 2))(x)\n    x = Conv2D(64, kernel_size=3, activation='relu')(x)\n    x = MaxPooling2D(pool_size=(2, 2))(x)\n    x = Flatten()(x)\n    x = Dense(128, activation='relu')(x)\n    outputs = Dense(10, activation='softmax')(x)\n    model = Model(inputs, outputs)\n    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n    return model\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:06:03.347709Z","iopub.execute_input":"2024-03-04T15:06:03.348064Z","iopub.status.idle":"2024-03-04T15:10:12.219844Z","shell.execute_reply.started":"2024-03-04T15:06:03.348037Z","shell.execute_reply":"2024-03-04T15:10:12.218731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n# Train CNN model on AE compressed images\ntrain_labels = train_data['label'].astype(int)\ntest_labels = test_data['label'].astype(int)\nval_labels = val_data['label'].astype(int)\ncnn_model_ae = create_cnn_classifier(compressed_train.shape[1:])\nprint(\"============== fitting Auto encoder model with compressed Image =================\")\nhistory = cnn_model_ae.fit(compressed_train,train_labels,\n    steps_per_epoch=100,\n    epochs=10,\n    validation_data=(compressed_test,test_labels),\n    validation_steps=val_steps_per_epoch)\n\n# Train CNN model on original images\n\nprint(\"============== fitting Auto encoder model with origional Image =================\")\ncnn_model_orig = create_cnn_classifier(input_shape)\ncnn_model_orig.fit( train_generator,\n    steps_per_epoch=100,\n    epochs=10,\n    validation_data=test_generator,\n    validation_steps=val_steps_per_epoch)","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:10:12.227140Z","iopub.execute_input":"2024-03-04T15:10:12.227508Z","iopub.status.idle":"2024-03-04T15:12:40.749876Z","shell.execute_reply.started":"2024-03-04T15:10:12.227483Z","shell.execute_reply":"2024-03-04T15:12:40.748840Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Accuracy on comrpressed = 60 and origional = 58","metadata":{}},{"cell_type":"code","source":"#CNN model comparasion\nfrom sklearn.metrics import accuracy_score\n\ntestData1 = val_data['label'].astype(int)\n\ndef getAccuracy(model):\n    data = model.predict(val_generator)\n    data = np.round(data.flatten()).astype('int')\n    data = data[:2000]\n    score = accuracy_score(data,testData1)\n    return score\n    \n    \naccuracy_orig = getAccuracy(cnn_model_orig)\nloss_ae, accuracy_ae = cnn_model_ae.evaluate(compressed_val, testData1)\n\nprint(\"Accuracy of CNN model trained on AE compressed images:\", accuracy_ae)\nprint(\"Accuracy of CNN model trained on original images:\", accuracy_orig)","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:14:37.236001Z","iopub.execute_input":"2024-03-04T15:14:37.236850Z","iopub.status.idle":"2024-03-04T15:14:42.016997Z","shell.execute_reply.started":"2024-03-04T15:14:37.236807Z","shell.execute_reply":"2024-03-04T15:14:42.016083Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Creating Variational Auto Encoders","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.layers import Input, Conv2D, Flatten, Dense, Conv2DTranspose, Reshape, Lambda, MaxPooling2D, UpSampling2D\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.datasets import mnist\nimport tensorflow.keras.backend as K\n\n# Step 1: Build and Train VAE Models\n\n# Define the VAE architecture\ndef create_vae(input_shape, latent_dim):\n    # Encoder\n    encoder_inputs = Input(shape=input_shape)\n    x = Conv2D(32, kernel_size=3, activation='relu', strides=2, padding='same')(encoder_inputs)\n    x = Conv2D(64, kernel_size=3, activation='relu', strides=2, padding='same')(x)\n    x = Flatten()(x)\n    x = Dense(16, activation='relu')(x)\n    z_mean = Dense(latent_dim, name=\"z_mean\")(x)\n    z_log_var = Dense(latent_dim, name=\"z_log_var\")(x)\n    \n    # Sampling\n    def sampling(args):\n        z_mean, z_log_var = args\n        batch = K.shape(z_mean)[0]\n        dim = K.shape(z_mean)[1]\n        epsilon = K.random_normal(shape=(batch, dim), mean=0., stddev=1.)\n        return z_mean + K.exp(0.5 * z_log_var) * epsilon\n\n    # Specify the output shape of the sampling function\n    output_shape = (latent_dim,)\n\n    # Create the Lambda layer with specified output shape\n    z = Lambda(sampling, output_shape=output_shape)([z_mean, z_log_var])\n    \n    encoder = Model(encoder_inputs, [z_mean, z_log_var, z], name=\"encoder\")\n\n    # Decoder\n    latent_inputs = Input(shape=(latent_dim,))\n    x = Dense(7 * 7 * 64, activation='relu')(latent_inputs)\n    x = Reshape((7, 7, 64))(x)\n    x = Conv2DTranspose(64, kernel_size=3, activation='relu', strides=2, padding='same')(x)\n    x = Conv2DTranspose(32, kernel_size=3, activation='relu', strides=2, padding='same')(x)\n    decoder_outputs = Conv2DTranspose(1, kernel_size=3, activation='sigmoid', padding='same')(x)\n    \n    decoder = Model(latent_inputs, decoder_outputs, name=\"decoder\")\n\n    # VAE\n    vae_outputs = decoder(z)\n    vae = Model(encoder_inputs, vae_outputs, name=\"vae\")\n\n    return vae\n\n# Example usage:\ninput_shape = (96, 96, 3)\nlatent_dim = 2\nvae_model = create_vae(input_shape, latent_dim)\nvae_model.compile(optimizer='adam', loss='mse')  # Use mean squared error for image reconstruction\nvae_model.summary()\n\n\nvae_model.fit(train_generator,\n              steps_per_epoch=100,\n              epochs=10,\n              validation_data=val_generator,\n              validation_steps=val_steps_per_epoch)\n\n# Step 2: Generate Compressed Images from VAE\n\n# Obtain compressed representations from VAE encoder\ncompressed_train_vae = vae_model.predict(train_generator)\ncompressed_test_vae = vae_model.predict(test_generator)\ncompressed_val_vae = vae_model.predict(val_generator)\n\n# Train CNN model on VAE compressed images\ntrain_labels = train_data['label'].astype(int)\ntest_labels = test_data['label'].astype(int)\n\ncnn_model_vae = create_cnn_classifier(compressed_train_vae.shape[1:])\ncnn_model_vae.fit(compressed_train_vae, train_labels,\n                  steps_per_epoch=100,\n                  epochs=10,\n                  validation_data=(compressed_test_vae, test_labels),\n                  validation_steps=val_steps_per_epoch)\n\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-04T15:20:17.868446Z","iopub.execute_input":"2024-03-04T15:20:17.868950Z","iopub.status.idle":"2024-03-04T15:23:40.107611Z","shell.execute_reply.started":"2024-03-04T15:20:17.868909Z","shell.execute_reply":"2024-03-04T15:23:40.106703Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 57% accuracy Using VAE","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nval_labels = val_data['label'].astype(int)\ntestData1 = val_data['label'].astype(int)\n\ndef getAccuracyVAE(model):\n    data = model.predict(compressed_val_vae)\n    data = np.round(data.flatten()).astype('int')\n    data = data[:2000]\n    score = accuracy_score(data,val_labels)\n    return score\n\n\ndef getAccuracy(model):\n    data = model.predict(val_generator)\n    data = np.round(data.flatten()).astype('int')\n    data = data[:2000]\n    score = accuracy_score(data,val_labels)\n    return score\n    \n\n# Calculate accuracy scores\naccuracy_orig = getAccuracy(cnn_model_orig)\nloss_ae, accuracy_ae = cnn_model_ae.evaluate(compressed_val, val_labels)\npredictions = getAccuracyVAE(cnn_model_vae)\n\n# Store the accuracy scores in a DataFrame\ndata = {\n    'Model': ['Original CNN', 'AE Compressed CNN', 'VAE Compressed CNN'],\n    'Accuracy': [accuracy_orig, accuracy_ae, predictions]\n}\n\n# Create a DataFrame\ndf = pd.DataFrame(data)\n\n# Display the DataFrame\nprint(df)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-04T17:00:58.889521Z","iopub.execute_input":"2024-03-04T17:00:58.890267Z","iopub.status.idle":"2024-03-04T17:01:03.138592Z","shell.execute_reply.started":"2024-03-04T17:00:58.890233Z","shell.execute_reply":"2024-03-04T17:01:03.137599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# performance of optimisers ","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# Define optimizers to compare\noptimizers = ['adam', 'rmsprop', 'sgd']\n\n# Define lists to store training and validation metrics for each optimizer\ntrain_losses = []\nval_losses = []\n\n# Loop through each optimizer\nfor optimizer in optimizers:\n    # Create a new instance of the VAE model\n    cnn_model_vae = create_cnn_classifier(compressed_train_vae.shape[1:])\n    \n    # Compile the model with the current optimizer\n    cnn_model_vae.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n    \n    # Train the model\n    history = cnn_model_vae.fit(compressed_train_vae, train_labels,\n                                 steps_per_epoch=100,\n                                 epochs=10,\n                                 validation_data=(compressed_test_vae, test_labels),\n                                 validation_steps=val_steps_per_epoch,\n                                 verbose=0)  # Set verbose to 0 to suppress training output\n    \n    # Append training and validation loss to the respective lists\n    train_losses.append(history.history['loss'])\n    val_losses.append(history.history['val_loss'])\n\n# Plot training and validation loss for each optimizer\nplt.figure(figsize=(10, 6))\nfor i, optimizer in enumerate(optimizers):\n    plt.plot(train_losses[i], label=f'{optimizer}_train')\n    plt.plot(val_losses[i], label=f'{optimizer}_val')\n\nplt.title('Training and Validation Loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\nplt.grid(True)\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-04T16:12:53.241757Z","iopub.execute_input":"2024-03-04T16:12:53.242517Z","iopub.status.idle":"2024-03-04T16:13:45.977825Z","shell.execute_reply.started":"2024-03-04T16:12:53.242484Z","shell.execute_reply":"2024-03-04T16:13:45.976774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# regularisation vs no regularisation ","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nfrom keras.callbacks import EarlyStopping\nfrom keras.layers import Dropout\nfrom keras import regularizers\n\n# Define your CNN model with regularization\ndef create_cnn_classifier(input_shape, dropout_rate=None, weight_decay=None):\n    inputs = Input(shape=input_shape)\n    x = Conv2D(32, kernel_size=3, activation='relu')(inputs)\n    x = MaxPooling2D(pool_size=(2, 2))(x)\n    x = Conv2D(64, kernel_size=3, activation='relu')(x)\n    x = MaxPooling2D(pool_size=(2, 2))(x)\n    x = Flatten()(x)\n    if dropout_rate:\n        x = Dropout(dropout_rate)(x)\n    if weight_decay:\n        x = Dense(128, activation='relu', kernel_regularizer=regularizers.l2(weight_decay))(x)\n    else:\n        x = Dense(128, activation='relu')(x)\n    outputs = Dense(10, activation='softmax')(x)\n    model = Model(inputs, outputs)\n    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n    return model\n\n# Create CNN model without regularization\ncnn_model_no_reg = create_cnn_classifier(input_shape)\n\n# Train the model without regularization\nhistory_no_reg = cnn_model_no_reg.fit(train_generator,\n                                      steps_per_epoch=100,\n                                      epochs=10,\n                                      validation_data=(test_generator),\n                                      validation_steps=val_steps_per_epoch,\n                                      verbose=0)\n\n# Create CNN model with regularization (dropout and weight decay)\ncnn_model_with_reg = create_cnn_classifier(input_shape, dropout_rate=0.5, weight_decay=1e-4)\n\n# Define early stopping callback\nearly_stopping = EarlyStopping(patience=3, restore_best_weights=True)\n\n# Train the model with regularization\nhistory_with_reg = cnn_model_with_reg.fit(train_generator,\n                                          steps_per_epoch=100,\n                                          epochs=10,\n                                          validation_data=test_generator,\n                                          validation_steps=val_steps_per_epoch,\n                                          callbacks=[early_stopping],\n                                          verbose=0)\n\n# Plot training and validation loss for both scenarios\nplt.figure(figsize=(12, 6))\n\nplt.subplot(1, 2, 1)\nplt.plot(history_no_reg.history['loss'], label='Train (No Reg)')\nplt.plot(history_no_reg.history['val_loss'], label='Val (No Reg)')\nplt.plot(history_with_reg.history['loss'], label='Train (With Reg)')\nplt.plot(history_with_reg.history['val_loss'], label='Val (With Reg)')\nplt.title('Training and Validation Loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\n\nplt.subplot(1, 2, 2)\nplt.plot(history_no_reg.history['accuracy'], label='Train (No Reg)')\nplt.plot(history_no_reg.history['val_accuracy'], label='Val (No Reg)')\nplt.plot(history_with_reg.history['accuracy'], label='Train (With Reg)')\nplt.plot(history_with_reg.history['val_accuracy'], label='Val (With Reg)')\nplt.title('Training and Validation Accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy')\nplt.legend()\n\nplt.tight_layout()\nplt.show()\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-04T16:31:19.932488Z","iopub.execute_input":"2024-03-04T16:31:19.933341Z","iopub.status.idle":"2024-03-04T16:34:09.884864Z","shell.execute_reply.started":"2024-03-04T16:31:19.933310Z","shell.execute_reply":"2024-03-04T16:34:09.883829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}