yvesJR-237 commited on
Commit
cab8db1
Β·
verified Β·
1 Parent(s): 6287845

Upload 3 files

Browse files
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