Teknik-Informatika-PSDKU-Ng.../backend/train_model2.ipynb

831 lines
102 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "19ccb148-60d1-45d1-b58e-9c758566e5a1",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pickle\n",
"\n",
"from tensorflow.keras.applications import MobileNetV2\n",
"from tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Dropout\n",
"from tensorflow.keras.models import Model\n",
"from tensorflow.keras.optimizers import Adam\n",
"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
"from tensorflow.keras.applications.mobilenet_v2 import preprocess_input\n",
"from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\n",
"from sklearn.utils.class_weight import compute_class_weight"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "04f3db41-4d5e-4f44-8d1a-6a5203e4ca72",
"metadata": {},
"outputs": [],
"source": [
"BASE_DIR = os.getcwd()\n",
"\n",
"DATASET_DIR = os.path.join(BASE_DIR, \"dataset_model2\")\n",
"\n",
"TRAIN_DIR = os.path.join(DATASET_DIR, \"train\")\n",
"VAL_DIR = os.path.join(DATASET_DIR, \"val\")\n",
"\n",
"MODEL_DIR = os.path.join(BASE_DIR, \"model_2\")\n",
"os.makedirs(MODEL_DIR, exist_ok=True)\n",
"\n",
"BEST_MODEL_PATH = os.path.join(MODEL_DIR, \"model2_best.h5\")\n",
"LAST_MODEL_PATH = os.path.join(MODEL_DIR, \"model2_last.h5\")\n",
"\n",
"HISTORY_PATH = os.path.join(MODEL_DIR, \"history_model2.pkl\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "67f5b0af-d07c-433c-9dbc-75e54645de0e",
"metadata": {},
"outputs": [],
"source": [
"IMG_SIZE = (224, 224)\n",
"BATCH_SIZE = 32\n",
"EPOCHS = 10\n",
"LR = 1e-4"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "418edd54-6df0-426d-882c-27aeb435c7a8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 7834 images belonging to 3 classes.\n",
"Found 978 images belonging to 3 classes.\n",
"Class: {'hawar_daun': 0, 'karat_daun': 1, 'sehat': 2}\n",
"Jumlah kelas: 3\n"
]
}
],
"source": [
"train_datagen = ImageDataGenerator(\n",
" preprocessing_function=preprocess_input,\n",
" horizontal_flip=True,\n",
" rotation_range=15,\n",
" zoom_range=0.2,\n",
" brightness_range=[0.8, 1.2]\n",
")\n",
"\n",
"val_datagen = ImageDataGenerator(\n",
" preprocessing_function=preprocess_input\n",
")\n",
"\n",
"train_gen = train_datagen.flow_from_directory(\n",
" TRAIN_DIR,\n",
" target_size=IMG_SIZE,\n",
" batch_size=BATCH_SIZE,\n",
" class_mode=\"categorical\",\n",
" shuffle=True\n",
")\n",
"\n",
"val_gen = val_datagen.flow_from_directory(\n",
" VAL_DIR,\n",
" target_size=IMG_SIZE,\n",
" batch_size=BATCH_SIZE,\n",
" class_mode=\"categorical\",\n",
" shuffle=False\n",
")\n",
"\n",
"print(\"Class:\", train_gen.class_indices)\n",
"print(\"Jumlah kelas:\", train_gen.num_classes)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "2b858937-365f-437e-82ff-5630b46936e5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Class Weights: {0: 1.190215739896688, 1: 0.9130536130536131, 2: 0.9393285371702638}\n"
]
}
],
"source": [
"class_weights = compute_class_weight(\n",
" class_weight=\"balanced\",\n",
" classes=np.unique(train_gen.classes),\n",
" y=train_gen.classes\n",
")\n",
"\n",
"class_weights = dict(enumerate(class_weights))\n",
"print(\"Class Weights:\", class_weights)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "896ddd6f-5f0e-4ff7-bdf2-32ce057e4251",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"model\"\n",
"__________________________________________________________________________________________________\n",
" Layer (type) Output Shape Param # Connected to \n",
"==================================================================================================\n",
" input_1 (InputLayer) [(None, 224, 224, 3)] 0 [] \n",
" \n",
" Conv1 (Conv2D) (None, 112, 112, 32) 864 ['input_1[0][0]'] \n",
" \n",
" bn_Conv1 (BatchNormalizati (None, 112, 112, 32) 128 ['Conv1[0][0]'] \n",
" on) \n",
" \n",
" Conv1_relu (ReLU) (None, 112, 112, 32) 0 ['bn_Conv1[0][0]'] \n",
" \n",
" expanded_conv_depthwise (D (None, 112, 112, 32) 288 ['Conv1_relu[0][0]'] \n",
" epthwiseConv2D) \n",
" \n",
" expanded_conv_depthwise_BN (None, 112, 112, 32) 128 ['expanded_conv_depthwise[0][0\n",
" (BatchNormalization) ]'] \n",
" \n",
" expanded_conv_depthwise_re (None, 112, 112, 32) 0 ['expanded_conv_depthwise_BN[0\n",
" lu (ReLU) ][0]'] \n",
" \n",
" expanded_conv_project (Con (None, 112, 112, 16) 512 ['expanded_conv_depthwise_relu\n",
" v2D) [0][0]'] \n",
" \n",
" expanded_conv_project_BN ( (None, 112, 112, 16) 64 ['expanded_conv_project[0][0]'\n",
" BatchNormalization) ] \n",
" \n",
" block_1_expand (Conv2D) (None, 112, 112, 96) 1536 ['expanded_conv_project_BN[0][\n",
" 0]'] \n",
" \n",
" block_1_expand_BN (BatchNo (None, 112, 112, 96) 384 ['block_1_expand[0][0]'] \n",
" rmalization) \n",
" \n",
" block_1_expand_relu (ReLU) (None, 112, 112, 96) 0 ['block_1_expand_BN[0][0]'] \n",
" \n",
" block_1_pad (ZeroPadding2D (None, 113, 113, 96) 0 ['block_1_expand_relu[0][0]'] \n",
" ) \n",
" \n",
" block_1_depthwise (Depthwi (None, 56, 56, 96) 864 ['block_1_pad[0][0]'] \n",
" seConv2D) \n",
" \n",
" block_1_depthwise_BN (Batc (None, 56, 56, 96) 384 ['block_1_depthwise[0][0]'] \n",
" hNormalization) \n",
" \n",
" block_1_depthwise_relu (Re (None, 56, 56, 96) 0 ['block_1_depthwise_BN[0][0]']\n",
" LU) \n",
" \n",
" block_1_project (Conv2D) (None, 56, 56, 24) 2304 ['block_1_depthwise_relu[0][0]\n",
" '] \n",
" \n",
" block_1_project_BN (BatchN (None, 56, 56, 24) 96 ['block_1_project[0][0]'] \n",
" ormalization) \n",
" \n",
" block_2_expand (Conv2D) (None, 56, 56, 144) 3456 ['block_1_project_BN[0][0]'] \n",
" \n",
" block_2_expand_BN (BatchNo (None, 56, 56, 144) 576 ['block_2_expand[0][0]'] \n",
" rmalization) \n",
" \n",
" block_2_expand_relu (ReLU) (None, 56, 56, 144) 0 ['block_2_expand_BN[0][0]'] \n",
" \n",
" block_2_depthwise (Depthwi (None, 56, 56, 144) 1296 ['block_2_expand_relu[0][0]'] \n",
" seConv2D) \n",
" \n",
" block_2_depthwise_BN (Batc (None, 56, 56, 144) 576 ['block_2_depthwise[0][0]'] \n",
" hNormalization) \n",
" \n",
" block_2_depthwise_relu (Re (None, 56, 56, 144) 0 ['block_2_depthwise_BN[0][0]']\n",
" LU) \n",
" \n",
" block_2_project (Conv2D) (None, 56, 56, 24) 3456 ['block_2_depthwise_relu[0][0]\n",
" '] \n",
" \n",
" block_2_project_BN (BatchN (None, 56, 56, 24) 96 ['block_2_project[0][0]'] \n",
" ormalization) \n",
" \n",
" block_2_add (Add) (None, 56, 56, 24) 0 ['block_1_project_BN[0][0]', \n",
" 'block_2_project_BN[0][0]'] \n",
" \n",
" block_3_expand (Conv2D) (None, 56, 56, 144) 3456 ['block_2_add[0][0]'] \n",
" \n",
" block_3_expand_BN (BatchNo (None, 56, 56, 144) 576 ['block_3_expand[0][0]'] \n",
" rmalization) \n",
" \n",
" block_3_expand_relu (ReLU) (None, 56, 56, 144) 0 ['block_3_expand_BN[0][0]'] \n",
" \n",
" block_3_pad (ZeroPadding2D (None, 57, 57, 144) 0 ['block_3_expand_relu[0][0]'] \n",
" ) \n",
" \n",
" block_3_depthwise (Depthwi (None, 28, 28, 144) 1296 ['block_3_pad[0][0]'] \n",
" seConv2D) \n",
" \n",
" block_3_depthwise_BN (Batc (None, 28, 28, 144) 576 ['block_3_depthwise[0][0]'] \n",
" hNormalization) \n",
" \n",
" block_3_depthwise_relu (Re (None, 28, 28, 144) 0 ['block_3_depthwise_BN[0][0]']\n",
" LU) \n",
" \n",
" block_3_project (Conv2D) (None, 28, 28, 32) 4608 ['block_3_depthwise_relu[0][0]\n",
" '] \n",
" \n",
" block_3_project_BN (BatchN (None, 28, 28, 32) 128 ['block_3_project[0][0]'] \n",
" ormalization) \n",
" \n",
" block_4_expand (Conv2D) (None, 28, 28, 192) 6144 ['block_3_project_BN[0][0]'] \n",
" \n",
" block_4_expand_BN (BatchNo (None, 28, 28, 192) 768 ['block_4_expand[0][0]'] \n",
" rmalization) \n",
" \n",
" block_4_expand_relu (ReLU) (None, 28, 28, 192) 0 ['block_4_expand_BN[0][0]'] \n",
" \n",
" block_4_depthwise (Depthwi (None, 28, 28, 192) 1728 ['block_4_expand_relu[0][0]'] \n",
" seConv2D) \n",
" \n",
" block_4_depthwise_BN (Batc (None, 28, 28, 192) 768 ['block_4_depthwise[0][0]'] \n",
" hNormalization) \n",
" \n",
" block_4_depthwise_relu (Re (None, 28, 28, 192) 0 ['block_4_depthwise_BN[0][0]']\n",
" LU) \n",
" \n",
" block_4_project (Conv2D) (None, 28, 28, 32) 6144 ['block_4_depthwise_relu[0][0]\n",
" '] \n",
" \n",
" block_4_project_BN (BatchN (None, 28, 28, 32) 128 ['block_4_project[0][0]'] \n",
" ormalization) \n",
" \n",
" block_4_add (Add) (None, 28, 28, 32) 0 ['block_3_project_BN[0][0]', \n",
" 'block_4_project_BN[0][0]'] \n",
" \n",
" block_5_expand (Conv2D) (None, 28, 28, 192) 6144 ['block_4_add[0][0]'] \n",
" \n",
" block_5_expand_BN (BatchNo (None, 28, 28, 192) 768 ['block_5_expand[0][0]'] \n",
" rmalization) \n",
" \n",
" block_5_expand_relu (ReLU) (None, 28, 28, 192) 0 ['block_5_expand_BN[0][0]'] \n",
" \n",
" block_5_depthwise (Depthwi (None, 28, 28, 192) 1728 ['block_5_expand_relu[0][0]'] \n",
" seConv2D) \n",
" \n",
" block_5_depthwise_BN (Batc (None, 28, 28, 192) 768 ['block_5_depthwise[0][0]'] \n",
" hNormalization) \n",
" \n",
" block_5_depthwise_relu (Re (None, 28, 28, 192) 0 ['block_5_depthwise_BN[0][0]']\n",
" LU) \n",
" \n",
" block_5_project (Conv2D) (None, 28, 28, 32) 6144 ['block_5_depthwise_relu[0][0]\n",
" '] \n",
" \n",
" block_5_project_BN (BatchN (None, 28, 28, 32) 128 ['block_5_project[0][0]'] \n",
" ormalization) \n",
" \n",
" block_5_add (Add) (None, 28, 28, 32) 0 ['block_4_add[0][0]', \n",
" 'block_5_project_BN[0][0]'] \n",
" \n",
" block_6_expand (Conv2D) (None, 28, 28, 192) 6144 ['block_5_add[0][0]'] \n",
" \n",
" block_6_expand_BN (BatchNo (None, 28, 28, 192) 768 ['block_6_expand[0][0]'] \n",
" rmalization) \n",
" \n",
" block_6_expand_relu (ReLU) (None, 28, 28, 192) 0 ['block_6_expand_BN[0][0]'] \n",
" \n",
" block_6_pad (ZeroPadding2D (None, 29, 29, 192) 0 ['block_6_expand_relu[0][0]'] \n",
" ) \n",
" \n",
" block_6_depthwise (Depthwi (None, 14, 14, 192) 1728 ['block_6_pad[0][0]'] \n",
" seConv2D) \n",
" \n",
" block_6_depthwise_BN (Batc (None, 14, 14, 192) 768 ['block_6_depthwise[0][0]'] \n",
" hNormalization) \n",
" \n",
" block_6_depthwise_relu (Re (None, 14, 14, 192) 0 ['block_6_depthwise_BN[0][0]']\n",
" LU) \n",
" \n",
" block_6_project (Conv2D) (None, 14, 14, 64) 12288 ['block_6_depthwise_relu[0][0]\n",
" '] \n",
" \n",
" block_6_project_BN (BatchN (None, 14, 14, 64) 256 ['block_6_project[0][0]'] \n",
" ormalization) \n",
" \n",
" block_7_expand (Conv2D) (None, 14, 14, 384) 24576 ['block_6_project_BN[0][0]'] \n",
" \n",
" block_7_expand_BN (BatchNo (None, 14, 14, 384) 1536 ['block_7_expand[0][0]'] \n",
" rmalization) \n",
" \n",
" block_7_expand_relu (ReLU) (None, 14, 14, 384) 0 ['block_7_expand_BN[0][0]'] \n",
" \n",
" block_7_depthwise (Depthwi (None, 14, 14, 384) 3456 ['block_7_expand_relu[0][0]'] \n",
" seConv2D) \n",
" \n",
" block_7_depthwise_BN (Batc (None, 14, 14, 384) 1536 ['block_7_depthwise[0][0]'] \n",
" hNormalization) \n",
" \n",
" block_7_depthwise_relu (Re (None, 14, 14, 384) 0 ['block_7_depthwise_BN[0][0]']\n",
" LU) \n",
" \n",
" block_7_project (Conv2D) (None, 14, 14, 64) 24576 ['block_7_depthwise_relu[0][0]\n",
" '] \n",
" \n",
" block_7_project_BN (BatchN (None, 14, 14, 64) 256 ['block_7_project[0][0]'] \n",
" ormalization) \n",
" \n",
" block_7_add (Add) (None, 14, 14, 64) 0 ['block_6_project_BN[0][0]', \n",
" 'block_7_project_BN[0][0]'] \n",
" \n",
" block_8_expand (Conv2D) (None, 14, 14, 384) 24576 ['block_7_add[0][0]'] \n",
" \n",
" block_8_expand_BN (BatchNo (None, 14, 14, 384) 1536 ['block_8_expand[0][0]'] \n",
" rmalization) \n",
" \n",
" block_8_expand_relu (ReLU) (None, 14, 14, 384) 0 ['block_8_expand_BN[0][0]'] \n",
" \n",
" block_8_depthwise (Depthwi (None, 14, 14, 384) 3456 ['block_8_expand_relu[0][0]'] \n",
" seConv2D) \n",
" \n",
" block_8_depthwise_BN (Batc (None, 14, 14, 384) 1536 ['block_8_depthwise[0][0]'] \n",
" hNormalization) \n",
" \n",
" block_8_depthwise_relu (Re (None, 14, 14, 384) 0 ['block_8_depthwise_BN[0][0]']\n",
" LU) \n",
" \n",
" block_8_project (Conv2D) (None, 14, 14, 64) 24576 ['block_8_depthwise_relu[0][0]\n",
" '] \n",
" \n",
" block_8_project_BN (BatchN (None, 14, 14, 64) 256 ['block_8_project[0][0]'] \n",
" ormalization) \n",
" \n",
" block_8_add (Add) (None, 14, 14, 64) 0 ['block_7_add[0][0]', \n",
" 'block_8_project_BN[0][0]'] \n",
" \n",
" block_9_expand (Conv2D) (None, 14, 14, 384) 24576 ['block_8_add[0][0]'] \n",
" \n",
" block_9_expand_BN (BatchNo (None, 14, 14, 384) 1536 ['block_9_expand[0][0]'] \n",
" rmalization) \n",
" \n",
" block_9_expand_relu (ReLU) (None, 14, 14, 384) 0 ['block_9_expand_BN[0][0]'] \n",
" \n",
" block_9_depthwise (Depthwi (None, 14, 14, 384) 3456 ['block_9_expand_relu[0][0]'] \n",
" seConv2D) \n",
" \n",
" block_9_depthwise_BN (Batc (None, 14, 14, 384) 1536 ['block_9_depthwise[0][0]'] \n",
" hNormalization) \n",
" \n",
" block_9_depthwise_relu (Re (None, 14, 14, 384) 0 ['block_9_depthwise_BN[0][0]']\n",
" LU) \n",
" \n",
" block_9_project (Conv2D) (None, 14, 14, 64) 24576 ['block_9_depthwise_relu[0][0]\n",
" '] \n",
" \n",
" block_9_project_BN (BatchN (None, 14, 14, 64) 256 ['block_9_project[0][0]'] \n",
" ormalization) \n",
" \n",
" block_9_add (Add) (None, 14, 14, 64) 0 ['block_8_add[0][0]', \n",
" 'block_9_project_BN[0][0]'] \n",
" \n",
" block_10_expand (Conv2D) (None, 14, 14, 384) 24576 ['block_9_add[0][0]'] \n",
" \n",
" block_10_expand_BN (BatchN (None, 14, 14, 384) 1536 ['block_10_expand[0][0]'] \n",
" ormalization) \n",
" \n",
" block_10_expand_relu (ReLU (None, 14, 14, 384) 0 ['block_10_expand_BN[0][0]'] \n",
" ) \n",
" \n",
" block_10_depthwise (Depthw (None, 14, 14, 384) 3456 ['block_10_expand_relu[0][0]']\n",
" iseConv2D) \n",
" \n",
" block_10_depthwise_BN (Bat (None, 14, 14, 384) 1536 ['block_10_depthwise[0][0]'] \n",
" chNormalization) \n",
" \n",
" block_10_depthwise_relu (R (None, 14, 14, 384) 0 ['block_10_depthwise_BN[0][0]'\n",
" eLU) ] \n",
" \n",
" block_10_project (Conv2D) (None, 14, 14, 96) 36864 ['block_10_depthwise_relu[0][0\n",
" ]'] \n",
" \n",
" block_10_project_BN (Batch (None, 14, 14, 96) 384 ['block_10_project[0][0]'] \n",
" Normalization) \n",
" \n",
" block_11_expand (Conv2D) (None, 14, 14, 576) 55296 ['block_10_project_BN[0][0]'] \n",
" \n",
" block_11_expand_BN (BatchN (None, 14, 14, 576) 2304 ['block_11_expand[0][0]'] \n",
" ormalization) \n",
" \n",
" block_11_expand_relu (ReLU (None, 14, 14, 576) 0 ['block_11_expand_BN[0][0]'] \n",
" ) \n",
" \n",
" block_11_depthwise (Depthw (None, 14, 14, 576) 5184 ['block_11_expand_relu[0][0]']\n",
" iseConv2D) \n",
" \n",
" block_11_depthwise_BN (Bat (None, 14, 14, 576) 2304 ['block_11_depthwise[0][0]'] \n",
" chNormalization) \n",
" \n",
" block_11_depthwise_relu (R (None, 14, 14, 576) 0 ['block_11_depthwise_BN[0][0]'\n",
" eLU) ] \n",
" \n",
" block_11_project (Conv2D) (None, 14, 14, 96) 55296 ['block_11_depthwise_relu[0][0\n",
" ]'] \n",
" \n",
" block_11_project_BN (Batch (None, 14, 14, 96) 384 ['block_11_project[0][0]'] \n",
" Normalization) \n",
" \n",
" block_11_add (Add) (None, 14, 14, 96) 0 ['block_10_project_BN[0][0]', \n",
" 'block_11_project_BN[0][0]'] \n",
" \n",
" block_12_expand (Conv2D) (None, 14, 14, 576) 55296 ['block_11_add[0][0]'] \n",
" \n",
" block_12_expand_BN (BatchN (None, 14, 14, 576) 2304 ['block_12_expand[0][0]'] \n",
" ormalization) \n",
" \n",
" block_12_expand_relu (ReLU (None, 14, 14, 576) 0 ['block_12_expand_BN[0][0]'] \n",
" ) \n",
" \n",
" block_12_depthwise (Depthw (None, 14, 14, 576) 5184 ['block_12_expand_relu[0][0]']\n",
" iseConv2D) \n",
" \n",
" block_12_depthwise_BN (Bat (None, 14, 14, 576) 2304 ['block_12_depthwise[0][0]'] \n",
" chNormalization) \n",
" \n",
" block_12_depthwise_relu (R (None, 14, 14, 576) 0 ['block_12_depthwise_BN[0][0]'\n",
" eLU) ] \n",
" \n",
" block_12_project (Conv2D) (None, 14, 14, 96) 55296 ['block_12_depthwise_relu[0][0\n",
" ]'] \n",
" \n",
" block_12_project_BN (Batch (None, 14, 14, 96) 384 ['block_12_project[0][0]'] \n",
" Normalization) \n",
" \n",
" block_12_add (Add) (None, 14, 14, 96) 0 ['block_11_add[0][0]', \n",
" 'block_12_project_BN[0][0]'] \n",
" \n",
" block_13_expand (Conv2D) (None, 14, 14, 576) 55296 ['block_12_add[0][0]'] \n",
" \n",
" block_13_expand_BN (BatchN (None, 14, 14, 576) 2304 ['block_13_expand[0][0]'] \n",
" ormalization) \n",
" \n",
" block_13_expand_relu (ReLU (None, 14, 14, 576) 0 ['block_13_expand_BN[0][0]'] \n",
" ) \n",
" \n",
" block_13_pad (ZeroPadding2 (None, 15, 15, 576) 0 ['block_13_expand_relu[0][0]']\n",
" D) \n",
" \n",
" block_13_depthwise (Depthw (None, 7, 7, 576) 5184 ['block_13_pad[0][0]'] \n",
" iseConv2D) \n",
" \n",
" block_13_depthwise_BN (Bat (None, 7, 7, 576) 2304 ['block_13_depthwise[0][0]'] \n",
" chNormalization) \n",
" \n",
" block_13_depthwise_relu (R (None, 7, 7, 576) 0 ['block_13_depthwise_BN[0][0]'\n",
" eLU) ] \n",
" \n",
" block_13_project (Conv2D) (None, 7, 7, 160) 92160 ['block_13_depthwise_relu[0][0\n",
" ]'] \n",
" \n",
" block_13_project_BN (Batch (None, 7, 7, 160) 640 ['block_13_project[0][0]'] \n",
" Normalization) \n",
" \n",
" block_14_expand (Conv2D) (None, 7, 7, 960) 153600 ['block_13_project_BN[0][0]'] \n",
" \n",
" block_14_expand_BN (BatchN (None, 7, 7, 960) 3840 ['block_14_expand[0][0]'] \n",
" ormalization) \n",
" \n",
" block_14_expand_relu (ReLU (None, 7, 7, 960) 0 ['block_14_expand_BN[0][0]'] \n",
" ) \n",
" \n",
" block_14_depthwise (Depthw (None, 7, 7, 960) 8640 ['block_14_expand_relu[0][0]']\n",
" iseConv2D) \n",
" \n",
" block_14_depthwise_BN (Bat (None, 7, 7, 960) 3840 ['block_14_depthwise[0][0]'] \n",
" chNormalization) \n",
" \n",
" block_14_depthwise_relu (R (None, 7, 7, 960) 0 ['block_14_depthwise_BN[0][0]'\n",
" eLU) ] \n",
" \n",
" block_14_project (Conv2D) (None, 7, 7, 160) 153600 ['block_14_depthwise_relu[0][0\n",
" ]'] \n",
" \n",
" block_14_project_BN (Batch (None, 7, 7, 160) 640 ['block_14_project[0][0]'] \n",
" Normalization) \n",
" \n",
" block_14_add (Add) (None, 7, 7, 160) 0 ['block_13_project_BN[0][0]', \n",
" 'block_14_project_BN[0][0]'] \n",
" \n",
" block_15_expand (Conv2D) (None, 7, 7, 960) 153600 ['block_14_add[0][0]'] \n",
" \n",
" block_15_expand_BN (BatchN (None, 7, 7, 960) 3840 ['block_15_expand[0][0]'] \n",
" ormalization) \n",
" \n",
" block_15_expand_relu (ReLU (None, 7, 7, 960) 0 ['block_15_expand_BN[0][0]'] \n",
" ) \n",
" \n",
" block_15_depthwise (Depthw (None, 7, 7, 960) 8640 ['block_15_expand_relu[0][0]']\n",
" iseConv2D) \n",
" \n",
" block_15_depthwise_BN (Bat (None, 7, 7, 960) 3840 ['block_15_depthwise[0][0]'] \n",
" chNormalization) \n",
" \n",
" block_15_depthwise_relu (R (None, 7, 7, 960) 0 ['block_15_depthwise_BN[0][0]'\n",
" eLU) ] \n",
" \n",
" block_15_project (Conv2D) (None, 7, 7, 160) 153600 ['block_15_depthwise_relu[0][0\n",
" ]'] \n",
" \n",
" block_15_project_BN (Batch (None, 7, 7, 160) 640 ['block_15_project[0][0]'] \n",
" Normalization) \n",
" \n",
" block_15_add (Add) (None, 7, 7, 160) 0 ['block_14_add[0][0]', \n",
" 'block_15_project_BN[0][0]'] \n",
" \n",
" block_16_expand (Conv2D) (None, 7, 7, 960) 153600 ['block_15_add[0][0]'] \n",
" \n",
" block_16_expand_BN (BatchN (None, 7, 7, 960) 3840 ['block_16_expand[0][0]'] \n",
" ormalization) \n",
" \n",
" block_16_expand_relu (ReLU (None, 7, 7, 960) 0 ['block_16_expand_BN[0][0]'] \n",
" ) \n",
" \n",
" block_16_depthwise (Depthw (None, 7, 7, 960) 8640 ['block_16_expand_relu[0][0]']\n",
" iseConv2D) \n",
" \n",
" block_16_depthwise_BN (Bat (None, 7, 7, 960) 3840 ['block_16_depthwise[0][0]'] \n",
" chNormalization) \n",
" \n",
" block_16_depthwise_relu (R (None, 7, 7, 960) 0 ['block_16_depthwise_BN[0][0]'\n",
" eLU) ] \n",
" \n",
" block_16_project (Conv2D) (None, 7, 7, 320) 307200 ['block_16_depthwise_relu[0][0\n",
" ]'] \n",
" \n",
" block_16_project_BN (Batch (None, 7, 7, 320) 1280 ['block_16_project[0][0]'] \n",
" Normalization) \n",
" \n",
" Conv_1 (Conv2D) (None, 7, 7, 1280) 409600 ['block_16_project_BN[0][0]'] \n",
" \n",
" Conv_1_bn (BatchNormalizat (None, 7, 7, 1280) 5120 ['Conv_1[0][0]'] \n",
" ion) \n",
" \n",
" out_relu (ReLU) (None, 7, 7, 1280) 0 ['Conv_1_bn[0][0]'] \n",
" \n",
" global_average_pooling2d ( (None, 1280) 0 ['out_relu[0][0]'] \n",
" GlobalAveragePooling2D) \n",
" \n",
" dropout (Dropout) (None, 1280) 0 ['global_average_pooling2d[0][\n",
" 0]'] \n",
" \n",
" dense (Dense) (None, 3) 3843 ['dropout[0][0]'] \n",
" \n",
"==================================================================================================\n",
"Total params: 2261827 (8.63 MB)\n",
"Trainable params: 3843 (15.01 KB)\n",
"Non-trainable params: 2257984 (8.61 MB)\n",
"__________________________________________________________________________________________________\n"
]
}
],
"source": [
"base_model = MobileNetV2(\n",
" include_top=False,\n",
" weights=\"imagenet\",\n",
" input_shape=(224,224,3)\n",
")\n",
"\n",
"base_model.trainable = False\n",
"\n",
"x = GlobalAveragePooling2D()(base_model.output)\n",
"x = Dropout(0.3)(x)\n",
"output = Dense(train_gen.num_classes, activation=\"softmax\")(x)\n",
"\n",
"model2 = Model(base_model.input, output)\n",
"\n",
"model2.compile(\n",
" optimizer=Adam(LR),\n",
" loss=\"categorical_crossentropy\",\n",
" metrics=[\"accuracy\"]\n",
")\n",
"\n",
"model2.summary()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "a6b2e184-e27e-46fd-833e-d8448775901a",
"metadata": {},
"outputs": [],
"source": [
"callbacks = [\n",
" ModelCheckpoint(\n",
" BEST_MODEL_PATH,\n",
" monitor=\"val_accuracy\",\n",
" save_best_only=True,\n",
" verbose=1\n",
" ),\n",
" EarlyStopping(\n",
" monitor=\"val_loss\",\n",
" patience=3,\n",
" restore_best_weights=True,\n",
" verbose=1\n",
" )\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "778468ad-30d9-404f-8587-cb40528e3b26",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/10\n",
"245/245 [==============================] - ETA: 0s - loss: 0.7092 - accuracy: 0.7055\n",
"Epoch 1: val_accuracy improved from -inf to 0.94479, saving model to D:\\Corn_Detection\\backend\\model_2\\model2_best.h5\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Corn_Detection\\backend\\venv310\\lib\\site-packages\\keras\\src\\engine\\training.py:3000: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.\n",
" saving_api.save_model(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"245/245 [==============================] - 818s 3s/step - loss: 0.7092 - accuracy: 0.7055 - val_loss: 0.2303 - val_accuracy: 0.9448\n",
"Epoch 2/10\n",
"245/245 [==============================] - ETA: 0s - loss: 0.2265 - accuracy: 0.9271\n",
"Epoch 2: val_accuracy improved from 0.94479 to 0.97955, saving model to D:\\Corn_Detection\\backend\\model_2\\model2_best.h5\n",
"245/245 [==============================] - 753s 3s/step - loss: 0.2265 - accuracy: 0.9271 - val_loss: 0.1101 - val_accuracy: 0.9796\n",
"Epoch 3/10\n",
"245/245 [==============================] - ETA: 0s - loss: 0.1317 - accuracy: 0.9634\n",
"Epoch 3: val_accuracy improved from 0.97955 to 0.98569, saving model to D:\\Corn_Detection\\backend\\model_2\\model2_best.h5\n",
"245/245 [==============================] - 753s 3s/step - loss: 0.1317 - accuracy: 0.9634 - val_loss: 0.0747 - val_accuracy: 0.9857\n",
"Epoch 4/10\n",
"245/245 [==============================] - ETA: 0s - loss: 0.0898 - accuracy: 0.9773\n",
"Epoch 4: val_accuracy improved from 0.98569 to 0.98671, saving model to D:\\Corn_Detection\\backend\\model_2\\model2_best.h5\n",
"245/245 [==============================] - 711s 3s/step - loss: 0.0898 - accuracy: 0.9773 - val_loss: 0.0587 - val_accuracy: 0.9867\n",
"Epoch 5/10\n",
"245/245 [==============================] - ETA: 0s - loss: 0.0707 - accuracy: 0.9815\n",
"Epoch 5: val_accuracy improved from 0.98671 to 0.99182, saving model to D:\\Corn_Detection\\backend\\model_2\\model2_best.h5\n",
"245/245 [==============================] - 699s 3s/step - loss: 0.0707 - accuracy: 0.9815 - val_loss: 0.0456 - val_accuracy: 0.9918\n",
"Epoch 6/10\n",
"245/245 [==============================] - ETA: 0s - loss: 0.0560 - accuracy: 0.9874\n",
"Epoch 6: val_accuracy did not improve from 0.99182\n",
"245/245 [==============================] - 708s 3s/step - loss: 0.0560 - accuracy: 0.9874 - val_loss: 0.0422 - val_accuracy: 0.9908\n",
"Epoch 7/10\n",
"245/245 [==============================] - ETA: 0s - loss: 0.0493 - accuracy: 0.9881\n",
"Epoch 7: val_accuracy improved from 0.99182 to 0.99284, saving model to D:\\Corn_Detection\\backend\\model_2\\model2_best.h5\n",
"245/245 [==============================] - 595s 2s/step - loss: 0.0493 - accuracy: 0.9881 - val_loss: 0.0355 - val_accuracy: 0.9928\n",
"Epoch 8/10\n",
"245/245 [==============================] - ETA: 0s - loss: 0.0411 - accuracy: 0.9895\n",
"Epoch 8: val_accuracy did not improve from 0.99284\n",
"245/245 [==============================] - 384s 2s/step - loss: 0.0411 - accuracy: 0.9895 - val_loss: 0.0322 - val_accuracy: 0.9928\n",
"Epoch 9/10\n",
"245/245 [==============================] - ETA: 0s - loss: 0.0357 - accuracy: 0.9927\n",
"Epoch 9: val_accuracy improved from 0.99284 to 0.99387, saving model to D:\\Corn_Detection\\backend\\model_2\\model2_best.h5\n",
"245/245 [==============================] - 390s 2s/step - loss: 0.0357 - accuracy: 0.9927 - val_loss: 0.0301 - val_accuracy: 0.9939\n",
"Epoch 10/10\n",
"245/245 [==============================] - ETA: 0s - loss: 0.0334 - accuracy: 0.9917\n",
"Epoch 10: val_accuracy did not improve from 0.99387\n",
"245/245 [==============================] - 397s 2s/step - loss: 0.0334 - accuracy: 0.9917 - val_loss: 0.0275 - val_accuracy: 0.9939\n"
]
}
],
"source": [
"history2 = model2.fit(\n",
" train_gen,\n",
" validation_data=val_gen,\n",
" epochs=EPOCHS,\n",
" class_weight=class_weights,\n",
" callbacks=callbacks\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "e11c302b-d62f-49a7-9e07-660809905b5c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model 2 saved\n"
]
}
],
"source": [
"model2.save(LAST_MODEL_PATH)\n",
"print(\"Model 2 saved\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "fdfdc308-e0d6-4560-87cc-6809995402a0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"History saved\n"
]
}
],
"source": [
"with open(HISTORY_PATH, \"wb\") as f:\n",
" pickle.dump(history2.history, f)\n",
"\n",
"print(\"History saved\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "47952a71-a27f-472f-b5c7-27205525d6f1",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0MAAAF2CAYAAACs6EPYAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAfGNJREFUeJzt3Qd8U+X6B/BfmzbdA+hkb1q2lnFBBVEUBFEUERBkKHgviou/V0AFxIWTiwNFFBTXBVRErwNEFBUFQRAFaaHsAp2M7pnk/3neDJIO6Eib9ft+PsfknJykpynm5DnP8z6vl8FgMICIiIiIiMjDeDv6AIiIiIiIiByBwRAREREREXkkBkNEREREROSRGAwREREREZFHYjBEREREREQeicEQERERERF5JAZDRERERETkkRgMERERERGRR2IwREREREREHonBELk9Ly8vPP744zV+3tGjR9Vz33333Xo5LiIiInvhuY6odhgMUYOQgEI+qGXZsmVLhccNBgNatGihHr/++utd6q+SlJSEhx9+GD179kRISAhiY2MxfPhw/P777zV+rddff129B3379q2XYyUiovrDc93F35vanBuJ6hODIWpQ/v7++Oijjyps//HHH3HixAn4+fm53F/k7bffxltvvYVevXrhpZdewsyZM7F//3784x//wHfffVej1/rwww/RunVrbN++HQcPHqy3YyYiovrDcx2R62AwRA1q2LBh+Pjjj1FWVmazXQKkhIQExMTEuNxfZNy4cUhJSVFB0V133YV///vf+O2339C4ceMalecdOXIEv/76KxYtWoTIyEgVGDmr/Px8Rx8CEZHT4rmOyHUwGKIGDxxOnz6NjRs3WraVlJTgk08+wW233VblF+//+7//U2V0kjnq1KkTXnzxRVVaZ624uBgPPvigCiSkXO2GG25Q2abKnDx5EnfccQeio6PVa3bp0gUrVqyo1e8kQVxwcLDNtiZNmuCKK65AYmJitV9Hgp9GjRqpErtbbrmlymDo3Llz6veUDJIce/PmzTFx4kRkZWVZ9ikqKlKBWMeOHdUVSindu/nmm3Ho0CH1+ObNm1W5gtxebJzU5MmT1e8nz5UTvLy348ePV4/9/PPPGD16NFq2bKmORf5GcmyFhYWVlhPeeuut6u8TEBCg/o6PPvqoeuyHH35QP/ezzz6r8DwJlOWxrVu3Vvu9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",
"text/plain": [
"<Figure size 1000x400 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10,4))\n",
"\n",
"# Accuracy\n",
"plt.subplot(1,2,1)\n",
"plt.plot(history2.history[\"accuracy\"])\n",
"plt.plot(history2.history[\"val_accuracy\"])\n",
"plt.title(\"Model 2 Accuracy\")\n",
"plt.legend([\"Train\", \"Validation\"])\n",
"\n",
"# Loss\n",
"plt.subplot(1,2,2)\n",
"plt.plot(history2.history[\"loss\"])\n",
"plt.plot(history2.history[\"val_loss\"])\n",
"plt.title(\"Model 2 Loss\")\n",
"plt.legend([\"Train\", \"Validation\"])\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "87603cf0-d16d-446e-8474-17d9bcf7b55d",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}