{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceType":"datasetVersion","sourceId":4748798,"datasetId":2716794,"databundleVersionId":4811894},{"sourceType":"datasetVersion","sourceId":1003830,"datasetId":550917,"databundleVersionId":1032543},{"sourceType":"datasetVersion","sourceId":28903,"datasetId":22535,"databundleVersionId":28946},{"sourceType":"datasetVersion","sourceId":1351797,"datasetId":786787,"databundleVersionId":1384195},{"sourceType":"datasetVersion","sourceId":6504606,"datasetId":3758654,"databundleVersionId":6586949}],"dockerImageVersionId":30559,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport os\nimport cv2\nimport glob as gb\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.image as mpimg\nfrom tqdm import tqdm\nfrom PIL import Image\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\n\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import ReduceLROnPlateau\nfrom keras.callbacks import EarlyStopping\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report, confusion_matrix\nfrom keras.optimizers import Adam\n\nfrom keras.applications import DenseNet121\nfrom keras.applications import ResNet50V2\nfrom keras.applications import ResNet152V2\nfrom keras.applications import InceptionV3\nfrom keras.applications import Xception","metadata":{"_kg_hide-output":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:01:50.877272Z","iopub.execute_input":"2024-11-24T08:01:50.87751Z","iopub.status.idle":"2024-11-24T08:01:54.464792Z","shell.execute_reply.started":"2024-11-24T08:01:50.877485Z","shell.execute_reply":"2024-11-24T08:01:54.464084Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# pip install kagglehub","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:01:54.470443Z","iopub.execute_input":"2024-11-24T08:01:54.470717Z","iopub.status.idle":"2024-11-24T08:01:54.474364Z","shell.execute_reply.started":"2024-11-24T08:01:54.470695Z","shell.execute_reply":"2024-11-24T08:01:54.473498Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import kagglehub\n\n# # Download latest version\n# path = kagglehub.dataset_download(\"shuvoalok/raf-db-dataset\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:01:54.505985Z","iopub.execute_input":"2024-11-24T08:01:54.506295Z","iopub.status.idle":"2024-11-24T08:01:54.515175Z","shell.execute_reply.started":"2024-11-24T08:01:54.506268Z","shell.execute_reply":"2024-11-24T08:01:54.514294Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# fer2013_path = kagglehub.dataset_download('msambare/fer2013')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:01:54.516156Z","iopub.execute_input":"2024-11-24T08:01:54.516417Z","iopub.status.idle":"2024-11-24T08:01:54.524501Z","shell.execute_reply.started":"2024-11-24T08:01:54.516397Z","shell.execute_reply":"2024-11-24T08:01:54.523862Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_path = '/kaggle/input/raf-db-dataset/DATASET/train'\ntest_path = '/kaggle/input/raf-db-dataset/DATASET/test'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:01:54.525428Z","iopub.execute_input":"2024-11-24T08:01:54.525738Z","iopub.status.idle":"2024-11-24T08:01:54.535826Z","shell.execute_reply.started":"2024-11-24T08:01:54.52571Z","shell.execute_reply":"2024-11-24T08:01:54.535073Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n        rescale=1./255,\n        brightness_range=[0.9,1.1],\n        horizontal_flip=True,\n        fill_mode='nearest'\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:01:54.536872Z","iopub.execute_input":"2024-11-24T08:01:54.537376Z","iopub.status.idle":"2024-11-24T08:01:54.547847Z","shell.execute_reply.started":"2024-11-24T08:01:54.537346Z","shell.execute_reply":"2024-11-24T08:01:54.547088Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_size = 100\nbatch_size = 64","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:02:00.320473Z","iopub.execute_input":"2024-11-24T08:02:00.321361Z","iopub.status.idle":"2024-11-24T08:02:00.325104Z","shell.execute_reply.started":"2024-11-24T08:02:00.321324Z","shell.execute_reply":"2024-11-24T08:02:00.324209Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_generator = train_datagen.flow_from_directory(\n    train_path,                  \n    target_size=(images_size, images_size), \n    batch_size=batch_size,          \n    seed=32,                       \n    shuffle=True,                    \n    class_mode='categorical'       \n)","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:02:04.476476Z","iopub.execute_input":"2024-11-24T08:02:04.476818Z","iopub.status.idle":"2024-11-24T08:02:14.485345Z","shell.execute_reply.started":"2024-11-24T08:02:04.476793Z","shell.execute_reply":"2024-11-24T08:02:14.48466Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n\nlabel_mapping = {0: \"surprise\", 1: \"disgust\", 2: \"fear\", 3: \"happy\", 4: \"sad\", 5: \"angry\", 6: \"neutral\"}\nclass_labels = list(train_generator.class_indices.keys())\nclass_counts = {label_mapping[i]: 0 for i in range(len(label_mapping))}\n\nfor i in range(len(train_generator)):\n    batch_data, batch_labels = train_generator[i]\n    for j in range(len(batch_data)):\n        class_idx = int(batch_labels[j].argmax())\n        class_label = label_mapping[class_idx]\n        class_counts[class_label] += 1\n\nclass_colors = plt.cm.tab20(np.linspace(0, 1, len(class_labels)))\n\nplt.figure(figsize=(10, 6))\nbars = plt.bar(class_counts.keys(), class_counts.values(), color=class_colors)\nplt.xlabel('Class')\nplt.ylabel('Count')\nplt.title('Number of Images per Class')\nplt.xticks(rotation=45)\n\nlegend_labels = [plt.Line2D([0], [0], color=class_colors[i], lw=4, label=list(label_mapping.values())[i]) for i in range(len(label_mapping))]\nplt.legend(handles=legend_labels, title=\"Classes\", bbox_to_anchor=(1.05, 1), loc='upper left')\n\nplt.tight_layout()\nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:02:53.016104Z","iopub.execute_input":"2024-11-24T08:02:53.016722Z","iopub.status.idle":"2024-11-24T08:03:09.989545Z","shell.execute_reply.started":"2024-11-24T08:02:53.016692Z","shell.execute_reply":"2024-11-24T08:03:09.988743Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(\n        rescale=1./255,\n        validation_split=0.5\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:03:21.689753Z","iopub.execute_input":"2024-11-24T08:03:21.690137Z","iopub.status.idle":"2024-11-24T08:03:21.694244Z","shell.execute_reply.started":"2024-11-24T08:03:21.690109Z","shell.execute_reply":"2024-11-24T08:03:21.69335Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_generator = test_datagen.flow_from_directory(\n    test_path,\n    target_size=(images_size, images_size),\n    batch_size = batch_size,\n    shuffle=False,\n    class_mode='categorical')","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:03:58.346583Z","iopub.execute_input":"2024-11-24T08:03:58.346911Z","iopub.status.idle":"2024-11-24T08:03:58.425767Z","shell.execute_reply.started":"2024-11-24T08:03:58.346884Z","shell.execute_reply":"2024-11-24T08:03:58.42516Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"label_mapping = {0: \"surprise\", 1: \"disgust\", 2: \"fear\", 3: \"happy\", 4: \"sad\", 5: \"angry\", 6: \"neutral\"}\nclass_labels = list(test_generator.class_indices.keys())\nclass_counts = {label_mapping[i]: 0 for i in range(len(label_mapping))}\n\nfor i in range(len(test_generator)):\n    batch_data, batch_labels = test_generator[i]\n    for j in range(len(batch_data)):\n        class_idx = int(batch_labels[j].argmax())\n        class_label = label_mapping[class_idx]\n        class_counts[class_label] += 1\n\nclass_colors = plt.cm.tab20(np.linspace(0, 1, len(class_labels)))\n\nplt.figure(figsize=(10, 6))\nbars = plt.bar(class_counts.keys(), class_counts.values(), color=class_colors)\nplt.xlabel('Class')\nplt.ylabel('Count')\nplt.title('Number of Images per Class')\nplt.xticks(rotation=45)\n\nlegend_labels = [plt.Line2D([0], [0], color=class_colors[i], lw=4, label=list(label_mapping.values())[i]) for i in range(len(label_mapping))]\nplt.legend(handles=legend_labels, title=\"Classes\", bbox_to_anchor=(1.05, 1), loc='upper left')\n\nplt.tight_layout()\nplt.show()\n","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:04:14.250406Z","iopub.execute_input":"2024-11-24T08:04:14.250733Z","iopub.status.idle":"2024-11-24T08:04:17.407324Z","shell.execute_reply.started":"2024-11-24T08:04:14.250706Z","shell.execute_reply":"2024-11-24T08:04:17.406456Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def Show_Images(target_gen):\n    batch_images, batch_labels = next(target_gen)\n    label_mapping = {0: \"surprise\", 1: \"disgust\", 2: \"fear\", 3: \"happy\", 4: \"sad\", 5: \"angry\", 6: \"neutral\"}\n\n    plt.figure(figsize=(20, 20))\n    for n, i in enumerate(np.random.randint(0, len(batch_images), 16)):\n        plt.subplot(4, 4, n + 1)\n        plt.imshow(batch_images[i])\n        label_idx = np.argmax(batch_labels[i])  # Mengambil index label\n        plt.title(label_mapping[label_idx])  # Menggunakan label_mapping untuk nama kelas\n        plt.axis('off')\n    plt.show()","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:05:10.986725Z","iopub.execute_input":"2024-11-24T08:05:10.987082Z","iopub.status.idle":"2024-11-24T08:05:10.993022Z","shell.execute_reply.started":"2024-11-24T08:05:10.987052Z","shell.execute_reply":"2024-11-24T08:05:10.992208Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Show_Images(train_generator)","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:05:11.321618Z","iopub.execute_input":"2024-11-24T08:05:11.322224Z","iopub.status.idle":"2024-11-24T08:05:12.67571Z","shell.execute_reply.started":"2024-11-24T08:05:11.322197Z","shell.execute_reply":"2024-11-24T08:05:12.674919Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Show_Images(test_generator)","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:05:12.994164Z","iopub.execute_input":"2024-11-24T08:05:12.994904Z","iopub.status.idle":"2024-11-24T08:05:13.976831Z","shell.execute_reply.started":"2024-11-24T08:05:12.994876Z","shell.execute_reply":"2024-11-24T08:05:13.975891Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"early_stopping = EarlyStopping(\n    min_delta=0.001,\n    patience=5,\n    restore_best_weights=True,\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:05:32.875504Z","iopub.execute_input":"2024-11-24T08:05:32.876319Z","iopub.status.idle":"2024-11-24T08:05:32.88Z","shell.execute_reply.started":"2024-11-24T08:05:32.876287Z","shell.execute_reply":"2024-11-24T08:05:32.879162Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"learning_rate_reduce = ReduceLROnPlateau(\n    monitor='val_acc',  \n    patience=5,         \n    verbose=1,          \n    factor=0.5,          \n    min_lr=0.00001       \n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:05:33.213975Z","iopub.execute_input":"2024-11-24T08:05:33.214273Z","iopub.status.idle":"2024-11-24T08:05:33.218562Z","shell.execute_reply.started":"2024-11-24T08:05:33.214251Z","shell.execute_reply":"2024-11-24T08:05:33.217681Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras import optimizers\n\nlearning_rate_schedule = keras.optimizers.schedules.ExponentialDecay(\n    initial_learning_rate=0.01, \n    decay_steps=1000,            \n    decay_rate=0.5,            \n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:05:35.01372Z","iopub.execute_input":"2024-11-24T08:05:35.014063Z","iopub.status.idle":"2024-11-24T08:05:35.01855Z","shell.execute_reply.started":"2024-11-24T08:05:35.014021Z","shell.execute_reply":"2024-11-24T08:05:35.01767Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from keras.callbacks import LearningRateScheduler\n\nlr_callback = LearningRateScheduler(learning_rate_schedule)\ncallback=[ lr_callback , learning_rate_reduce ,early_stopping ]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:05:36.318165Z","iopub.execute_input":"2024-11-24T08:05:36.318501Z","iopub.status.idle":"2024-11-24T08:05:36.323021Z","shell.execute_reply.started":"2024-11-24T08:05:36.318475Z","shell.execute_reply":"2024-11-24T08:05:36.322216Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from keras.layers import Conv2D, MaxPool2D, Flatten,Dense,Dropout,BatchNormalization\nfrom keras import regularizers\ndef CustomCNN():\n    model= tf.keras.models.Sequential()\n    model.add(Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu', input_shape=(images_size,images_size,3)))\n    model.add(Conv2D(64,(3,3), padding='same', activation='relu' ))\n    model.add(BatchNormalization())\n    model.add(MaxPool2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n    \n    model.add(Conv2D(128,(5,5), padding='same', activation='relu'))\n    model.add(BatchNormalization())\n    model.add(MaxPool2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n        \n    model.add(Conv2D(512,(3,3), padding='same', activation='relu', kernel_regularizer=regularizers.l2(0.01)))\n    model.add(BatchNormalization())\n    model.add(MaxPool2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n    \n    model.add(Conv2D(512,(3,3), padding='same', activation='relu', kernel_regularizer=regularizers.l2(0.01)))\n    model.add(BatchNormalization())\n    model.add(MaxPool2D(pool_size=(2, 2)))\n    model.add(Dropout(0.25))\n    \n    # model.add(Flatten()) \n    model.add(Dense(256,activation = 'relu'))\n    model.add(BatchNormalization())\n    model.add(Dropout(0.25))\n        \n    model.add(Dense(512,activation = 'relu'))\n    model.add(BatchNormalization())\n    model.add(Dropout(0.25))\n\n    return model\n    # model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:05:38.247349Z","iopub.execute_input":"2024-11-24T08:05:38.248148Z","iopub.status.idle":"2024-11-24T08:05:38.257129Z","shell.execute_reply.started":"2024-11-24T08:05:38.248114Z","shell.execute_reply":"2024-11-24T08:05:38.256262Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TL_Models = [\n    CustomCNN(),\n    ResNet50V2(input_shape=(images_size, images_size, 3), weights='imagenet', include_top=False),\n    ResNet152V2(input_shape=(images_size, images_size, 3), weights='imagenet', include_top=False),\n    InceptionV3(input_shape=(images_size, images_size, 3), weights='imagenet', include_top=False),\n    Xception(input_shape=(images_size, images_size, 3), weights='imagenet', include_top=False),\n    DenseNet121(input_shape=(images_size, images_size, 3), weights='imagenet', include_top=False),\n]\n\nTL_Models_NAMES = [\n    'CustomCNN',\n    'ResNet50V2',\n    'ResNet152V2',\n    'InceptionV3',\n    'Xception',\n    'DenseNet121',\n]\n\nfor tl_model, model_name in zip(TL_Models, TL_Models_NAMES):\n    if model_name == 'CustomCNN':\n        pass\n    else:\n        tl_model.trainable = False","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:05:45.269346Z","iopub.execute_input":"2024-11-24T08:05:45.270198Z","iopub.status.idle":"2024-11-24T08:05:57.840172Z","shell.execute_reply.started":"2024-11-24T08:05:45.270164Z","shell.execute_reply":"2024-11-24T08:05:57.839453Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"subset_images = []\nsubset_labels = []\n\ndesired_count = 200\n\nfor i in range(desired_count):\n    batch = train_generator.next()\n    images, labels = batch\n    subset_images.extend(images)\n    subset_labels.extend(labels)\n\n    if len(subset_images) >= desired_count:\n        break\n\nX_sub = np.array(subset_images)\ny_sub = np.array(subset_labels)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:05:57.84184Z","iopub.execute_input":"2024-11-24T08:05:57.842195Z","iopub.status.idle":"2024-11-24T08:05:58.270194Z","shell.execute_reply.started":"2024-11-24T08:05:57.842164Z","shell.execute_reply":"2024-11-24T08:05:58.269256Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"HISTORIES = []\n\nfor tl_model in tqdm(TL_Models, desc=\"Training Tl Models\"):\n    \n    model = keras.Sequential([\n        tl_model,\n        layers.GlobalAveragePooling2D(),\n        layers.Dropout(0.5),\n        layers.Dense(7, activation='softmax')\n        # layers.Dense(2, activation='softmax')\n    ])\n    \n    model.compile(\n        loss='categorical_crossentropy',\n        optimizer=Adam(learning_rate = learning_rate_schedule),\n        metrics='accuracy'\n    )\n    \n    history = model.fit(\n        X_sub, y_sub,\n        epochs=20,\n        validation_split=0.2,\n        batch_size=batch_size\n    )\n        \n    HISTORIES.append(history.history)","metadata":{"_kg_hide-output":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:09:05.76627Z","iopub.execute_input":"2024-11-24T08:09:05.76661Z","iopub.status.idle":"2024-11-24T08:10:06.769955Z","shell.execute_reply.started":"2024-11-24T08:09:05.766582Z","shell.execute_reply":"2024-11-24T08:10:06.769095Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nmetrics_to_plot = ['accuracy', 'loss', 'val_accuracy', 'val_loss']\n\nfig, axes = plt.subplots(len(metrics_to_plot), 1, figsize=(10, 20))\n\nfor i, metric in enumerate(metrics_to_plot):\n    for idx, history in enumerate(HISTORIES):\n        axes[i].plot(history[metric], label=TL_Models_NAMES[idx])\n    axes[i].set_title(f'{metric}')\n    axes[i].set_xlabel('Epochs')\n    axes[i].set_ylabel(metric)\n    axes[i].legend()\n\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:10:06.771447Z","iopub.execute_input":"2024-11-24T08:10:06.771716Z","iopub.status.idle":"2024-11-24T08:10:07.736477Z","shell.execute_reply.started":"2024-11-24T08:10:06.771692Z","shell.execute_reply":"2024-11-24T08:10:07.735587Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_model = DenseNet121(weights='imagenet', include_top=False, input_shape=(images_size, images_size, 3))","metadata":{"_kg_hide-output":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:10:34.861999Z","iopub.execute_input":"2024-11-24T08:10:34.862377Z","iopub.status.idle":"2024-11-24T08:10:37.567662Z","shell.execute_reply.started":"2024-11-24T08:10:34.862351Z","shell.execute_reply":"2024-11-24T08:10:37.566902Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Freeze the layers of the base model\nfor layer in base_model.layers:\n    layer.trainable = False","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:10:37.569337Z","iopub.execute_input":"2024-11-24T08:10:37.569687Z","iopub.status.idle":"2024-11-24T08:10:37.582848Z","shell.execute_reply.started":"2024-11-24T08:10:37.569656Z","shell.execute_reply":"2024-11-24T08:10:37.58184Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = tf.keras.models.Sequential([\n    base_model,\n    \n    layers.Flatten(),\n    \n    layers.Dense(256,activation='relu'),\n    layers.Dropout(0.5),\n    layers.Dense(7,activation='softmax'),\n    # layers.Dense(2,activation='softmax'),\n])\n\nmodel.summary()","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:10:40.193645Z","iopub.execute_input":"2024-11-24T08:10:40.193979Z","iopub.status.idle":"2024-11-24T08:10:41.116947Z","shell.execute_reply.started":"2024-11-24T08:10:40.193954Z","shell.execute_reply":"2024-11-24T08:10:41.116112Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"optimizer = optimizers.Adam(learning_rate=learning_rate_schedule)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:10:44.026643Z","iopub.execute_input":"2024-11-24T08:10:44.026976Z","iopub.status.idle":"2024-11-24T08:10:44.03925Z","shell.execute_reply.started":"2024-11-24T08:10:44.026951Z","shell.execute_reply":"2024-11-24T08:10:44.038303Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.compile(optimizer=optimizer,\n             loss=\"categorical_crossentropy\",\n              metrics=['accuracy']\n             )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:10:44.763015Z","iopub.execute_input":"2024-11-24T08:10:44.763664Z","iopub.status.idle":"2024-11-24T08:10:44.781946Z","shell.execute_reply.started":"2024-11-24T08:10:44.763634Z","shell.execute_reply":"2024-11-24T08:10:44.780884Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(\n    train_generator,\n    steps_per_epoch=train_generator.samples // batch_size,\n    epochs=50,\n    validation_data=test_generator,\n    validation_steps=test_generator.samples // batch_size,\n    callbacks=[callback]\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:15:07.333045Z","iopub.execute_input":"2024-11-24T08:15:07.333825Z","iopub.status.idle":"2024-11-24T08:19:50.371285Z","shell.execute_reply.started":"2024-11-24T08:15:07.333792Z","shell.execute_reply":"2024-11-24T08:19:50.370419Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Evaluate on test dataset\nscore = model.evaluate(test_generator, verbose=False)\nprint('Test loss:', score[0])\nprint('Test accuracy:', score[1])","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:23:32.490292Z","iopub.execute_input":"2024-11-24T08:23:32.490969Z","iopub.status.idle":"2024-11-24T08:23:37.128002Z","shell.execute_reply.started":"2024-11-24T08:23:32.490937Z","shell.execute_reply":"2024-11-24T08:23:37.127138Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Accuracy\nacc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nepochs = range(len(acc))\n\nplt.plot(epochs, acc, 'b', label='Training Accuracy')\nplt.plot(epochs, val_acc, 'r', label='Validation Accuracy')\nplt.title('Accuracy Graph')\nplt.legend()\nplt.figure()","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:23:40.305955Z","iopub.execute_input":"2024-11-24T08:23:40.306282Z","iopub.status.idle":"2024-11-24T08:23:40.604283Z","shell.execute_reply.started":"2024-11-24T08:23:40.306259Z","shell.execute_reply":"2024-11-24T08:23:40.603424Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Loss\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nplt.plot(epochs, loss, 'b', label='Training Loss')\nplt.plot(epochs, val_loss, 'r', label='Validation Loss')\nplt.title('Loss Graph')\nplt.legend()\nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:23:46.742028Z","iopub.execute_input":"2024-11-24T08:23:46.74241Z","iopub.status.idle":"2024-11-24T08:23:46.985938Z","shell.execute_reply.started":"2024-11-24T08:23:46.742385Z","shell.execute_reply":"2024-11-24T08:23:46.985087Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n\nlabel_mapping = {0: \"surprise\", 1: \"disgust\", 2: \"fear\", 3: \"happy\", 4: \"sad\", 5: \"angry\", 6: \"neutral\"}\n\ny_true = test_generator.classes\ny_pred_probs = model.predict(test_generator, steps=test_generator.samples // batch_size + 1)\ny_pred = np.argmax(y_pred_probs, axis=1)\n\ncm = confusion_matrix(y_true, y_pred)\nlabels = [label_mapping[i] for i in range(len(label_mapping))]\n\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)\ndisp.plot(cmap=plt.cm.Blues, xticks_rotation='vertical')\nplt.title('Confusion Matrix')\nplt.show()\n","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:23:47.510921Z","iopub.execute_input":"2024-11-24T08:23:47.511279Z","iopub.status.idle":"2024-11-24T08:23:52.858188Z","shell.execute_reply.started":"2024-11-24T08:23:47.511251Z","shell.execute_reply":"2024-11-24T08:23:52.857311Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n\n# Definisikan mapping label numerik ke nama kelas\nlabel_mapping = {0: \"surprise\", 1: \"disgust\", 2: \"fear\", 3: \"happy\", 4: \"sad\", 5: \"angry\", 6: \"neutral\"}\nnum_classes = len(label_mapping)\n\n# Variabel untuk menyimpan label sebenarnya dan prediksi\ntrue_labels = []\npredicted_labels = []\nx_data = []  # Untuk menyimpan semua gambar\n\n# Melakukan iterasi batch pada test_generator\nnum_batches = len(test_generator)\nfor i in range(num_batches):\n    x_batch, y_batch = test_generator[i]  # Mendapatkan batch data dan label\n    predictions = model.predict(x_batch)  # Prediksi dengan model\n\n    # Konversi dari one-hot encoding ke indeks kelas\n    true_labels.extend(np.argmax(y_batch, axis=1))\n    predicted_labels.extend(np.argmax(predictions, axis=1))\n    x_data.extend(x_batch)  # Menyimpan gambar\n\n# Ubah label numerik menjadi nama kelas\ntrue_class_labels = [label_mapping[i] for i in true_labels]\npredicted_class_labels = [label_mapping[i] for i in predicted_labels]\n\n# Pilih beberapa gambar untuk setiap label (misalnya, 3 gambar per kelas)\nsamples_per_class = 3  # Atur jumlah gambar yang ingin diambil untuk setiap kelas\nselected_indices = []\nfor label in range(num_classes):\n    indices = [i for i, t in enumerate(true_labels) if t == label]  # Cari semua indeks untuk label tertentu\n    selected_indices.extend(indices[:samples_per_class])  # Ambil hingga `samples_per_class` gambar per label\n\n# Plot gambar yang dipilih\nnum_images = len(selected_indices)\nplt.figure(figsize=(15, (num_images // 5 + 1) * 3))  # Tinggi disesuaikan dengan jumlah baris\nfor i, idx in enumerate(selected_indices):\n    img = x_data[idx]\n    if img.max() <= 1:  # Jika gambar dalam rentang [0, 1]\n        img = (img * 255).astype(\"uint8\")  # Ubah ke rentang [0, 255]\n\n    plt.subplot((num_images // 5 + 1), 5, i + 1)\n    plt.imshow(img)\n    plt.title(f\"True: {true_class_labels[idx]}\\nPred: {predicted_class_labels[idx]}\", fontsize=8)\n    plt.axis(\"off\")\n\nplt.tight_layout()\nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:24:58.865748Z","iopub.execute_input":"2024-11-24T08:24:58.866113Z","iopub.status.idle":"2024-11-24T08:25:08.24911Z","shell.execute_reply.started":"2024-11-24T08:24:58.866085Z","shell.execute_reply":"2024-11-24T08:25:08.248096Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_model = CustomCNN()\n# Freeze the layers of the base modelCustom\n# for layer in base_model.layers:\n#     layer.trainable = False\n\nmodelCustom = tf.keras.models.Sequential([\n    base_model,\n    \n    layers.Flatten(),\n    \n    layers.Dense(256,activation = 'relu'),\n    layers.BatchNormalization(),\n    layers.Dropout(0.25),\n        \n    layers.Dense(512,activation = 'relu'),\n    layers.BatchNormalization(),\n    layers.Dropout(0.25),\n    \n    layers.Dense(7, activation='softmax')\n])\n\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import LearningRateScheduler\n\ndef learning_rate_schedule(epoch):\n    initial_lr = 0.001\n    drop_factor = 0.5\n    epoch_drop = 10\n    return initial_lr * (drop_factor ** (epoch // epoch_drop))\n\nlr_callback = LearningRateScheduler(learning_rate_schedule)\n\noptimizer = Adam()\n\nmodelCustom.compile(optimizer=optimizer,\n              loss=\"categorical_crossentropy\",\n              metrics=['accuracy'])\n\nhistory = modelCustom.fit(train_generator,steps_per_epoch=train_generator.samples // batch_size,epochs=50,validation_data=test_generator,validation_steps=test_generator.samples // batch_size, callbacks=[lr_callback]  # Use the lr_callback here\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:25:46.252482Z","iopub.execute_input":"2024-11-24T08:25:46.253259Z","iopub.status.idle":"2024-11-24T08:44:15.858016Z","shell.execute_reply.started":"2024-11-24T08:25:46.253223Z","shell.execute_reply":"2024-11-24T08:44:15.85728Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Evaluate on test dataset\nscore = modelCustom.evaluate(test_generator, verbose=False)\nprint('Test loss:', score[0])\nprint('Test accuracy:', score[1])\n\n# Accuracy\nacc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nepochs = range(len(acc))\n\nplt.plot(epochs, acc, 'b', label='Training Accuracy')\nplt.plot(epochs, val_acc, 'r', label='Validation Accuracy')\nplt.title('Accuracy Graph')\nplt.legend()\nplt.figure()\n\n# Loss\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nplt.plot(epochs, loss, 'b', label='Training Loss')\nplt.plot(epochs, val_loss, 'r', label='Validation Loss')\nplt.title('Loss Graph')\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:46:37.284372Z","iopub.execute_input":"2024-11-24T08:46:37.285194Z","iopub.status.idle":"2024-11-24T08:46:41.637717Z","shell.execute_reply.started":"2024-11-24T08:46:37.285165Z","shell.execute_reply":"2024-11-24T08:46:41.636795Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n\nlabel_mapping = {0: \"surprise\", 1: \"disgust\", 2: \"fear\", 3: \"happy\", 4: \"sad\", 5: \"angry\", 6: \"neutral\"}\n\ny_true = test_generator.classes\ny_pred_probs = modelCustom.predict(test_generator, steps=test_generator.samples // batch_size + 1)\ny_pred = np.argmax(y_pred_probs, axis=1)\n\ncm = confusion_matrix(y_true, y_pred)\nlabels = [label_mapping[i] for i in range(len(label_mapping))]\n\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)\ndisp.plot(cmap=plt.cm.Blues, xticks_rotation='vertical')\nplt.title('Confusion Matrix')\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:47:44.575362Z","iopub.execute_input":"2024-11-24T08:47:44.575724Z","iopub.status.idle":"2024-11-24T08:47:47.99951Z","shell.execute_reply.started":"2024-11-24T08:47:44.575694Z","shell.execute_reply":"2024-11-24T08:47:47.998579Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n\n# Definisikan mapping label numerik ke nama kelas\nlabel_mapping = {0: \"surprise\", 1: \"disgust\", 2: \"fear\", 3: \"happy\", 4: \"sad\", 5: \"angry\", 6: \"neutral\"}\nnum_classes = len(label_mapping)\n\n# Variabel untuk menyimpan label sebenarnya dan prediksi\ntrue_labels = []\npredicted_labels = []\nx_data = []  # Untuk menyimpan semua gambar\n\n# Melakukan iterasi batch pada test_generator\nnum_batches = len(test_generator)\nfor i in range(num_batches):\n    x_batch, y_batch = test_generator[i]  # Mendapatkan batch data dan label\n    predictions = modelCustom.predict(x_batch)  # Prediksi dengan model\n\n    # Konversi dari one-hot encoding ke indeks kelas\n    true_labels.extend(np.argmax(y_batch, axis=1))\n    predicted_labels.extend(np.argmax(predictions, axis=1))\n    x_data.extend(x_batch)  # Menyimpan gambar\n\n# Ubah label numerik menjadi nama kelas\ntrue_class_labels = [label_mapping[i] for i in true_labels]\npredicted_class_labels = [label_mapping[i] for i in predicted_labels]\n\n# Pilih beberapa gambar untuk setiap label (misalnya, 3 gambar per kelas)\nsamples_per_class = 3  # Atur jumlah gambar yang ingin diambil untuk setiap kelas\nselected_indices = []\nfor label in range(num_classes):\n    indices = [i for i, t in enumerate(true_labels) if t == label]  # Cari semua indeks untuk label tertentu\n    selected_indices.extend(indices[:samples_per_class])  # Ambil hingga `samples_per_class` gambar per label\n\n# Plot gambar yang dipilih\nnum_images = len(selected_indices)\nplt.figure(figsize=(15, (num_images // 5 + 1) * 3))  # Tinggi disesuaikan dengan jumlah baris\nfor i, idx in enumerate(selected_indices):\n    img = x_data[idx]\n    if img.max() <= 1:  # Jika gambar dalam rentang [0, 1]\n        img = (img * 255).astype(\"uint8\")  # Ubah ke rentang [0, 255]\n\n    plt.subplot((num_images // 5 + 1), 3, i + 1)\n    plt.imshow(img)\n    plt.title(f\"True: {true_class_labels[idx]}\\nPred: {predicted_class_labels[idx]}\", fontsize=8)\n    plt.axis(\"off\")\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:50:52.790754Z","iopub.execute_input":"2024-11-24T08:50:52.791102Z","iopub.status.idle":"2024-11-24T08:51:00.157985Z","shell.execute_reply.started":"2024-11-24T08:50:52.791074Z","shell.execute_reply":"2024-11-24T08:51:00.156769Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}