Upload 3 files
Browse files- models/creating_models.ipynb +451 -0
- models/kdy.h5 +3 -0
- models/medical_classifier.h5 +3 -0
models/creating_models.ipynb
ADDED
@@ -0,0 +1,451 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [],
|
8 |
+
"source": [
|
9 |
+
"import tensorflow as tf\n",
|
10 |
+
"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
|
11 |
+
"import os\n",
|
12 |
+
"from tensorflow.keras import layers, models\n",
|
13 |
+
"from tensorflow.keras.optimizers import Adam\n",
|
14 |
+
"import numpy as np\n",
|
15 |
+
"from sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrix"
|
16 |
+
]
|
17 |
+
},
|
18 |
+
{
|
19 |
+
"cell_type": "code",
|
20 |
+
"execution_count": 12,
|
21 |
+
"metadata": {},
|
22 |
+
"outputs": [
|
23 |
+
{
|
24 |
+
"name": "stdout",
|
25 |
+
"output_type": "stream",
|
26 |
+
"text": [
|
27 |
+
"Found 32 images belonging to 4 classes.\n"
|
28 |
+
]
|
29 |
+
},
|
30 |
+
{
|
31 |
+
"name": "stdout",
|
32 |
+
"output_type": "stream",
|
33 |
+
"text": [
|
34 |
+
"Found 8 images belonging to 4 classes.\n",
|
35 |
+
"Class indices: {'Cyst': 0, 'Normal': 1, 'Stone': 2, 'Tumor': 3}\n",
|
36 |
+
"done\n"
|
37 |
+
]
|
38 |
+
}
|
39 |
+
],
|
40 |
+
"source": [
|
41 |
+
"# Define paths for the dataset\n",
|
42 |
+
"base_dir = '../images'\n",
|
43 |
+
"\n",
|
44 |
+
"# Create ImageDataGenerators for training, validation, and testing\n",
|
45 |
+
"data_gen = ImageDataGenerator(\n",
|
46 |
+
" rescale=1.0/255, # Normalize pixel values\n",
|
47 |
+
" validation_split=0.2 # Split for validation\n",
|
48 |
+
")\n",
|
49 |
+
"\n",
|
50 |
+
"# Load training data\n",
|
51 |
+
"train_data = data_gen.flow_from_directory(\n",
|
52 |
+
" base_dir,\n",
|
53 |
+
" target_size=(150, 150),\n",
|
54 |
+
" batch_size=2,\n",
|
55 |
+
" class_mode='categorical',\n",
|
56 |
+
" subset='training'\n",
|
57 |
+
")\n",
|
58 |
+
"\n",
|
59 |
+
"# Load validation data\n",
|
60 |
+
"val_data = data_gen.flow_from_directory(\n",
|
61 |
+
" base_dir,\n",
|
62 |
+
" target_size=(150, 150),\n",
|
63 |
+
" batch_size=2,\n",
|
64 |
+
" class_mode='categorical',\n",
|
65 |
+
" subset='validation'\n",
|
66 |
+
")\n",
|
67 |
+
"\n",
|
68 |
+
"# Print class indices\n",
|
69 |
+
"print(\"Class indices:\", train_data.class_indices)\n",
|
70 |
+
"print('done')"
|
71 |
+
]
|
72 |
+
},
|
73 |
+
{
|
74 |
+
"cell_type": "code",
|
75 |
+
"execution_count": 9,
|
76 |
+
"metadata": {},
|
77 |
+
"outputs": [],
|
78 |
+
"source": [
|
79 |
+
"input_shape = (150, 150, 3) # 750x750 RGB images\n",
|
80 |
+
"num_classes = 4"
|
81 |
+
]
|
82 |
+
},
|
83 |
+
{
|
84 |
+
"cell_type": "code",
|
85 |
+
"execution_count": 109,
|
86 |
+
"metadata": {},
|
87 |
+
"outputs": [],
|
88 |
+
"source": [
|
89 |
+
"# Create the CNN model\n",
|
90 |
+
"model = models.Sequential([\n",
|
91 |
+
" # Input layer\n",
|
92 |
+
" layers.Input(shape=input_shape),\n",
|
93 |
+
" \n",
|
94 |
+
" # First Convolutional Block\n",
|
95 |
+
" layers.Conv2D(32, kernel_size=(3, 3), activation='relu', padding='same'),\n",
|
96 |
+
" layers.BatchNormalization(),\n",
|
97 |
+
" layers.MaxPooling2D(pool_size=(2, 2)),\n",
|
98 |
+
" \n",
|
99 |
+
" # Second Convolutional Block\n",
|
100 |
+
" layers.Conv2D(64, kernel_size=(3, 3), activation='relu', padding='same'),\n",
|
101 |
+
" layers.BatchNormalization(),\n",
|
102 |
+
" layers.MaxPooling2D(pool_size=(2, 2)),\n",
|
103 |
+
" \n",
|
104 |
+
" # Third Convolutional Block\n",
|
105 |
+
" layers.Conv2D(128, kernel_size=(3, 3), activation='relu', padding='same'),\n",
|
106 |
+
" layers.BatchNormalization(),\n",
|
107 |
+
" layers.MaxPooling2D(pool_size=(2, 2)),\n",
|
108 |
+
" \n",
|
109 |
+
" # Fourth Convolutional Block\n",
|
110 |
+
" layers.Conv2D(256, kernel_size=(3, 3), activation='relu', padding='same'),\n",
|
111 |
+
" layers.BatchNormalization(),\n",
|
112 |
+
" layers.MaxPooling2D(pool_size=(2, 2)),\n",
|
113 |
+
" \n",
|
114 |
+
" # Fifth Convolutional Block\n",
|
115 |
+
" layers.Conv2D(512, kernel_size=(3, 3), activation='relu', padding='same'),\n",
|
116 |
+
" layers.BatchNormalization(),\n",
|
117 |
+
" layers.MaxPooling2D(pool_size=(2, 2)),\n",
|
118 |
+
" \n",
|
119 |
+
" # Fully Connected Layers\n",
|
120 |
+
" layers.Flatten(),\n",
|
121 |
+
" # layers.Dense(1024, activation='relu'), # Adjusted to match the input shape\n",
|
122 |
+
" # layers.Dropout(0.5),\n",
|
123 |
+
" # layers.Dense(128, activation='relu'),\n",
|
124 |
+
" # layers.Dropout(0.5),\n",
|
125 |
+
" # \n",
|
126 |
+
" # Output Layer\n",
|
127 |
+
" layers.Dense(num_classes, activation='softmax')\n",
|
128 |
+
"])\n",
|
129 |
+
"\n",
|
130 |
+
"# Compile the model\n",
|
131 |
+
"model.compile(optimizer=Adam(learning_rate=0.00001),\n",
|
132 |
+
" loss='categorical_crossentropy', # Use 'categorical_crossentropy' for one-hot encoded labels\n",
|
133 |
+
" metrics=['accuracy', 'f1_score'])\n"
|
134 |
+
]
|
135 |
+
},
|
136 |
+
{
|
137 |
+
"cell_type": "code",
|
138 |
+
"execution_count": 110,
|
139 |
+
"metadata": {},
|
140 |
+
"outputs": [
|
141 |
+
{
|
142 |
+
"name": "stdout",
|
143 |
+
"output_type": "stream",
|
144 |
+
"text": [
|
145 |
+
"Epoch 1/30\n",
|
146 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 158ms/step - accuracy: 0.5123 - f1_score: 0.4374 - loss: 1.7693 - val_accuracy: 0.2500 - val_f1_score: 0.1000 - val_loss: 1.3858\n",
|
147 |
+
"Epoch 2/30\n",
|
148 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 127ms/step - accuracy: 0.9428 - f1_score: 0.8688 - loss: 0.0977 - val_accuracy: 0.2500 - val_f1_score: 0.1000 - val_loss: 1.3971\n",
|
149 |
+
"Epoch 3/30\n",
|
150 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 144ms/step - accuracy: 1.0000 - f1_score: 0.9412 - loss: 0.0092 - val_accuracy: 0.2500 - val_f1_score: 0.1000 - val_loss: 1.4072\n",
|
151 |
+
"Epoch 4/30\n",
|
152 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 141ms/step - accuracy: 1.0000 - f1_score: 0.9265 - loss: 0.0102 - val_accuracy: 0.2500 - val_f1_score: 0.1000 - val_loss: 1.4199\n",
|
153 |
+
"Epoch 5/30\n",
|
154 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 140ms/step - accuracy: 1.0000 - f1_score: 0.9559 - loss: 0.0051 - val_accuracy: 0.2500 - val_f1_score: 0.1000 - val_loss: 1.4359\n",
|
155 |
+
"Epoch 6/30\n",
|
156 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 140ms/step - accuracy: 1.0000 - f1_score: 0.9118 - loss: 0.0038 - val_accuracy: 0.2500 - val_f1_score: 0.1000 - val_loss: 1.4536\n",
|
157 |
+
"Epoch 7/30\n",
|
158 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 130ms/step - accuracy: 1.0000 - f1_score: 0.9265 - loss: 0.0032 - val_accuracy: 0.2500 - val_f1_score: 0.1000 - val_loss: 1.4734\n",
|
159 |
+
"Epoch 8/30\n",
|
160 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 136ms/step - accuracy: 1.0000 - f1_score: 0.8824 - loss: 0.0044 - val_accuracy: 0.2500 - val_f1_score: 0.1000 - val_loss: 1.4929\n",
|
161 |
+
"Epoch 9/30\n",
|
162 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 138ms/step - accuracy: 1.0000 - f1_score: 0.9265 - loss: 0.0031 - val_accuracy: 0.2500 - val_f1_score: 0.1000 - val_loss: 1.5133\n",
|
163 |
+
"Epoch 10/30\n",
|
164 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 129ms/step - accuracy: 1.0000 - f1_score: 0.9706 - loss: 0.0024 - val_accuracy: 0.2500 - val_f1_score: 0.1000 - val_loss: 1.5346\n",
|
165 |
+
"Epoch 11/30\n",
|
166 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 127ms/step - accuracy: 1.0000 - f1_score: 0.8971 - loss: 0.0029 - val_accuracy: 0.2500 - val_f1_score: 0.1111 - val_loss: 1.5535\n",
|
167 |
+
"Epoch 12/30\n",
|
168 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 135ms/step - accuracy: 1.0000 - f1_score: 0.9412 - loss: 0.0029 - val_accuracy: 0.3750 - val_f1_score: 0.2429 - val_loss: 1.5660\n",
|
169 |
+
"Epoch 13/30\n",
|
170 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 141ms/step - accuracy: 1.0000 - f1_score: 0.9118 - loss: 0.0014 - val_accuracy: 0.3750 - val_f1_score: 0.2429 - val_loss: 1.5759\n",
|
171 |
+
"Epoch 14/30\n",
|
172 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 129ms/step - accuracy: 1.0000 - f1_score: 0.8824 - loss: 0.0016 - val_accuracy: 0.3750 - val_f1_score: 0.2429 - val_loss: 1.5809\n",
|
173 |
+
"Epoch 15/30\n",
|
174 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 140ms/step - accuracy: 1.0000 - f1_score: 0.9412 - loss: 0.0014 - val_accuracy: 0.3750 - val_f1_score: 0.2429 - val_loss: 1.5782\n",
|
175 |
+
"Epoch 16/30\n",
|
176 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 132ms/step - accuracy: 1.0000 - f1_score: 0.9559 - loss: 0.0011 - val_accuracy: 0.2500 - val_f1_score: 0.1250 - val_loss: 1.5731\n",
|
177 |
+
"Epoch 17/30\n",
|
178 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 133ms/step - accuracy: 1.0000 - f1_score: 0.9559 - loss: 0.0015 - val_accuracy: 0.3750 - val_f1_score: 0.2429 - val_loss: 1.5475\n",
|
179 |
+
"Epoch 18/30\n",
|
180 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 130ms/step - accuracy: 1.0000 - f1_score: 0.9412 - loss: 0.0010 - val_accuracy: 0.3750 - val_f1_score: 0.2429 - val_loss: 1.5120\n",
|
181 |
+
"Epoch 19/30\n",
|
182 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 137ms/step - accuracy: 1.0000 - f1_score: 0.9559 - loss: 0.0010 - val_accuracy: 0.2500 - val_f1_score: 0.1250 - val_loss: 1.4640\n",
|
183 |
+
"Epoch 20/30\n",
|
184 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 142ms/step - accuracy: 1.0000 - f1_score: 0.9559 - loss: 0.0013 - val_accuracy: 0.3750 - val_f1_score: 0.2429 - val_loss: 1.4229\n",
|
185 |
+
"Epoch 21/30\n",
|
186 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 135ms/step - accuracy: 1.0000 - f1_score: 0.9118 - loss: 9.3909e-04 - val_accuracy: 0.3750 - val_f1_score: 0.2429 - val_loss: 1.3761\n",
|
187 |
+
"Epoch 22/30\n",
|
188 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 133ms/step - accuracy: 1.0000 - f1_score: 0.9118 - loss: 8.4527e-04 - val_accuracy: 0.5000 - val_f1_score: 0.3333 - val_loss: 1.3416\n",
|
189 |
+
"Epoch 23/30\n",
|
190 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 136ms/step - accuracy: 1.0000 - f1_score: 0.9559 - loss: 8.5071e-04 - val_accuracy: 0.5000 - val_f1_score: 0.3333 - val_loss: 1.3063\n",
|
191 |
+
"Epoch 24/30\n",
|
192 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 134ms/step - accuracy: 1.0000 - f1_score: 0.9559 - loss: 7.2937e-04 - val_accuracy: 0.5000 - val_f1_score: 0.3429 - val_loss: 1.2619\n",
|
193 |
+
"Epoch 25/30\n",
|
194 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 135ms/step - accuracy: 1.0000 - f1_score: 0.9265 - loss: 6.2996e-04 - val_accuracy: 0.5000 - val_f1_score: 0.3429 - val_loss: 1.1914\n",
|
195 |
+
"Epoch 26/30\n",
|
196 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 135ms/step - accuracy: 1.0000 - f1_score: 0.9265 - loss: 7.7824e-04 - val_accuracy: 0.5000 - val_f1_score: 0.3429 - val_loss: 1.1314\n",
|
197 |
+
"Epoch 27/30\n",
|
198 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 135ms/step - accuracy: 1.0000 - f1_score: 0.8971 - loss: 6.3872e-04 - val_accuracy: 0.6250 - val_f1_score: 0.5333 - val_loss: 1.0617\n",
|
199 |
+
"Epoch 28/30\n",
|
200 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 134ms/step - accuracy: 1.0000 - f1_score: 0.9412 - loss: 6.7060e-04 - val_accuracy: 0.7500 - val_f1_score: 0.7333 - val_loss: 1.0080\n",
|
201 |
+
"Epoch 29/30\n",
|
202 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 140ms/step - accuracy: 1.0000 - f1_score: 0.9559 - loss: 6.5673e-04 - val_accuracy: 0.7500 - val_f1_score: 0.7333 - val_loss: 0.9536\n",
|
203 |
+
"Epoch 30/30\n",
|
204 |
+
"\u001b[1m16/16\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 135ms/step - accuracy: 1.0000 - f1_score: 0.9412 - loss: 7.8768e-04 - val_accuracy: 0.7500 - val_f1_score: 0.7333 - val_loss: 0.9146\n"
|
205 |
+
]
|
206 |
+
},
|
207 |
+
{
|
208 |
+
"name": "stderr",
|
209 |
+
"output_type": "stream",
|
210 |
+
"text": [
|
211 |
+
"WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n"
|
212 |
+
]
|
213 |
+
},
|
214 |
+
{
|
215 |
+
"name": "stdout",
|
216 |
+
"output_type": "stream",
|
217 |
+
"text": [
|
218 |
+
"Model saved as medical_classifier.h5\n"
|
219 |
+
]
|
220 |
+
}
|
221 |
+
],
|
222 |
+
"source": [
|
223 |
+
"# Train the model\n",
|
224 |
+
"history = model.fit(\n",
|
225 |
+
" train_data,\n",
|
226 |
+
" steps_per_epoch=len(train_data),\n",
|
227 |
+
" epochs=30,\n",
|
228 |
+
" validation_data=val_data,\n",
|
229 |
+
" validation_steps=len(val_data)\n",
|
230 |
+
")\n",
|
231 |
+
"\n",
|
232 |
+
"# Save the model\n",
|
233 |
+
"model.save('medical_classifier.h5')\n",
|
234 |
+
"print(\"Model saved as medical_classifier.h5\")"
|
235 |
+
]
|
236 |
+
},
|
237 |
+
{
|
238 |
+
"cell_type": "code",
|
239 |
+
"execution_count": 30,
|
240 |
+
"metadata": {},
|
241 |
+
"outputs": [
|
242 |
+
{
|
243 |
+
"name": "stdout",
|
244 |
+
"output_type": "stream",
|
245 |
+
"text": [
|
246 |
+
"\u001b[1m4/4\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 32ms/step\n",
|
247 |
+
"F1 Score on validation data: 0.35\n"
|
248 |
+
]
|
249 |
+
}
|
250 |
+
],
|
251 |
+
"source": [
|
252 |
+
"\n",
|
253 |
+
"val_data.reset()\n",
|
254 |
+
"predictions = model.predict(val_data, steps=len(val_data), verbose=1)\n",
|
255 |
+
"y_pred = np.argmax(predictions, axis=1)\n",
|
256 |
+
"y_true = val_data.classes\n",
|
257 |
+
"f1 = f1_score(y_true, y_pred, average='weighted')\n",
|
258 |
+
"print(\"F1 Score on validation data:\", f1)"
|
259 |
+
]
|
260 |
+
},
|
261 |
+
{
|
262 |
+
"cell_type": "code",
|
263 |
+
"execution_count": 111,
|
264 |
+
"metadata": {},
|
265 |
+
"outputs": [
|
266 |
+
{
|
267 |
+
"name": "stdout",
|
268 |
+
"output_type": "stream",
|
269 |
+
"text": [
|
270 |
+
"\u001b[1m4/4\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n",
|
271 |
+
"F1 Score on validation data: 0.3666666666666667\n"
|
272 |
+
]
|
273 |
+
}
|
274 |
+
],
|
275 |
+
"source": [
|
276 |
+
"from sklearn.metrics import f1_score\n",
|
277 |
+
"import numpy as np\n",
|
278 |
+
"from tensorflow.keras.preprocessing import image\n",
|
279 |
+
"\n",
|
280 |
+
"# Calculate F1 score on validation data\n",
|
281 |
+
"val_data.reset()\n",
|
282 |
+
"predictions = model.predict(val_data, steps=len(val_data), verbose=1)\n",
|
283 |
+
"y_pred = np.argmax(predictions, axis=1)\n",
|
284 |
+
"y_true = val_data.classes\n",
|
285 |
+
"f1 = f1_score(y_true, y_pred, average='weighted')\n",
|
286 |
+
"print(\"F1 Score on validation data:\", f1)\n",
|
287 |
+
"\n",
|
288 |
+
"# Test the model on a random image\n",
|
289 |
+
"def test_random_image(img_path):\n",
|
290 |
+
" img = image.load_img(img_path, target_size=(150, 150))\n",
|
291 |
+
" img_array = image.img_to_array(img)\n",
|
292 |
+
" img_array = np.expand_dims(img_array, axis=0)\n",
|
293 |
+
" img_array /= 255.0\n",
|
294 |
+
"\n",
|
295 |
+
" prediction = model.predict(img_array)\n",
|
296 |
+
" predicted_class = np.argmax(prediction, axis=1)\n",
|
297 |
+
" class_indices = {v: k for k, v in train_data.class_indices.items()}\n",
|
298 |
+
" predicted_label = class_indices[predicted_class[0]]\n",
|
299 |
+
"\n",
|
300 |
+
" print(f\"Predicted class: {predicted_label}\")\n"
|
301 |
+
]
|
302 |
+
},
|
303 |
+
{
|
304 |
+
"cell_type": "code",
|
305 |
+
"execution_count": 114,
|
306 |
+
"metadata": {},
|
307 |
+
"outputs": [
|
308 |
+
{
|
309 |
+
"name": "stdout",
|
310 |
+
"output_type": "stream",
|
311 |
+
"text": [
|
312 |
+
"\u001b[1m4/4\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n",
|
313 |
+
"F1 Score on validation data: 0.3666666666666667\n",
|
314 |
+
"\u001b[1m1/1\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step\n",
|
315 |
+
"Predicted class: Cyst\n"
|
316 |
+
]
|
317 |
+
}
|
318 |
+
],
|
319 |
+
"source": [
|
320 |
+
"val_data.reset()\n",
|
321 |
+
"predictions = model.predict(val_data, steps=len(val_data), verbose=1)\n",
|
322 |
+
"y_pred = np.argmax(predictions, axis=1)\n",
|
323 |
+
"y_true = val_data.classes\n",
|
324 |
+
"f1 = f1_score(y_true, y_pred, average='weighted')\n",
|
325 |
+
"print(\"F1 Score on validation data:\", f1)\n",
|
326 |
+
"random_image_path = os.path.join(base_dir, 'test', 'Cyst', 'Cyst- (18).jpg') # Replace 'class_name' and 'random_image.jpg' with actual values\n",
|
327 |
+
"test_random_image(random_image_path)"
|
328 |
+
]
|
329 |
+
},
|
330 |
+
{
|
331 |
+
"cell_type": "code",
|
332 |
+
"execution_count": 118,
|
333 |
+
"metadata": {},
|
334 |
+
"outputs": [
|
335 |
+
{
|
336 |
+
"name": "stdout",
|
337 |
+
"output_type": "stream",
|
338 |
+
"text": [
|
339 |
+
"\u001b[1m1/1\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 50ms/step\n",
|
340 |
+
"Predicted class: Normal\n"
|
341 |
+
]
|
342 |
+
}
|
343 |
+
],
|
344 |
+
"source": [
|
345 |
+
"random_image_path = os.path.join(base_dir, 'test', 'Normal', 'Normal- (286).jpg') # Replace 'class_name' and 'random_image.jpg' with actual values\n",
|
346 |
+
"test_random_image(random_image_path)"
|
347 |
+
]
|
348 |
+
},
|
349 |
+
{
|
350 |
+
"cell_type": "code",
|
351 |
+
"execution_count": 120,
|
352 |
+
"metadata": {},
|
353 |
+
"outputs": [
|
354 |
+
{
|
355 |
+
"name": "stdout",
|
356 |
+
"output_type": "stream",
|
357 |
+
"text": [
|
358 |
+
"\u001b[1m1/1\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 51ms/step\n",
|
359 |
+
"Predicted class: Stone\n"
|
360 |
+
]
|
361 |
+
}
|
362 |
+
],
|
363 |
+
"source": [
|
364 |
+
"random_image_path = os.path.join(base_dir, 'test', 'Stone', 'Stone- (62).jpg') # Replace 'class_name' and 'random_image.jpg' with actual values\n",
|
365 |
+
"test_random_image(random_image_path)"
|
366 |
+
]
|
367 |
+
},
|
368 |
+
{
|
369 |
+
"cell_type": "code",
|
370 |
+
"execution_count": 122,
|
371 |
+
"metadata": {},
|
372 |
+
"outputs": [
|
373 |
+
{
|
374 |
+
"name": "stdout",
|
375 |
+
"output_type": "stream",
|
376 |
+
"text": [
|
377 |
+
"\u001b[1m1/1\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 56ms/step\n",
|
378 |
+
"Predicted class: Tumor\n"
|
379 |
+
]
|
380 |
+
}
|
381 |
+
],
|
382 |
+
"source": [
|
383 |
+
"random_image_path = os.path.join(base_dir, 'test', 'Tumor', 'Tumor- (54).jpg') # Replace 'class_name' and 'random_image.jpg' with actual values\n",
|
384 |
+
"test_random_image(random_image_path)"
|
385 |
+
]
|
386 |
+
},
|
387 |
+
{
|
388 |
+
"cell_type": "code",
|
389 |
+
"execution_count": 132,
|
390 |
+
"metadata": {},
|
391 |
+
"outputs": [
|
392 |
+
{
|
393 |
+
"name": "stderr",
|
394 |
+
"output_type": "stream",
|
395 |
+
"text": [
|
396 |
+
"WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
|
397 |
+
]
|
398 |
+
},
|
399 |
+
{
|
400 |
+
"name": "stdout",
|
401 |
+
"output_type": "stream",
|
402 |
+
"text": [
|
403 |
+
"\u001b[1m1/1\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 55ms/step\n",
|
404 |
+
"Predicted class: Tumor\n"
|
405 |
+
]
|
406 |
+
}
|
407 |
+
],
|
408 |
+
"source": [
|
409 |
+
"r_img_path = os.path.join(base_dir, 'test', 'Tumor', 'Tumor- (44).jpg') # Replace 'class_name' and 'random_image.jpg' with actual values\n",
|
410 |
+
"import_model = tf.keras.models.load_model('./medical_classifier.h5')\n",
|
411 |
+
"img = image.load_img(r_img_path, target_size=(150, 150))\n",
|
412 |
+
"img_array = image.img_to_array(img)\n",
|
413 |
+
"img_array = np.expand_dims(img_array, axis=0)\n",
|
414 |
+
"img_array /= 255.0\n",
|
415 |
+
"\n",
|
416 |
+
"prediction = model.predict(img_array)\n",
|
417 |
+
"predicted_class = np.argmax(prediction, axis=1)\n",
|
418 |
+
"class_indices = {v: k for k, v in train_data.class_indices.items()}\n",
|
419 |
+
"predicted_label = class_indices[predicted_class[0]]\n",
|
420 |
+
"\n",
|
421 |
+
"print(f\"Predicted class: {predicted_label}\")"
|
422 |
+
]
|
423 |
+
},
|
424 |
+
{
|
425 |
+
"cell_type": "markdown",
|
426 |
+
"metadata": {},
|
427 |
+
"source": []
|
428 |
+
}
|
429 |
+
],
|
430 |
+
"metadata": {
|
431 |
+
"kernelspec": {
|
432 |
+
"display_name": "Python 3",
|
433 |
+
"language": "python",
|
434 |
+
"name": "python3"
|
435 |
+
},
|
436 |
+
"language_info": {
|
437 |
+
"codemirror_mode": {
|
438 |
+
"name": "ipython",
|
439 |
+
"version": 3
|
440 |
+
},
|
441 |
+
"file_extension": ".py",
|
442 |
+
"mimetype": "text/x-python",
|
443 |
+
"name": "python",
|
444 |
+
"nbconvert_exporter": "python",
|
445 |
+
"pygments_lexer": "ipython3",
|
446 |
+
"version": "3.10.11"
|
447 |
+
}
|
448 |
+
},
|
449 |
+
"nbformat": 4,
|
450 |
+
"nbformat_minor": 2
|
451 |
+
}
|
models/kdy.h5
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:ac98354bc56c79f6531be31a296fd55a84f774d71393aa5828521a3eddd59a5a
|
3 |
+
size 21217496
|
models/medical_classifier.h5
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:b7b81210a87c4038a131d8786c5df61e6182df43e27ab484b319faffebcebd05
|
3 |
+
size 19348560
|