cogniveon commited on
Commit
a31cba0
1 Parent(s): 97ef9a2

feat: :man_dancing: YOLO

Browse files
.gitignore ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ # python generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # venv
10
+ .venv
.ipynb_checkpoints/csv_classification-checkpoint.ipynb ADDED
@@ -0,0 +1,610 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "id": "be5e2cf3-4e08-4dda-b5e9-42cc43821aee",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "import os\n",
11
+ "import glob\n",
12
+ "import numpy as np\n",
13
+ "from tqdm import tqdm\n",
14
+ "import itertools\n",
15
+ "import matplotlib.pyplot as plt\n",
16
+ "from sklearn.model_selection import train_test_split\n",
17
+ "from sklearn.metrics import classification_report, accuracy_score, confusion_matrix\n",
18
+ "from sklearn.preprocessing import LabelEncoder\n",
19
+ "from sklearn.utils import shuffle\n",
20
+ "from sklearn.utils import class_weight\n",
21
+ "import keras\n",
22
+ "from keras.models import Sequential\n",
23
+ "from keras.layers import Dense, Dropout, Activation, Flatten\n",
24
+ "from keras.layers import Convolution2D, Conv2D, MaxPooling2D, GlobalAveragePooling2D\n",
25
+ "from keras.utils import to_categorical\n",
26
+ "import numpy as np\n",
27
+ "import tensorflow as tf\n",
28
+ "from tensorflow.keras.models import Sequential\n",
29
+ "from tensorflow.keras.layers import Dense, Conv1D, Flatten, Dropout\n",
30
+ "from tensorflow.keras.utils import to_categorical\n",
31
+ "from sklearn.model_selection import train_test_split\n",
32
+ "from sklearn.preprocessing import StandardScaler\n",
33
+ "import warnings\n",
34
+ "warnings.filterwarnings('ignore', category=FutureWarning)\n",
35
+ "import matplotlib.pyplot as plt\n",
36
+ "import zipfile\n",
37
+ "from IPython.display import clear_output\n",
38
+ "import glob\n",
39
+ "import pandas as pd\n",
40
+ "import os"
41
+ ]
42
+ },
43
+ {
44
+ "cell_type": "code",
45
+ "execution_count": 3,
46
+ "id": "0a41fca8-0f28-461f-98a6-6314d41481f3",
47
+ "metadata": {},
48
+ "outputs": [
49
+ {
50
+ "name": "stdout",
51
+ "output_type": "stream",
52
+ "text": [
53
+ " Age Sex Height Weight Pregnancy status Murmur Outcome\n",
54
+ "0 2 1 0.434483 0.125346 0 0 1\n",
55
+ "1 2 1 0.468966 0.099539 0 1 1\n",
56
+ "3 2 0 0.434483 0.125346 0 1 1\n",
57
+ "4 2 0 0.358621 0.082028 0 1 1\n",
58
+ "6 2 1 0.393103 0.107834 0 0 1\n",
59
+ "Number of data sample rows: 759\n"
60
+ ]
61
+ }
62
+ ],
63
+ "source": [
64
+ "from numpy import nan\n",
65
+ "from sklearn.preprocessing import MinMaxScaler\n",
66
+ "df = pd.read_csv(os.path.join('training_data.csv'))\n",
67
+ "\n",
68
+ "# Now drop the columns\n",
69
+ "columns_to_drop = [\n",
70
+ " \"Patient ID\", \"Recording locations\", \"Murmur locations\", \"Most audible location\",\n",
71
+ " \"Systolic murmur timing\", \"Systolic murmur shape\", \"Systolic murmur grading\",\n",
72
+ " \"Systolic murmur pitch\", \"Systolic murmur quality\", \"Diastolic murmur timing\",\n",
73
+ " \"Diastolic murmur shape\", \"Diastolic murmur grading\", \"Diastolic murmur pitch\",\n",
74
+ " \"Diastolic murmur quality\", \"Campaign\", \"Additional ID\", \"Recording locations:\",\n",
75
+ "]\n",
76
+ "df.drop(columns=columns_to_drop, inplace=True, errors='ignore')\n",
77
+ "\n",
78
+ "scaler = MinMaxScaler()\n",
79
+ "columns_to_normalize = ['Weight', 'Height']\n",
80
+ "data_to_normalize = df[columns_to_normalize]\n",
81
+ "normalized_data = scaler.fit_transform(data_to_normalize)\n",
82
+ "df_normalized = pd.DataFrame(normalized_data, columns=columns_to_normalize)\n",
83
+ "df[columns_to_normalize] = df_normalized\n",
84
+ "\n",
85
+ "\n",
86
+ "df['Pregnancy status'] = df['Pregnancy status'].apply(lambda x: 1 if x else 0)\n",
87
+ "sex2int = {'Male': 0, 'Female': 1}\n",
88
+ "df['Sex'] = df['Sex'].apply(lambda x: sex2int[x] if x in sex2int else -1)\n",
89
+ "df = df[df['Sex'] != -1]\n",
90
+ "\n",
91
+ "age2int = {'Neonate': 0, 'Infant': 1, 'Child': 2, 'Adolescent': 3}\n",
92
+ "df['Age'] = df['Age'].apply(lambda x: age2int[x] if x in age2int else -1)\n",
93
+ "df = df[df['Age'] != -1]\n",
94
+ "\n",
95
+ "df = df[df['Murmur'] != 'Unknown']\n",
96
+ "df['Murmur'] = df['Murmur'].apply(lambda x: 0 if x == 'Absent' else (1 if x == 'Present' else 2))\n",
97
+ "\n",
98
+ "outcome2int = {'Normal': 0, 'Abnormal': 1}\n",
99
+ "df['Outcome'] = df['Outcome'].apply(lambda x: outcome2int[x] if x in outcome2int else -1)\n",
100
+ "df = df[df['Outcome'] != -1]\n",
101
+ "\n",
102
+ "df = df.select_dtypes(include=[np.number])\n",
103
+ "df.dropna(inplace=True)\n",
104
+ "\n",
105
+ "\n",
106
+ "print(df.head())\n",
107
+ "print(\"Number of data sample rows:\", df.shape[0])"
108
+ ]
109
+ },
110
+ {
111
+ "cell_type": "code",
112
+ "execution_count": 6,
113
+ "id": "499b212d-8acb-4ce5-a1e1-ec62d9f1142b",
114
+ "metadata": {},
115
+ "outputs": [
116
+ {
117
+ "name": "stdout",
118
+ "output_type": "stream",
119
+ "text": [
120
+ " Age Sex Height Weight Pregnancy status Murmur Outcome\n",
121
+ "0 2 1 0.446520 0.118830 0 0 1\n",
122
+ "1 2 1 0.457870 0.120511 0 1 1\n",
123
+ "2 2 0 0.423518 0.131510 0 1 1\n",
124
+ "3 2 0 0.356813 0.071461 0 1 1\n",
125
+ "4 2 1 0.396024 0.102232 0 0 1\n",
126
+ "Number of data sample rows after SMOTE: 768\n",
127
+ "Example input\n",
128
+ " Age 2.00000\n",
129
+ "Sex 1.00000\n",
130
+ "Height 0.44652\n",
131
+ "Weight 0.11883\n",
132
+ "Pregnancy status 0.00000\n",
133
+ "Murmur 0.00000\n",
134
+ "Name: 0, dtype: float64\n"
135
+ ]
136
+ }
137
+ ],
138
+ "source": [
139
+ "import pandas as pd\n",
140
+ "import numpy as np\n",
141
+ "from sklearn.preprocessing import MinMaxScaler, StandardScaler\n",
142
+ "from sklearn.model_selection import train_test_split\n",
143
+ "from tensorflow.keras.utils import to_categorical\n",
144
+ "from sklearn.utils import resample\n",
145
+ "from imblearn.over_sampling import SMOTE\n",
146
+ "\n",
147
+ "\n",
148
+ "noise_scale = 0.01\n",
149
+ "\n",
150
+ "numerical_cols = ['Weight', 'Height']\n",
151
+ "for col in numerical_cols:\n",
152
+ " df[col] += np.random.normal(loc=0.0, scale=noise_scale, size=df[col].shape)\n",
153
+ "\n",
154
+ "# Apply SMOTE for data aug\n",
155
+ "smote = SMOTE()\n",
156
+ "X = df.drop('Outcome', axis=1)\n",
157
+ "y = df['Outcome']\n",
158
+ "\n",
159
+ "X_sm, y_sm = smote.fit_resample(X, y)\n",
160
+ "df_sm = pd.DataFrame(X_sm, columns=X.columns)\n",
161
+ "df_sm['Outcome'] = y_sm\n",
162
+ "\n",
163
+ "\n",
164
+ "scaler = StandardScaler()\n",
165
+ "X_scaled = scaler.fit_transform(df_sm.drop('Outcome', axis=1))\n",
166
+ "X_scaled = X_scaled.reshape(X_scaled.shape[0], X_scaled.shape[1], 1)\n",
167
+ "y_encoded = to_categorical(df_sm['Outcome'])\n",
168
+ "\n",
169
+ "# Split data into training and test sets\n",
170
+ "X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_encoded, test_size=0.1, random_state=42)\n",
171
+ "\n",
172
+ "# augmented data\n",
173
+ "print(df_sm.head())\n",
174
+ "print(\"Number of data sample rows after SMOTE:\", df_sm.shape[0])\n",
175
+ "print(\"Example input\\n\", df_sm.drop('Outcome', axis=1).loc[0])"
176
+ ]
177
+ },
178
+ {
179
+ "cell_type": "code",
180
+ "execution_count": 7,
181
+ "id": "9a680377-7bdd-4da6-8c5b-eb9fb1336250",
182
+ "metadata": {},
183
+ "outputs": [
184
+ {
185
+ "name": "stdout",
186
+ "output_type": "stream",
187
+ "text": [
188
+ "Epoch 1/100\n"
189
+ ]
190
+ },
191
+ {
192
+ "name": "stderr",
193
+ "output_type": "stream",
194
+ "text": [
195
+ "/Users/cogniveon/src/HeartMurmurClassification/.venv/lib/python3.12/site-packages/keras/src/layers/convolutional/base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
196
+ " super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n"
197
+ ]
198
+ },
199
+ {
200
+ "name": "stdout",
201
+ "output_type": "stream",
202
+ "text": [
203
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step - accuracy: 0.5140 - loss: 0.6888 - val_accuracy: 0.6403 - val_loss: 0.6672\n",
204
+ "Epoch 2/100\n",
205
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 758us/step - accuracy: 0.6529 - loss: 0.6446 - val_accuracy: 0.6547 - val_loss: 0.6523\n",
206
+ "Epoch 3/100\n",
207
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 757us/step - accuracy: 0.6820 - loss: 0.5970 - val_accuracy: 0.6835 - val_loss: 0.6649\n",
208
+ "Epoch 4/100\n",
209
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 830us/step - accuracy: 0.6451 - loss: 0.6134 - val_accuracy: 0.6547 - val_loss: 0.6601\n",
210
+ "Epoch 5/100\n",
211
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step - accuracy: 0.6527 - loss: 0.6077 - val_accuracy: 0.6475 - val_loss: 0.6574\n",
212
+ "Epoch 6/100\n",
213
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 875us/step - accuracy: 0.6605 - loss: 0.6117 - val_accuracy: 0.6187 - val_loss: 0.6709\n",
214
+ "Epoch 7/100\n",
215
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 822us/step - accuracy: 0.6460 - loss: 0.6094 - val_accuracy: 0.6259 - val_loss: 0.6673\n",
216
+ "Epoch 8/100\n",
217
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 827us/step - accuracy: 0.6691 - loss: 0.6166 - val_accuracy: 0.6331 - val_loss: 0.6621\n",
218
+ "Epoch 9/100\n",
219
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 809us/step - accuracy: 0.6584 - loss: 0.5825 - val_accuracy: 0.6403 - val_loss: 0.6667\n",
220
+ "Epoch 10/100\n",
221
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 860us/step - accuracy: 0.6752 - loss: 0.5976 - val_accuracy: 0.6187 - val_loss: 0.6591\n",
222
+ "Epoch 11/100\n",
223
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 807us/step - accuracy: 0.6603 - loss: 0.6061 - val_accuracy: 0.6187 - val_loss: 0.6664\n",
224
+ "Epoch 12/100\n",
225
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 845us/step - accuracy: 0.6561 - loss: 0.5776 - val_accuracy: 0.6259 - val_loss: 0.6739\n",
226
+ "Epoch 13/100\n",
227
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 817us/step - accuracy: 0.6700 - loss: 0.5976 - val_accuracy: 0.5971 - val_loss: 0.6730\n",
228
+ "Epoch 14/100\n",
229
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 919us/step - accuracy: 0.6622 - loss: 0.5886 - val_accuracy: 0.6475 - val_loss: 0.6471\n",
230
+ "Epoch 15/100\n",
231
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 901us/step - accuracy: 0.6307 - loss: 0.6162 - val_accuracy: 0.6259 - val_loss: 0.6728\n",
232
+ "Epoch 16/100\n",
233
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - accuracy: 0.7153 - loss: 0.5660 - val_accuracy: 0.6187 - val_loss: 0.6775\n",
234
+ "Epoch 17/100\n",
235
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 862us/step - accuracy: 0.6509 - loss: 0.5898 - val_accuracy: 0.6547 - val_loss: 0.6607\n",
236
+ "Epoch 18/100\n",
237
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 827us/step - accuracy: 0.6680 - loss: 0.5865 - val_accuracy: 0.6115 - val_loss: 0.6673\n",
238
+ "Epoch 19/100\n",
239
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 805us/step - accuracy: 0.7013 - loss: 0.5647 - val_accuracy: 0.6403 - val_loss: 0.6851\n",
240
+ "Epoch 20/100\n",
241
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 821us/step - accuracy: 0.6532 - loss: 0.5964 - val_accuracy: 0.6403 - val_loss: 0.6621\n",
242
+ "Epoch 21/100\n",
243
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 894us/step - accuracy: 0.6963 - loss: 0.5668 - val_accuracy: 0.6403 - val_loss: 0.6617\n",
244
+ "Epoch 22/100\n",
245
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 806us/step - accuracy: 0.6953 - loss: 0.5799 - val_accuracy: 0.6187 - val_loss: 0.6875\n",
246
+ "Epoch 23/100\n",
247
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 839us/step - accuracy: 0.6900 - loss: 0.5655 - val_accuracy: 0.6619 - val_loss: 0.6612\n",
248
+ "Epoch 24/100\n",
249
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 800us/step - accuracy: 0.6564 - loss: 0.5771 - val_accuracy: 0.6403 - val_loss: 0.6714\n",
250
+ "Epoch 25/100\n",
251
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 854us/step - accuracy: 0.6492 - loss: 0.5895 - val_accuracy: 0.6403 - val_loss: 0.6660\n",
252
+ "Epoch 26/100\n",
253
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 823us/step - accuracy: 0.6741 - loss: 0.5800 - val_accuracy: 0.6043 - val_loss: 0.6837\n",
254
+ "Epoch 27/100\n",
255
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 981us/step - accuracy: 0.6954 - loss: 0.5519 - val_accuracy: 0.6475 - val_loss: 0.6633\n",
256
+ "Epoch 28/100\n",
257
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 835us/step - accuracy: 0.6696 - loss: 0.6009 - val_accuracy: 0.6403 - val_loss: 0.6640\n",
258
+ "Epoch 29/100\n",
259
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 813us/step - accuracy: 0.7001 - loss: 0.5766 - val_accuracy: 0.6043 - val_loss: 0.6851\n",
260
+ "Epoch 30/100\n",
261
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 859us/step - accuracy: 0.6787 - loss: 0.5600 - val_accuracy: 0.6187 - val_loss: 0.6747\n",
262
+ "Epoch 31/100\n",
263
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.6745 - loss: 0.5595 - val_accuracy: 0.6403 - val_loss: 0.6796\n",
264
+ "Epoch 32/100\n",
265
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.6875 - loss: 0.5671 - val_accuracy: 0.6115 - val_loss: 0.6778\n",
266
+ "Epoch 33/100\n",
267
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 875us/step - accuracy: 0.7172 - loss: 0.5561 - val_accuracy: 0.6331 - val_loss: 0.6794\n",
268
+ "Epoch 34/100\n",
269
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 878us/step - accuracy: 0.6928 - loss: 0.5613 - val_accuracy: 0.5971 - val_loss: 0.6941\n",
270
+ "Epoch 35/100\n",
271
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 819us/step - accuracy: 0.6808 - loss: 0.5736 - val_accuracy: 0.6403 - val_loss: 0.6599\n",
272
+ "Epoch 36/100\n",
273
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 828us/step - accuracy: 0.6721 - loss: 0.5741 - val_accuracy: 0.5899 - val_loss: 0.6916\n",
274
+ "Epoch 37/100\n",
275
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 888us/step - accuracy: 0.7092 - loss: 0.5700 - val_accuracy: 0.5971 - val_loss: 0.6824\n",
276
+ "Epoch 38/100\n",
277
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 912us/step - accuracy: 0.6687 - loss: 0.5851 - val_accuracy: 0.6259 - val_loss: 0.6897\n",
278
+ "Epoch 39/100\n",
279
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 851us/step - accuracy: 0.6743 - loss: 0.5730 - val_accuracy: 0.6403 - val_loss: 0.6697\n",
280
+ "Epoch 40/100\n",
281
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 859us/step - accuracy: 0.6599 - loss: 0.5979 - val_accuracy: 0.6259 - val_loss: 0.6921\n",
282
+ "Epoch 41/100\n",
283
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 840us/step - accuracy: 0.7042 - loss: 0.5661 - val_accuracy: 0.6475 - val_loss: 0.6761\n",
284
+ "Epoch 42/100\n",
285
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 859us/step - accuracy: 0.6773 - loss: 0.5497 - val_accuracy: 0.6187 - val_loss: 0.6829\n",
286
+ "Epoch 43/100\n",
287
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 864us/step - accuracy: 0.6886 - loss: 0.5754 - val_accuracy: 0.6475 - val_loss: 0.6664\n",
288
+ "Epoch 44/100\n",
289
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - accuracy: 0.6558 - loss: 0.5854 - val_accuracy: 0.5755 - val_loss: 0.6825\n",
290
+ "Epoch 45/100\n",
291
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 826us/step - accuracy: 0.6811 - loss: 0.5827 - val_accuracy: 0.6259 - val_loss: 0.6745\n",
292
+ "Epoch 46/100\n",
293
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 819us/step - accuracy: 0.6928 - loss: 0.5798 - val_accuracy: 0.6331 - val_loss: 0.6697\n",
294
+ "Epoch 47/100\n",
295
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 840us/step - accuracy: 0.6635 - loss: 0.5640 - val_accuracy: 0.6259 - val_loss: 0.6800\n",
296
+ "Epoch 48/100\n",
297
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 876us/step - accuracy: 0.7028 - loss: 0.5463 - val_accuracy: 0.6259 - val_loss: 0.6808\n",
298
+ "Epoch 49/100\n",
299
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 863us/step - accuracy: 0.6815 - loss: 0.5471 - val_accuracy: 0.6763 - val_loss: 0.6747\n",
300
+ "Epoch 50/100\n",
301
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 813us/step - accuracy: 0.7056 - loss: 0.5460 - val_accuracy: 0.6043 - val_loss: 0.6732\n",
302
+ "Epoch 51/100\n",
303
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 871us/step - accuracy: 0.6699 - loss: 0.5527 - val_accuracy: 0.6259 - val_loss: 0.6639\n",
304
+ "Epoch 52/100\n",
305
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 851us/step - accuracy: 0.6865 - loss: 0.5431 - val_accuracy: 0.5827 - val_loss: 0.6947\n",
306
+ "Epoch 53/100\n",
307
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 880us/step - accuracy: 0.7055 - loss: 0.5520 - val_accuracy: 0.6691 - val_loss: 0.6790\n",
308
+ "Epoch 54/100\n",
309
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 862us/step - accuracy: 0.6601 - loss: 0.5539 - val_accuracy: 0.6115 - val_loss: 0.6750\n",
310
+ "Epoch 55/100\n",
311
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 892us/step - accuracy: 0.6870 - loss: 0.5535 - val_accuracy: 0.6115 - val_loss: 0.6940\n",
312
+ "Epoch 56/100\n",
313
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 877us/step - accuracy: 0.7203 - loss: 0.5570 - val_accuracy: 0.5971 - val_loss: 0.6825\n",
314
+ "Epoch 57/100\n",
315
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 876us/step - accuracy: 0.6761 - loss: 0.5497 - val_accuracy: 0.6403 - val_loss: 0.6792\n",
316
+ "Epoch 58/100\n",
317
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 914us/step - accuracy: 0.6850 - loss: 0.5713 - val_accuracy: 0.5899 - val_loss: 0.6808\n",
318
+ "Epoch 59/100\n",
319
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 887us/step - accuracy: 0.6847 - loss: 0.5699 - val_accuracy: 0.6331 - val_loss: 0.6751\n",
320
+ "Epoch 60/100\n",
321
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 924us/step - accuracy: 0.6914 - loss: 0.5308 - val_accuracy: 0.6259 - val_loss: 0.6936\n",
322
+ "Epoch 61/100\n",
323
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 923us/step - accuracy: 0.6931 - loss: 0.5340 - val_accuracy: 0.5971 - val_loss: 0.6811\n",
324
+ "Epoch 62/100\n",
325
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 881us/step - accuracy: 0.6754 - loss: 0.5450 - val_accuracy: 0.5971 - val_loss: 0.6735\n",
326
+ "Epoch 63/100\n",
327
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 844us/step - accuracy: 0.6801 - loss: 0.5640 - val_accuracy: 0.6115 - val_loss: 0.6779\n",
328
+ "Epoch 64/100\n",
329
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 857us/step - accuracy: 0.6908 - loss: 0.5368 - val_accuracy: 0.6403 - val_loss: 0.6759\n",
330
+ "Epoch 65/100\n",
331
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 980us/step - accuracy: 0.6560 - loss: 0.5869 - val_accuracy: 0.6403 - val_loss: 0.6796\n",
332
+ "Epoch 66/100\n",
333
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 867us/step - accuracy: 0.6885 - loss: 0.5651 - val_accuracy: 0.5899 - val_loss: 0.6890\n",
334
+ "Epoch 67/100\n",
335
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 865us/step - accuracy: 0.6884 - loss: 0.5416 - val_accuracy: 0.6331 - val_loss: 0.6653\n",
336
+ "Epoch 68/100\n",
337
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 903us/step - accuracy: 0.6798 - loss: 0.5628 - val_accuracy: 0.6619 - val_loss: 0.6721\n",
338
+ "Epoch 69/100\n",
339
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 899us/step - accuracy: 0.7162 - loss: 0.5363 - val_accuracy: 0.6331 - val_loss: 0.6724\n",
340
+ "Epoch 70/100\n",
341
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 866us/step - accuracy: 0.6774 - loss: 0.5539 - val_accuracy: 0.6187 - val_loss: 0.6847\n",
342
+ "Epoch 71/100\n",
343
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 896us/step - accuracy: 0.7058 - loss: 0.5358 - val_accuracy: 0.6187 - val_loss: 0.6825\n",
344
+ "Epoch 72/100\n",
345
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 851us/step - accuracy: 0.6792 - loss: 0.5781 - val_accuracy: 0.6115 - val_loss: 0.6763\n",
346
+ "Epoch 73/100\n",
347
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 901us/step - accuracy: 0.7162 - loss: 0.5427 - val_accuracy: 0.5971 - val_loss: 0.6926\n",
348
+ "Epoch 74/100\n",
349
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 875us/step - accuracy: 0.6971 - loss: 0.5410 - val_accuracy: 0.5971 - val_loss: 0.6893\n",
350
+ "Epoch 75/100\n",
351
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 896us/step - accuracy: 0.6957 - loss: 0.5440 - val_accuracy: 0.6115 - val_loss: 0.6837\n",
352
+ "Epoch 76/100\n",
353
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 878us/step - accuracy: 0.6985 - loss: 0.5571 - val_accuracy: 0.5540 - val_loss: 0.6833\n",
354
+ "Epoch 77/100\n",
355
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 858us/step - accuracy: 0.7319 - loss: 0.5332 - val_accuracy: 0.5971 - val_loss: 0.6736\n",
356
+ "Epoch 78/100\n",
357
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 871us/step - accuracy: 0.6926 - loss: 0.5482 - val_accuracy: 0.6043 - val_loss: 0.6939\n",
358
+ "Epoch 79/100\n",
359
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 945us/step - accuracy: 0.7198 - loss: 0.5172 - val_accuracy: 0.6187 - val_loss: 0.6728\n",
360
+ "Epoch 80/100\n",
361
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 915us/step - accuracy: 0.6939 - loss: 0.5527 - val_accuracy: 0.5971 - val_loss: 0.6927\n",
362
+ "Epoch 81/100\n",
363
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.7257 - loss: 0.5143 - val_accuracy: 0.6475 - val_loss: 0.6905\n",
364
+ "Epoch 82/100\n",
365
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 797us/step - accuracy: 0.7362 - loss: 0.5186 - val_accuracy: 0.5468 - val_loss: 0.7176\n",
366
+ "Epoch 83/100\n",
367
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 826us/step - accuracy: 0.6970 - loss: 0.5480 - val_accuracy: 0.6043 - val_loss: 0.6709\n",
368
+ "Epoch 84/100\n",
369
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 802us/step - accuracy: 0.6887 - loss: 0.5634 - val_accuracy: 0.6043 - val_loss: 0.6917\n",
370
+ "Epoch 85/100\n",
371
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━���━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 817us/step - accuracy: 0.7044 - loss: 0.5404 - val_accuracy: 0.5827 - val_loss: 0.7027\n",
372
+ "Epoch 86/100\n",
373
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 853us/step - accuracy: 0.7029 - loss: 0.5226 - val_accuracy: 0.5755 - val_loss: 0.6922\n",
374
+ "Epoch 87/100\n",
375
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 797us/step - accuracy: 0.7021 - loss: 0.5481 - val_accuracy: 0.5683 - val_loss: 0.7086\n",
376
+ "Epoch 88/100\n",
377
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 810us/step - accuracy: 0.6886 - loss: 0.5334 - val_accuracy: 0.6187 - val_loss: 0.6981\n",
378
+ "Epoch 89/100\n",
379
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 803us/step - accuracy: 0.7225 - loss: 0.5191 - val_accuracy: 0.5755 - val_loss: 0.6921\n",
380
+ "Epoch 90/100\n",
381
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 846us/step - accuracy: 0.7311 - loss: 0.5138 - val_accuracy: 0.5755 - val_loss: 0.6973\n",
382
+ "Epoch 91/100\n",
383
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 814us/step - accuracy: 0.7425 - loss: 0.5038 - val_accuracy: 0.5612 - val_loss: 0.7220\n",
384
+ "Epoch 92/100\n",
385
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 809us/step - accuracy: 0.6943 - loss: 0.5257 - val_accuracy: 0.6043 - val_loss: 0.6896\n",
386
+ "Epoch 93/100\n",
387
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 806us/step - accuracy: 0.6973 - loss: 0.5225 - val_accuracy: 0.5899 - val_loss: 0.6951\n",
388
+ "Epoch 94/100\n",
389
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 824us/step - accuracy: 0.6944 - loss: 0.5219 - val_accuracy: 0.5971 - val_loss: 0.6913\n",
390
+ "Epoch 95/100\n",
391
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 805us/step - accuracy: 0.7329 - loss: 0.5238 - val_accuracy: 0.5827 - val_loss: 0.7017\n",
392
+ "Epoch 96/100\n",
393
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 833us/step - accuracy: 0.6984 - loss: 0.5337 - val_accuracy: 0.5755 - val_loss: 0.6819\n",
394
+ "Epoch 97/100\n",
395
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 825us/step - accuracy: 0.7147 - loss: 0.5203 - val_accuracy: 0.5899 - val_loss: 0.6892\n",
396
+ "Epoch 98/100\n",
397
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 878us/step - accuracy: 0.6892 - loss: 0.5300 - val_accuracy: 0.5899 - val_loss: 0.7167\n",
398
+ "Epoch 99/100\n",
399
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 879us/step - accuracy: 0.7202 - loss: 0.5175 - val_accuracy: 0.6115 - val_loss: 0.6922\n",
400
+ "Epoch 100/100\n",
401
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.7134 - loss: 0.5336 - val_accuracy: 0.5971 - val_loss: 0.7082\n"
402
+ ]
403
+ }
404
+ ],
405
+ "source": [
406
+ "model = Sequential([\n",
407
+ " Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(X_train.shape[1], 1)),\n",
408
+ " Conv1D(filters=64, kernel_size=3, activation='relu'),\n",
409
+ " Dropout(0.10),\n",
410
+ " Flatten(),\n",
411
+ " Dense(128, activation='relu'),\n",
412
+ " Dense(y_train.shape[1], activation='softmax')\n",
413
+ "])\n",
414
+ "\n",
415
+ "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
416
+ "\n",
417
+ "history = model.fit(X_train, y_train, epochs=100, validation_split=0.2)"
418
+ ]
419
+ },
420
+ {
421
+ "cell_type": "code",
422
+ "execution_count": 8,
423
+ "id": "0788ebb8-757f-4180-af39-603f61762b95",
424
+ "metadata": {},
425
+ "outputs": [
426
+ {
427
+ "name": "stdout",
428
+ "output_type": "stream",
429
+ "text": [
430
+ "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step - accuracy: 0.6268 - loss: 0.7269 \n",
431
+ "Test Accuracy: 63.64%\n"
432
+ ]
433
+ }
434
+ ],
435
+ "source": [
436
+ "# Evaluate the model\n",
437
+ "test_loss, test_acc = model.evaluate(X_test, y_test)\n",
438
+ "print(f\"Test Accuracy: {test_acc * 100:.2f}%\")"
439
+ ]
440
+ },
441
+ {
442
+ "cell_type": "code",
443
+ "execution_count": 9,
444
+ "id": "f74da01a-3768-4101-9a06-0650872e533e",
445
+ "metadata": {},
446
+ "outputs": [
447
+ {
448
+ "data": {
449
+ "text/html": [
450
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
451
+ "</pre>\n"
452
+ ],
453
+ "text/plain": [
454
+ "\u001b[1mModel: \"sequential\"\u001b[0m\n"
455
+ ]
456
+ },
457
+ "metadata": {},
458
+ "output_type": "display_data"
459
+ },
460
+ {
461
+ "data": {
462
+ "text/html": [
463
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
464
+ "┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
465
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
466
+ "│ conv1d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span> │\n",
467
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
468
+ "│ conv1d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">6,208</span> │\n",
469
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
470
+ "│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
471
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
472
+ "│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
473
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
474
+ "│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">16,512</span> │\n",
475
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
476
+ "��� dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">258</span> │\n",
477
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
478
+ "</pre>\n"
479
+ ],
480
+ "text/plain": [
481
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
482
+ "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
483
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
484
+ "│ conv1d (\u001b[38;5;33mConv1D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m128\u001b[0m │\n",
485
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
486
+ "│ conv1d_1 (\u001b[38;5;33mConv1D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m6,208\u001b[0m │\n",
487
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
488
+ "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
489
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
490
+ "│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
491
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
492
+ "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m16,512\u001b[0m │\n",
493
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
494
+ "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m) │ \u001b[38;5;34m258\u001b[0m │\n",
495
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
496
+ ]
497
+ },
498
+ "metadata": {},
499
+ "output_type": "display_data"
500
+ },
501
+ {
502
+ "data": {
503
+ "text/html": [
504
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">69,320</span> (270.79 KB)\n",
505
+ "</pre>\n"
506
+ ],
507
+ "text/plain": [
508
+ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m69,320\u001b[0m (270.79 KB)\n"
509
+ ]
510
+ },
511
+ "metadata": {},
512
+ "output_type": "display_data"
513
+ },
514
+ {
515
+ "data": {
516
+ "text/html": [
517
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">23,106</span> (90.26 KB)\n",
518
+ "</pre>\n"
519
+ ],
520
+ "text/plain": [
521
+ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m23,106\u001b[0m (90.26 KB)\n"
522
+ ]
523
+ },
524
+ "metadata": {},
525
+ "output_type": "display_data"
526
+ },
527
+ {
528
+ "data": {
529
+ "text/html": [
530
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
531
+ "</pre>\n"
532
+ ],
533
+ "text/plain": [
534
+ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
535
+ ]
536
+ },
537
+ "metadata": {},
538
+ "output_type": "display_data"
539
+ },
540
+ {
541
+ "data": {
542
+ "text/html": [
543
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Optimizer params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">46,214</span> (180.53 KB)\n",
544
+ "</pre>\n"
545
+ ],
546
+ "text/plain": [
547
+ "\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m46,214\u001b[0m (180.53 KB)\n"
548
+ ]
549
+ },
550
+ "metadata": {},
551
+ "output_type": "display_data"
552
+ },
553
+ {
554
+ "data": {
555
+ "image/png": "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EZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSGNwQERGRSWFwQ0RERCaFwQ0RERGZFAY3REREZFIY3BAREZFJYXBDREREJoXBDREREZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSGNwQERGRSWFwQ0RERCaFwQ0RERGZFAY3REREZFIY3BAREZFJYXBDREREJoXBDREREZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSGNwQERGRSWFwQ0RERCaFwQ0RERGZFAY3REREZFIY3BAREZFJYXBDREREJoXBDREREZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSqkRws3z5cvj5+cHa2hrBwcGIiIgodt1Vq1ahc+fOcHJygpOTE0JDQ0tcn4iIiP5bjB7cbNq0CTNmzMD8+fNx5swZBAYGonfv3khISChy/QMHDmDo0KHYv38/wsPD4evri2eeeQb37t2r5JITERFRVSSTJEkyZgGCg4PRtm1bLFu2DACgVCrh6+uLKVOmYNasWU/dXqFQwMnJCcuWLcPIkSOfun5aWhocHR2RmpoKBweHcpefiIiIKp4+12+j1tzk5ubi9OnTCA0NVS+Ty+UIDQ1FeHh4qfbx+PFj5OXlwdnZucjXc3JykJaWpvMgIiIi02XU4CYpKQkKhQIeHh46yz08PBAXF1eqfcycORPe3t46AZK2xYsXw9HRUf3w9fUtd7mJiIio6jJ6zk15fPrpp9i4cSO2bdsGa2vrIteZPXs2UlNT1Y/Y2NhKLiURERFVJnNjHtzV1RVmZmaIj4/XWR4fHw9PT88St/3iiy/w6aefYu/evWjRokWx61lZWcHKysog5SUiIqKqz6g1N5aWlggKCkJYWJh6mVKpRFhYGEJCQord7rPPPsNHH32EXbt2oU2bNpVRVCIiIqomjFpzAwAzZszAqFGj0KZNG7Rr1w5LlixBZmYmxowZAwAYOXIkfHx8sHjxYgDA//3f/2HevHlYv349/Pz81Lk59vb2sLe3N9r7ICIioqrB6MHN4MGDkZiYiHnz5iEuLg4tW7bErl271EnGMTExkMs1FUwrVqxAbm4uXnrpJZ39zJ8/HwsWLKjMohMREVEVZPRxbiobx7khIiKqfqrN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",
556
+ "text/plain": [
557
+ "<Figure size 640x480 with 1 Axes>"
558
+ ]
559
+ },
560
+ "metadata": {},
561
+ "output_type": "display_data"
562
+ }
563
+ ],
564
+ "source": [
565
+ "model.summary()\n",
566
+ "\n",
567
+ "import matplotlib.pyplot as plt\n",
568
+ "\n",
569
+ "plt.plot(history.history['accuracy'], label='Accuracy')\n",
570
+ "plt.plot(history.history['val_accuracy'], label='Validation Accuracy')\n",
571
+ "plt.xlabel('Epoch')\n",
572
+ "plt.ylabel('Accuracy')\n",
573
+ "plt.ylim([0, 1])\n",
574
+ "plt.legend(loc='lower right')\n",
575
+ "plt.show()"
576
+ ]
577
+ },
578
+ {
579
+ "cell_type": "code",
580
+ "execution_count": 10,
581
+ "id": "9c29a12b-9fda-49b3-bd85-fa699e1f61a2",
582
+ "metadata": {},
583
+ "outputs": [],
584
+ "source": [
585
+ "model.save('patient_outcome_classifier.keras')"
586
+ ]
587
+ }
588
+ ],
589
+ "metadata": {
590
+ "kernelspec": {
591
+ "display_name": "Python 3 (ipykernel)",
592
+ "language": "python",
593
+ "name": "python3"
594
+ },
595
+ "language_info": {
596
+ "codemirror_mode": {
597
+ "name": "ipython",
598
+ "version": 3
599
+ },
600
+ "file_extension": ".py",
601
+ "mimetype": "text/x-python",
602
+ "name": "python",
603
+ "nbconvert_exporter": "python",
604
+ "pygments_lexer": "ipython3",
605
+ "version": "3.12.3"
606
+ }
607
+ },
608
+ "nbformat": 4,
609
+ "nbformat_minor": 5
610
+ }
.python-version ADDED
@@ -0,0 +1 @@
 
 
1
+ 3.12.3
49719_AV.wav ADDED
Binary file (242 kB). View file
 
app.py CHANGED
@@ -6,6 +6,8 @@ import pandas as pd
6
 
7
  from transformers import pipeline
8
 
 
 
9
 
10
  def get_murmur_from_recordings(audio):
11
  pipe = pipeline("audio-classification",
@@ -76,7 +78,7 @@ def predict(audio, age, sex, height, weight, is_pregnant):
76
  demo = gr.Interface(
77
  fn=predict,
78
  inputs=[
79
- "audio",
80
  gr.Radio(label="Age", choices=[
81
  "Neonate", "Infant", "Child", "Adolescent"],
82
  value="Adolescent"),
@@ -85,6 +87,11 @@ demo = gr.Interface(
85
  gr.Number(label="Weight", value="38.1"),
86
  gr.Checkbox(label="Pregnant", value=False)
87
  ],
88
- outputs="label"
 
 
 
 
 
89
  )
90
  demo.launch()
 
6
 
7
  from transformers import pipeline
8
 
9
+ from examples import normal, abnormal
10
+
11
 
12
  def get_murmur_from_recordings(audio):
13
  pipe = pipeline("audio-classification",
 
78
  demo = gr.Interface(
79
  fn=predict,
80
  inputs=[
81
+ gr.Audio(label="Recording"),
82
  gr.Radio(label="Age", choices=[
83
  "Neonate", "Infant", "Child", "Adolescent"],
84
  value="Adolescent"),
 
87
  gr.Number(label="Weight", value="38.1"),
88
  gr.Checkbox(label="Pregnant", value=False)
89
  ],
90
+ outputs="label",
91
+ cache_examples=True,
92
+ examples=[
93
+ normal,
94
+ abnormal,
95
+ ],
96
  )
97
  demo.launch()
csv_classification.ipynb ADDED
@@ -0,0 +1,610 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "id": "be5e2cf3-4e08-4dda-b5e9-42cc43821aee",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "import os\n",
11
+ "import glob\n",
12
+ "import numpy as np\n",
13
+ "from tqdm import tqdm\n",
14
+ "import itertools\n",
15
+ "import matplotlib.pyplot as plt\n",
16
+ "from sklearn.model_selection import train_test_split\n",
17
+ "from sklearn.metrics import classification_report, accuracy_score, confusion_matrix\n",
18
+ "from sklearn.preprocessing import LabelEncoder\n",
19
+ "from sklearn.utils import shuffle\n",
20
+ "from sklearn.utils import class_weight\n",
21
+ "import keras\n",
22
+ "from keras.models import Sequential\n",
23
+ "from keras.layers import Dense, Dropout, Activation, Flatten\n",
24
+ "from keras.layers import Convolution2D, Conv2D, MaxPooling2D, GlobalAveragePooling2D\n",
25
+ "from keras.utils import to_categorical\n",
26
+ "import numpy as np\n",
27
+ "import tensorflow as tf\n",
28
+ "from tensorflow.keras.models import Sequential\n",
29
+ "from tensorflow.keras.layers import Dense, Conv1D, Flatten, Dropout\n",
30
+ "from tensorflow.keras.utils import to_categorical\n",
31
+ "from sklearn.model_selection import train_test_split\n",
32
+ "from sklearn.preprocessing import StandardScaler\n",
33
+ "import warnings\n",
34
+ "warnings.filterwarnings('ignore', category=FutureWarning)\n",
35
+ "import matplotlib.pyplot as plt\n",
36
+ "import zipfile\n",
37
+ "from IPython.display import clear_output\n",
38
+ "import glob\n",
39
+ "import pandas as pd\n",
40
+ "import os"
41
+ ]
42
+ },
43
+ {
44
+ "cell_type": "code",
45
+ "execution_count": 3,
46
+ "id": "0a41fca8-0f28-461f-98a6-6314d41481f3",
47
+ "metadata": {},
48
+ "outputs": [
49
+ {
50
+ "name": "stdout",
51
+ "output_type": "stream",
52
+ "text": [
53
+ " Age Sex Height Weight Pregnancy status Murmur Outcome\n",
54
+ "0 2 1 0.434483 0.125346 0 0 1\n",
55
+ "1 2 1 0.468966 0.099539 0 1 1\n",
56
+ "3 2 0 0.434483 0.125346 0 1 1\n",
57
+ "4 2 0 0.358621 0.082028 0 1 1\n",
58
+ "6 2 1 0.393103 0.107834 0 0 1\n",
59
+ "Number of data sample rows: 759\n"
60
+ ]
61
+ }
62
+ ],
63
+ "source": [
64
+ "from numpy import nan\n",
65
+ "from sklearn.preprocessing import MinMaxScaler\n",
66
+ "df = pd.read_csv(os.path.join('training_data.csv'))\n",
67
+ "\n",
68
+ "# Now drop the columns\n",
69
+ "columns_to_drop = [\n",
70
+ " \"Patient ID\", \"Recording locations\", \"Murmur locations\", \"Most audible location\",\n",
71
+ " \"Systolic murmur timing\", \"Systolic murmur shape\", \"Systolic murmur grading\",\n",
72
+ " \"Systolic murmur pitch\", \"Systolic murmur quality\", \"Diastolic murmur timing\",\n",
73
+ " \"Diastolic murmur shape\", \"Diastolic murmur grading\", \"Diastolic murmur pitch\",\n",
74
+ " \"Diastolic murmur quality\", \"Campaign\", \"Additional ID\", \"Recording locations:\",\n",
75
+ "]\n",
76
+ "df.drop(columns=columns_to_drop, inplace=True, errors='ignore')\n",
77
+ "\n",
78
+ "scaler = MinMaxScaler()\n",
79
+ "columns_to_normalize = ['Weight', 'Height']\n",
80
+ "data_to_normalize = df[columns_to_normalize]\n",
81
+ "normalized_data = scaler.fit_transform(data_to_normalize)\n",
82
+ "df_normalized = pd.DataFrame(normalized_data, columns=columns_to_normalize)\n",
83
+ "df[columns_to_normalize] = df_normalized\n",
84
+ "\n",
85
+ "\n",
86
+ "df['Pregnancy status'] = df['Pregnancy status'].apply(lambda x: 1 if x else 0)\n",
87
+ "sex2int = {'Male': 0, 'Female': 1}\n",
88
+ "df['Sex'] = df['Sex'].apply(lambda x: sex2int[x] if x in sex2int else -1)\n",
89
+ "df = df[df['Sex'] != -1]\n",
90
+ "\n",
91
+ "age2int = {'Neonate': 0, 'Infant': 1, 'Child': 2, 'Adolescent': 3}\n",
92
+ "df['Age'] = df['Age'].apply(lambda x: age2int[x] if x in age2int else -1)\n",
93
+ "df = df[df['Age'] != -1]\n",
94
+ "\n",
95
+ "df = df[df['Murmur'] != 'Unknown']\n",
96
+ "df['Murmur'] = df['Murmur'].apply(lambda x: 0 if x == 'Absent' else (1 if x == 'Present' else 2))\n",
97
+ "\n",
98
+ "outcome2int = {'Normal': 0, 'Abnormal': 1}\n",
99
+ "df['Outcome'] = df['Outcome'].apply(lambda x: outcome2int[x] if x in outcome2int else -1)\n",
100
+ "df = df[df['Outcome'] != -1]\n",
101
+ "\n",
102
+ "df = df.select_dtypes(include=[np.number])\n",
103
+ "df.dropna(inplace=True)\n",
104
+ "\n",
105
+ "\n",
106
+ "print(df.head())\n",
107
+ "print(\"Number of data sample rows:\", df.shape[0])"
108
+ ]
109
+ },
110
+ {
111
+ "cell_type": "code",
112
+ "execution_count": 6,
113
+ "id": "499b212d-8acb-4ce5-a1e1-ec62d9f1142b",
114
+ "metadata": {},
115
+ "outputs": [
116
+ {
117
+ "name": "stdout",
118
+ "output_type": "stream",
119
+ "text": [
120
+ " Age Sex Height Weight Pregnancy status Murmur Outcome\n",
121
+ "0 2 1 0.446520 0.118830 0 0 1\n",
122
+ "1 2 1 0.457870 0.120511 0 1 1\n",
123
+ "2 2 0 0.423518 0.131510 0 1 1\n",
124
+ "3 2 0 0.356813 0.071461 0 1 1\n",
125
+ "4 2 1 0.396024 0.102232 0 0 1\n",
126
+ "Number of data sample rows after SMOTE: 768\n",
127
+ "Example input\n",
128
+ " Age 2.00000\n",
129
+ "Sex 1.00000\n",
130
+ "Height 0.44652\n",
131
+ "Weight 0.11883\n",
132
+ "Pregnancy status 0.00000\n",
133
+ "Murmur 0.00000\n",
134
+ "Name: 0, dtype: float64\n"
135
+ ]
136
+ }
137
+ ],
138
+ "source": [
139
+ "import pandas as pd\n",
140
+ "import numpy as np\n",
141
+ "from sklearn.preprocessing import MinMaxScaler, StandardScaler\n",
142
+ "from sklearn.model_selection import train_test_split\n",
143
+ "from tensorflow.keras.utils import to_categorical\n",
144
+ "from sklearn.utils import resample\n",
145
+ "from imblearn.over_sampling import SMOTE\n",
146
+ "\n",
147
+ "\n",
148
+ "noise_scale = 0.01\n",
149
+ "\n",
150
+ "numerical_cols = ['Weight', 'Height']\n",
151
+ "for col in numerical_cols:\n",
152
+ " df[col] += np.random.normal(loc=0.0, scale=noise_scale, size=df[col].shape)\n",
153
+ "\n",
154
+ "# Apply SMOTE for data aug\n",
155
+ "smote = SMOTE()\n",
156
+ "X = df.drop('Outcome', axis=1)\n",
157
+ "y = df['Outcome']\n",
158
+ "\n",
159
+ "X_sm, y_sm = smote.fit_resample(X, y)\n",
160
+ "df_sm = pd.DataFrame(X_sm, columns=X.columns)\n",
161
+ "df_sm['Outcome'] = y_sm\n",
162
+ "\n",
163
+ "\n",
164
+ "scaler = StandardScaler()\n",
165
+ "X_scaled = scaler.fit_transform(df_sm.drop('Outcome', axis=1))\n",
166
+ "X_scaled = X_scaled.reshape(X_scaled.shape[0], X_scaled.shape[1], 1)\n",
167
+ "y_encoded = to_categorical(df_sm['Outcome'])\n",
168
+ "\n",
169
+ "# Split data into training and test sets\n",
170
+ "X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_encoded, test_size=0.1, random_state=42)\n",
171
+ "\n",
172
+ "# augmented data\n",
173
+ "print(df_sm.head())\n",
174
+ "print(\"Number of data sample rows after SMOTE:\", df_sm.shape[0])\n",
175
+ "print(\"Example input\\n\", df_sm.drop('Outcome', axis=1).loc[0])"
176
+ ]
177
+ },
178
+ {
179
+ "cell_type": "code",
180
+ "execution_count": 7,
181
+ "id": "9a680377-7bdd-4da6-8c5b-eb9fb1336250",
182
+ "metadata": {},
183
+ "outputs": [
184
+ {
185
+ "name": "stdout",
186
+ "output_type": "stream",
187
+ "text": [
188
+ "Epoch 1/100\n"
189
+ ]
190
+ },
191
+ {
192
+ "name": "stderr",
193
+ "output_type": "stream",
194
+ "text": [
195
+ "/Users/cogniveon/src/HeartMurmurClassification/.venv/lib/python3.12/site-packages/keras/src/layers/convolutional/base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
196
+ " super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n"
197
+ ]
198
+ },
199
+ {
200
+ "name": "stdout",
201
+ "output_type": "stream",
202
+ "text": [
203
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step - accuracy: 0.5140 - loss: 0.6888 - val_accuracy: 0.6403 - val_loss: 0.6672\n",
204
+ "Epoch 2/100\n",
205
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 758us/step - accuracy: 0.6529 - loss: 0.6446 - val_accuracy: 0.6547 - val_loss: 0.6523\n",
206
+ "Epoch 3/100\n",
207
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 757us/step - accuracy: 0.6820 - loss: 0.5970 - val_accuracy: 0.6835 - val_loss: 0.6649\n",
208
+ "Epoch 4/100\n",
209
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 830us/step - accuracy: 0.6451 - loss: 0.6134 - val_accuracy: 0.6547 - val_loss: 0.6601\n",
210
+ "Epoch 5/100\n",
211
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step - accuracy: 0.6527 - loss: 0.6077 - val_accuracy: 0.6475 - val_loss: 0.6574\n",
212
+ "Epoch 6/100\n",
213
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 875us/step - accuracy: 0.6605 - loss: 0.6117 - val_accuracy: 0.6187 - val_loss: 0.6709\n",
214
+ "Epoch 7/100\n",
215
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 822us/step - accuracy: 0.6460 - loss: 0.6094 - val_accuracy: 0.6259 - val_loss: 0.6673\n",
216
+ "Epoch 8/100\n",
217
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 827us/step - accuracy: 0.6691 - loss: 0.6166 - val_accuracy: 0.6331 - val_loss: 0.6621\n",
218
+ "Epoch 9/100\n",
219
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 809us/step - accuracy: 0.6584 - loss: 0.5825 - val_accuracy: 0.6403 - val_loss: 0.6667\n",
220
+ "Epoch 10/100\n",
221
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 860us/step - accuracy: 0.6752 - loss: 0.5976 - val_accuracy: 0.6187 - val_loss: 0.6591\n",
222
+ "Epoch 11/100\n",
223
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 807us/step - accuracy: 0.6603 - loss: 0.6061 - val_accuracy: 0.6187 - val_loss: 0.6664\n",
224
+ "Epoch 12/100\n",
225
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 845us/step - accuracy: 0.6561 - loss: 0.5776 - val_accuracy: 0.6259 - val_loss: 0.6739\n",
226
+ "Epoch 13/100\n",
227
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 817us/step - accuracy: 0.6700 - loss: 0.5976 - val_accuracy: 0.5971 - val_loss: 0.6730\n",
228
+ "Epoch 14/100\n",
229
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 919us/step - accuracy: 0.6622 - loss: 0.5886 - val_accuracy: 0.6475 - val_loss: 0.6471\n",
230
+ "Epoch 15/100\n",
231
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 901us/step - accuracy: 0.6307 - loss: 0.6162 - val_accuracy: 0.6259 - val_loss: 0.6728\n",
232
+ "Epoch 16/100\n",
233
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - accuracy: 0.7153 - loss: 0.5660 - val_accuracy: 0.6187 - val_loss: 0.6775\n",
234
+ "Epoch 17/100\n",
235
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 862us/step - accuracy: 0.6509 - loss: 0.5898 - val_accuracy: 0.6547 - val_loss: 0.6607\n",
236
+ "Epoch 18/100\n",
237
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 827us/step - accuracy: 0.6680 - loss: 0.5865 - val_accuracy: 0.6115 - val_loss: 0.6673\n",
238
+ "Epoch 19/100\n",
239
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 805us/step - accuracy: 0.7013 - loss: 0.5647 - val_accuracy: 0.6403 - val_loss: 0.6851\n",
240
+ "Epoch 20/100\n",
241
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 821us/step - accuracy: 0.6532 - loss: 0.5964 - val_accuracy: 0.6403 - val_loss: 0.6621\n",
242
+ "Epoch 21/100\n",
243
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 894us/step - accuracy: 0.6963 - loss: 0.5668 - val_accuracy: 0.6403 - val_loss: 0.6617\n",
244
+ "Epoch 22/100\n",
245
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 806us/step - accuracy: 0.6953 - loss: 0.5799 - val_accuracy: 0.6187 - val_loss: 0.6875\n",
246
+ "Epoch 23/100\n",
247
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 839us/step - accuracy: 0.6900 - loss: 0.5655 - val_accuracy: 0.6619 - val_loss: 0.6612\n",
248
+ "Epoch 24/100\n",
249
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 800us/step - accuracy: 0.6564 - loss: 0.5771 - val_accuracy: 0.6403 - val_loss: 0.6714\n",
250
+ "Epoch 25/100\n",
251
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 854us/step - accuracy: 0.6492 - loss: 0.5895 - val_accuracy: 0.6403 - val_loss: 0.6660\n",
252
+ "Epoch 26/100\n",
253
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 823us/step - accuracy: 0.6741 - loss: 0.5800 - val_accuracy: 0.6043 - val_loss: 0.6837\n",
254
+ "Epoch 27/100\n",
255
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 981us/step - accuracy: 0.6954 - loss: 0.5519 - val_accuracy: 0.6475 - val_loss: 0.6633\n",
256
+ "Epoch 28/100\n",
257
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 835us/step - accuracy: 0.6696 - loss: 0.6009 - val_accuracy: 0.6403 - val_loss: 0.6640\n",
258
+ "Epoch 29/100\n",
259
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 813us/step - accuracy: 0.7001 - loss: 0.5766 - val_accuracy: 0.6043 - val_loss: 0.6851\n",
260
+ "Epoch 30/100\n",
261
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 859us/step - accuracy: 0.6787 - loss: 0.5600 - val_accuracy: 0.6187 - val_loss: 0.6747\n",
262
+ "Epoch 31/100\n",
263
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.6745 - loss: 0.5595 - val_accuracy: 0.6403 - val_loss: 0.6796\n",
264
+ "Epoch 32/100\n",
265
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.6875 - loss: 0.5671 - val_accuracy: 0.6115 - val_loss: 0.6778\n",
266
+ "Epoch 33/100\n",
267
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 875us/step - accuracy: 0.7172 - loss: 0.5561 - val_accuracy: 0.6331 - val_loss: 0.6794\n",
268
+ "Epoch 34/100\n",
269
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 878us/step - accuracy: 0.6928 - loss: 0.5613 - val_accuracy: 0.5971 - val_loss: 0.6941\n",
270
+ "Epoch 35/100\n",
271
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 819us/step - accuracy: 0.6808 - loss: 0.5736 - val_accuracy: 0.6403 - val_loss: 0.6599\n",
272
+ "Epoch 36/100\n",
273
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 828us/step - accuracy: 0.6721 - loss: 0.5741 - val_accuracy: 0.5899 - val_loss: 0.6916\n",
274
+ "Epoch 37/100\n",
275
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 888us/step - accuracy: 0.7092 - loss: 0.5700 - val_accuracy: 0.5971 - val_loss: 0.6824\n",
276
+ "Epoch 38/100\n",
277
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 912us/step - accuracy: 0.6687 - loss: 0.5851 - val_accuracy: 0.6259 - val_loss: 0.6897\n",
278
+ "Epoch 39/100\n",
279
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 851us/step - accuracy: 0.6743 - loss: 0.5730 - val_accuracy: 0.6403 - val_loss: 0.6697\n",
280
+ "Epoch 40/100\n",
281
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 859us/step - accuracy: 0.6599 - loss: 0.5979 - val_accuracy: 0.6259 - val_loss: 0.6921\n",
282
+ "Epoch 41/100\n",
283
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 840us/step - accuracy: 0.7042 - loss: 0.5661 - val_accuracy: 0.6475 - val_loss: 0.6761\n",
284
+ "Epoch 42/100\n",
285
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 859us/step - accuracy: 0.6773 - loss: 0.5497 - val_accuracy: 0.6187 - val_loss: 0.6829\n",
286
+ "Epoch 43/100\n",
287
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 864us/step - accuracy: 0.6886 - loss: 0.5754 - val_accuracy: 0.6475 - val_loss: 0.6664\n",
288
+ "Epoch 44/100\n",
289
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - accuracy: 0.6558 - loss: 0.5854 - val_accuracy: 0.5755 - val_loss: 0.6825\n",
290
+ "Epoch 45/100\n",
291
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 826us/step - accuracy: 0.6811 - loss: 0.5827 - val_accuracy: 0.6259 - val_loss: 0.6745\n",
292
+ "Epoch 46/100\n",
293
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 819us/step - accuracy: 0.6928 - loss: 0.5798 - val_accuracy: 0.6331 - val_loss: 0.6697\n",
294
+ "Epoch 47/100\n",
295
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 840us/step - accuracy: 0.6635 - loss: 0.5640 - val_accuracy: 0.6259 - val_loss: 0.6800\n",
296
+ "Epoch 48/100\n",
297
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 876us/step - accuracy: 0.7028 - loss: 0.5463 - val_accuracy: 0.6259 - val_loss: 0.6808\n",
298
+ "Epoch 49/100\n",
299
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 863us/step - accuracy: 0.6815 - loss: 0.5471 - val_accuracy: 0.6763 - val_loss: 0.6747\n",
300
+ "Epoch 50/100\n",
301
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 813us/step - accuracy: 0.7056 - loss: 0.5460 - val_accuracy: 0.6043 - val_loss: 0.6732\n",
302
+ "Epoch 51/100\n",
303
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 871us/step - accuracy: 0.6699 - loss: 0.5527 - val_accuracy: 0.6259 - val_loss: 0.6639\n",
304
+ "Epoch 52/100\n",
305
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 851us/step - accuracy: 0.6865 - loss: 0.5431 - val_accuracy: 0.5827 - val_loss: 0.6947\n",
306
+ "Epoch 53/100\n",
307
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 880us/step - accuracy: 0.7055 - loss: 0.5520 - val_accuracy: 0.6691 - val_loss: 0.6790\n",
308
+ "Epoch 54/100\n",
309
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 862us/step - accuracy: 0.6601 - loss: 0.5539 - val_accuracy: 0.6115 - val_loss: 0.6750\n",
310
+ "Epoch 55/100\n",
311
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 892us/step - accuracy: 0.6870 - loss: 0.5535 - val_accuracy: 0.6115 - val_loss: 0.6940\n",
312
+ "Epoch 56/100\n",
313
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 877us/step - accuracy: 0.7203 - loss: 0.5570 - val_accuracy: 0.5971 - val_loss: 0.6825\n",
314
+ "Epoch 57/100\n",
315
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 876us/step - accuracy: 0.6761 - loss: 0.5497 - val_accuracy: 0.6403 - val_loss: 0.6792\n",
316
+ "Epoch 58/100\n",
317
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 914us/step - accuracy: 0.6850 - loss: 0.5713 - val_accuracy: 0.5899 - val_loss: 0.6808\n",
318
+ "Epoch 59/100\n",
319
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 887us/step - accuracy: 0.6847 - loss: 0.5699 - val_accuracy: 0.6331 - val_loss: 0.6751\n",
320
+ "Epoch 60/100\n",
321
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 924us/step - accuracy: 0.6914 - loss: 0.5308 - val_accuracy: 0.6259 - val_loss: 0.6936\n",
322
+ "Epoch 61/100\n",
323
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 923us/step - accuracy: 0.6931 - loss: 0.5340 - val_accuracy: 0.5971 - val_loss: 0.6811\n",
324
+ "Epoch 62/100\n",
325
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 881us/step - accuracy: 0.6754 - loss: 0.5450 - val_accuracy: 0.5971 - val_loss: 0.6735\n",
326
+ "Epoch 63/100\n",
327
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 844us/step - accuracy: 0.6801 - loss: 0.5640 - val_accuracy: 0.6115 - val_loss: 0.6779\n",
328
+ "Epoch 64/100\n",
329
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 857us/step - accuracy: 0.6908 - loss: 0.5368 - val_accuracy: 0.6403 - val_loss: 0.6759\n",
330
+ "Epoch 65/100\n",
331
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 980us/step - accuracy: 0.6560 - loss: 0.5869 - val_accuracy: 0.6403 - val_loss: 0.6796\n",
332
+ "Epoch 66/100\n",
333
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 867us/step - accuracy: 0.6885 - loss: 0.5651 - val_accuracy: 0.5899 - val_loss: 0.6890\n",
334
+ "Epoch 67/100\n",
335
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 865us/step - accuracy: 0.6884 - loss: 0.5416 - val_accuracy: 0.6331 - val_loss: 0.6653\n",
336
+ "Epoch 68/100\n",
337
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 903us/step - accuracy: 0.6798 - loss: 0.5628 - val_accuracy: 0.6619 - val_loss: 0.6721\n",
338
+ "Epoch 69/100\n",
339
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 899us/step - accuracy: 0.7162 - loss: 0.5363 - val_accuracy: 0.6331 - val_loss: 0.6724\n",
340
+ "Epoch 70/100\n",
341
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 866us/step - accuracy: 0.6774 - loss: 0.5539 - val_accuracy: 0.6187 - val_loss: 0.6847\n",
342
+ "Epoch 71/100\n",
343
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 896us/step - accuracy: 0.7058 - loss: 0.5358 - val_accuracy: 0.6187 - val_loss: 0.6825\n",
344
+ "Epoch 72/100\n",
345
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 851us/step - accuracy: 0.6792 - loss: 0.5781 - val_accuracy: 0.6115 - val_loss: 0.6763\n",
346
+ "Epoch 73/100\n",
347
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 901us/step - accuracy: 0.7162 - loss: 0.5427 - val_accuracy: 0.5971 - val_loss: 0.6926\n",
348
+ "Epoch 74/100\n",
349
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 875us/step - accuracy: 0.6971 - loss: 0.5410 - val_accuracy: 0.5971 - val_loss: 0.6893\n",
350
+ "Epoch 75/100\n",
351
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 896us/step - accuracy: 0.6957 - loss: 0.5440 - val_accuracy: 0.6115 - val_loss: 0.6837\n",
352
+ "Epoch 76/100\n",
353
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 878us/step - accuracy: 0.6985 - loss: 0.5571 - val_accuracy: 0.5540 - val_loss: 0.6833\n",
354
+ "Epoch 77/100\n",
355
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 858us/step - accuracy: 0.7319 - loss: 0.5332 - val_accuracy: 0.5971 - val_loss: 0.6736\n",
356
+ "Epoch 78/100\n",
357
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 871us/step - accuracy: 0.6926 - loss: 0.5482 - val_accuracy: 0.6043 - val_loss: 0.6939\n",
358
+ "Epoch 79/100\n",
359
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 945us/step - accuracy: 0.7198 - loss: 0.5172 - val_accuracy: 0.6187 - val_loss: 0.6728\n",
360
+ "Epoch 80/100\n",
361
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 915us/step - accuracy: 0.6939 - loss: 0.5527 - val_accuracy: 0.5971 - val_loss: 0.6927\n",
362
+ "Epoch 81/100\n",
363
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.7257 - loss: 0.5143 - val_accuracy: 0.6475 - val_loss: 0.6905\n",
364
+ "Epoch 82/100\n",
365
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 797us/step - accuracy: 0.7362 - loss: 0.5186 - val_accuracy: 0.5468 - val_loss: 0.7176\n",
366
+ "Epoch 83/100\n",
367
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 826us/step - accuracy: 0.6970 - loss: 0.5480 - val_accuracy: 0.6043 - val_loss: 0.6709\n",
368
+ "Epoch 84/100\n",
369
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 802us/step - accuracy: 0.6887 - loss: 0.5634 - val_accuracy: 0.6043 - val_loss: 0.6917\n",
370
+ "Epoch 85/100\n",
371
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━���━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 817us/step - accuracy: 0.7044 - loss: 0.5404 - val_accuracy: 0.5827 - val_loss: 0.7027\n",
372
+ "Epoch 86/100\n",
373
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 853us/step - accuracy: 0.7029 - loss: 0.5226 - val_accuracy: 0.5755 - val_loss: 0.6922\n",
374
+ "Epoch 87/100\n",
375
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 797us/step - accuracy: 0.7021 - loss: 0.5481 - val_accuracy: 0.5683 - val_loss: 0.7086\n",
376
+ "Epoch 88/100\n",
377
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 810us/step - accuracy: 0.6886 - loss: 0.5334 - val_accuracy: 0.6187 - val_loss: 0.6981\n",
378
+ "Epoch 89/100\n",
379
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 803us/step - accuracy: 0.7225 - loss: 0.5191 - val_accuracy: 0.5755 - val_loss: 0.6921\n",
380
+ "Epoch 90/100\n",
381
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 846us/step - accuracy: 0.7311 - loss: 0.5138 - val_accuracy: 0.5755 - val_loss: 0.6973\n",
382
+ "Epoch 91/100\n",
383
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 814us/step - accuracy: 0.7425 - loss: 0.5038 - val_accuracy: 0.5612 - val_loss: 0.7220\n",
384
+ "Epoch 92/100\n",
385
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 809us/step - accuracy: 0.6943 - loss: 0.5257 - val_accuracy: 0.6043 - val_loss: 0.6896\n",
386
+ "Epoch 93/100\n",
387
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 806us/step - accuracy: 0.6973 - loss: 0.5225 - val_accuracy: 0.5899 - val_loss: 0.6951\n",
388
+ "Epoch 94/100\n",
389
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 824us/step - accuracy: 0.6944 - loss: 0.5219 - val_accuracy: 0.5971 - val_loss: 0.6913\n",
390
+ "Epoch 95/100\n",
391
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 805us/step - accuracy: 0.7329 - loss: 0.5238 - val_accuracy: 0.5827 - val_loss: 0.7017\n",
392
+ "Epoch 96/100\n",
393
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 833us/step - accuracy: 0.6984 - loss: 0.5337 - val_accuracy: 0.5755 - val_loss: 0.6819\n",
394
+ "Epoch 97/100\n",
395
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 825us/step - accuracy: 0.7147 - loss: 0.5203 - val_accuracy: 0.5899 - val_loss: 0.6892\n",
396
+ "Epoch 98/100\n",
397
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 878us/step - accuracy: 0.6892 - loss: 0.5300 - val_accuracy: 0.5899 - val_loss: 0.7167\n",
398
+ "Epoch 99/100\n",
399
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 879us/step - accuracy: 0.7202 - loss: 0.5175 - val_accuracy: 0.6115 - val_loss: 0.6922\n",
400
+ "Epoch 100/100\n",
401
+ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.7134 - loss: 0.5336 - val_accuracy: 0.5971 - val_loss: 0.7082\n"
402
+ ]
403
+ }
404
+ ],
405
+ "source": [
406
+ "model = Sequential([\n",
407
+ " Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(X_train.shape[1], 1)),\n",
408
+ " Conv1D(filters=64, kernel_size=3, activation='relu'),\n",
409
+ " Dropout(0.10),\n",
410
+ " Flatten(),\n",
411
+ " Dense(128, activation='relu'),\n",
412
+ " Dense(y_train.shape[1], activation='softmax')\n",
413
+ "])\n",
414
+ "\n",
415
+ "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
416
+ "\n",
417
+ "history = model.fit(X_train, y_train, epochs=100, validation_split=0.2)"
418
+ ]
419
+ },
420
+ {
421
+ "cell_type": "code",
422
+ "execution_count": 8,
423
+ "id": "0788ebb8-757f-4180-af39-603f61762b95",
424
+ "metadata": {},
425
+ "outputs": [
426
+ {
427
+ "name": "stdout",
428
+ "output_type": "stream",
429
+ "text": [
430
+ "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step - accuracy: 0.6268 - loss: 0.7269 \n",
431
+ "Test Accuracy: 63.64%\n"
432
+ ]
433
+ }
434
+ ],
435
+ "source": [
436
+ "# Evaluate the model\n",
437
+ "test_loss, test_acc = model.evaluate(X_test, y_test)\n",
438
+ "print(f\"Test Accuracy: {test_acc * 100:.2f}%\")"
439
+ ]
440
+ },
441
+ {
442
+ "cell_type": "code",
443
+ "execution_count": 9,
444
+ "id": "f74da01a-3768-4101-9a06-0650872e533e",
445
+ "metadata": {},
446
+ "outputs": [
447
+ {
448
+ "data": {
449
+ "text/html": [
450
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
451
+ "</pre>\n"
452
+ ],
453
+ "text/plain": [
454
+ "\u001b[1mModel: \"sequential\"\u001b[0m\n"
455
+ ]
456
+ },
457
+ "metadata": {},
458
+ "output_type": "display_data"
459
+ },
460
+ {
461
+ "data": {
462
+ "text/html": [
463
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
464
+ "┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
465
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
466
+ "│ conv1d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span> │\n",
467
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
468
+ "│ conv1d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">6,208</span> │\n",
469
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
470
+ "│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
471
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
472
+ "│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
473
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
474
+ "│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">16,512</span> │\n",
475
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
476
+ "��� dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">258</span> │\n",
477
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
478
+ "</pre>\n"
479
+ ],
480
+ "text/plain": [
481
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
482
+ "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
483
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
484
+ "│ conv1d (\u001b[38;5;33mConv1D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m128\u001b[0m │\n",
485
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
486
+ "│ conv1d_1 (\u001b[38;5;33mConv1D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m6,208\u001b[0m │\n",
487
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
488
+ "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
489
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
490
+ "│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
491
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
492
+ "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m16,512\u001b[0m │\n",
493
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
494
+ "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m) │ \u001b[38;5;34m258\u001b[0m │\n",
495
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
496
+ ]
497
+ },
498
+ "metadata": {},
499
+ "output_type": "display_data"
500
+ },
501
+ {
502
+ "data": {
503
+ "text/html": [
504
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">69,320</span> (270.79 KB)\n",
505
+ "</pre>\n"
506
+ ],
507
+ "text/plain": [
508
+ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m69,320\u001b[0m (270.79 KB)\n"
509
+ ]
510
+ },
511
+ "metadata": {},
512
+ "output_type": "display_data"
513
+ },
514
+ {
515
+ "data": {
516
+ "text/html": [
517
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">23,106</span> (90.26 KB)\n",
518
+ "</pre>\n"
519
+ ],
520
+ "text/plain": [
521
+ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m23,106\u001b[0m (90.26 KB)\n"
522
+ ]
523
+ },
524
+ "metadata": {},
525
+ "output_type": "display_data"
526
+ },
527
+ {
528
+ "data": {
529
+ "text/html": [
530
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
531
+ "</pre>\n"
532
+ ],
533
+ "text/plain": [
534
+ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
535
+ ]
536
+ },
537
+ "metadata": {},
538
+ "output_type": "display_data"
539
+ },
540
+ {
541
+ "data": {
542
+ "text/html": [
543
+ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Optimizer params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">46,214</span> (180.53 KB)\n",
544
+ "</pre>\n"
545
+ ],
546
+ "text/plain": [
547
+ "\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m46,214\u001b[0m (180.53 KB)\n"
548
+ ]
549
+ },
550
+ "metadata": {},
551
+ "output_type": "display_data"
552
+ },
553
+ {
554
+ "data": {
555
+ "image/png": "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EZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSGNwQERGRSWFwQ0RERCaFwQ0RERGZFAY3REREZFIY3BAREZFJYXBDREREJoXBDREREZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSGNwQERGRSWFwQ0RERCaFwQ0RERGZFAY3REREZFIY3BAREZFJYXBDREREJoXBDREREZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSGNwQERGRSWFwQ0RERCaFwQ0RERGZFAY3REREZFIY3BAREZFJYXBDREREJoXBDREREZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSqkRws3z5cvj5+cHa2hrBwcGIiIgodt1Vq1ahc+fOcHJygpOTE0JDQ0tcn4iIiP5bjB7cbNq0CTNmzMD8+fNx5swZBAYGonfv3khISChy/QMHDmDo0KHYv38/wsPD4evri2eeeQb37t2r5JITERFRVSSTJEkyZgGCg4PRtm1bLFu2DACgVCrh6+uLKVOmYNasWU/dXqFQwMnJCcuWLcPIkSOfun5aWhocHR2RmpoKBweHcpefiIiIKp4+12+j1tzk5ubi9OnTCA0NVS+Ty+UIDQ1FeHh4qfbx+PFj5OXlwdnZucjXc3JykJaWpvMgIiIi02XU4CYpKQkKhQIeHh46yz08PBAXF1eqfcycORPe3t46AZK2xYsXw9HRUf3w9fUtd7mJiIio6jJ6zk15fPrpp9i4cSO2bdsGa2vrIteZPXs2UlNT1Y/Y2NhKLiURERFVJnNjHtzV1RVmZmaIj4/XWR4fHw9PT88St/3iiy/w6aefYu/evWjRokWx61lZWcHKysog5SUiIqKqz6g1N5aWlggKCkJYWJh6mVKpRFhYGEJCQord7rPPPsNHH32EXbt2oU2bNpVRVCIiIqomjFpzAwAzZszAqFGj0KZNG7Rr1w5LlixBZmYmxowZAwAYOXIkfHx8sHjxYgDA//3f/2HevHlYv349/Pz81Lk59vb2sLe3N9r7ICIioqrB6MHN4MGDkZiYiHnz5iEuLg4tW7bErl271EnGMTExkMs1FUwrVqxAbm4uXnrpJZ39zJ8/HwsWLKjMohMREVEVZPRxbiobx7khIiKqfqrN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",
556
+ "text/plain": [
557
+ "<Figure size 640x480 with 1 Axes>"
558
+ ]
559
+ },
560
+ "metadata": {},
561
+ "output_type": "display_data"
562
+ }
563
+ ],
564
+ "source": [
565
+ "model.summary()\n",
566
+ "\n",
567
+ "import matplotlib.pyplot as plt\n",
568
+ "\n",
569
+ "plt.plot(history.history['accuracy'], label='Accuracy')\n",
570
+ "plt.plot(history.history['val_accuracy'], label='Validation Accuracy')\n",
571
+ "plt.xlabel('Epoch')\n",
572
+ "plt.ylabel('Accuracy')\n",
573
+ "plt.ylim([0, 1])\n",
574
+ "plt.legend(loc='lower right')\n",
575
+ "plt.show()"
576
+ ]
577
+ },
578
+ {
579
+ "cell_type": "code",
580
+ "execution_count": 10,
581
+ "id": "9c29a12b-9fda-49b3-bd85-fa699e1f61a2",
582
+ "metadata": {},
583
+ "outputs": [],
584
+ "source": [
585
+ "model.save('patient_outcome_classifier.keras')"
586
+ ]
587
+ }
588
+ ],
589
+ "metadata": {
590
+ "kernelspec": {
591
+ "display_name": "Python 3 (ipykernel)",
592
+ "language": "python",
593
+ "name": "python3"
594
+ },
595
+ "language_info": {
596
+ "codemirror_mode": {
597
+ "name": "ipython",
598
+ "version": 3
599
+ },
600
+ "file_extension": ".py",
601
+ "mimetype": "text/x-python",
602
+ "name": "python",
603
+ "nbconvert_exporter": "python",
604
+ "pygments_lexer": "ipython3",
605
+ "version": "3.12.3"
606
+ }
607
+ },
608
+ "nbformat": 4,
609
+ "nbformat_minor": 5
610
+ }
examples.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ normal = [
2
+ "49719_AV.wav",
3
+ "Child",
4
+ "Male",
5
+ 102.0,
6
+ 17.5,
7
+ False
8
+ ]
9
+ abnormal = [
10
+ "49719_AV.wav",
11
+ "Child",
12
+ "Male",
13
+ 102.0,
14
+ 17.5,
15
+ False
16
+ ]
flagged/Recording/e02094dd02e255b311d4/13918_TV_present.wav ADDED
Binary file (52.8 kB). View file
 
flagged/log.csv ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ Recording,Age,Sex,Height,Weight,Pregnant,output,flag,username,timestamp
2
+ flagged/Recording/e02094dd02e255b311d4/13918_TV_present.wav,Adolescent,Male,98.0,38.1,false,"{""label"": null, ""confidences"": null}",,,2024-05-03 04:49:06.732213
gradio_cached_examples/18/log.csv ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ output,flag,username,timestamp
2
+ "{""label"": ""Abnormal"", ""confidences"": [{""label"": ""Abnormal"", ""confidence"": 1.0}, {""label"": ""Normal"", ""confidence"": 0.0}]}",,,2024-05-03 05:03:16.773406
patient_outcome_classifier.keras CHANGED
Binary files a/patient_outcome_classifier.keras and b/patient_outcome_classifier.keras differ
 
pyproject.toml ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "heartmurmurclassification"
3
+ version = "0.1.0"
4
+ description = "Add your description here"
5
+ authors = [
6
+ { name = "Rohit Krishnan", email = "[email protected]" }
7
+ ]
8
+ dependencies = [
9
+ "pandas>=2.2.2",
10
+ "torch>=2.3.0",
11
+ "torchaudio>=2.3.0",
12
+ "pillow>=10.3.0",
13
+ "tensorflow>=2.16.1",
14
+ "tf-keras>=2.16.0",
15
+ "transformers[torch]>=4.40.1",
16
+ "gradio>=4.28.3",
17
+ "jupyterlab>=4.1.8",
18
+ "scikit-learn>=1.4.2",
19
+ "imblearn>=0.0",
20
+ ]
21
+ readme = "README.md"
22
+ requires-python = ">= 3.8"
23
+
24
+ [tool.rye]
25
+ managed = true
26
+ virtual = true
27
+ dev-dependencies = []
requirements-dev.lock ADDED
@@ -0,0 +1,520 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # generated by rye
2
+ # use `rye lock` or `rye sync` to update this lockfile
3
+ #
4
+ # last locked with the following flags:
5
+ # pre: false
6
+ # features: []
7
+ # all-features: false
8
+ # with-sources: false
9
+
10
+ absl-py==2.1.0
11
+ # via keras
12
+ # via tensorboard
13
+ # via tensorflow
14
+ accelerate==0.29.3
15
+ # via transformers
16
+ aiofiles==23.2.1
17
+ # via gradio
18
+ altair==5.3.0
19
+ # via gradio
20
+ annotated-types==0.6.0
21
+ # via pydantic
22
+ anyio==4.3.0
23
+ # via httpx
24
+ # via jupyter-server
25
+ # via starlette
26
+ # via watchfiles
27
+ appnope==0.1.4
28
+ # via ipykernel
29
+ argon2-cffi==23.1.0
30
+ # via jupyter-server
31
+ argon2-cffi-bindings==21.2.0
32
+ # via argon2-cffi
33
+ arrow==1.3.0
34
+ # via isoduration
35
+ asttokens==2.4.1
36
+ # via stack-data
37
+ astunparse==1.6.3
38
+ # via tensorflow
39
+ async-lru==2.0.4
40
+ # via jupyterlab
41
+ attrs==23.2.0
42
+ # via jsonschema
43
+ # via referencing
44
+ babel==2.14.0
45
+ # via jupyterlab-server
46
+ beautifulsoup4==4.12.3
47
+ # via nbconvert
48
+ bleach==6.1.0
49
+ # via nbconvert
50
+ certifi==2024.2.2
51
+ # via httpcore
52
+ # via httpx
53
+ # via requests
54
+ cffi==1.16.0
55
+ # via argon2-cffi-bindings
56
+ charset-normalizer==3.3.2
57
+ # via requests
58
+ click==8.1.7
59
+ # via typer
60
+ # via uvicorn
61
+ comm==0.2.2
62
+ # via ipykernel
63
+ contourpy==1.2.1
64
+ # via matplotlib
65
+ cycler==0.12.1
66
+ # via matplotlib
67
+ debugpy==1.8.1
68
+ # via ipykernel
69
+ decorator==5.1.1
70
+ # via ipython
71
+ defusedxml==0.7.1
72
+ # via nbconvert
73
+ dnspython==2.6.1
74
+ # via email-validator
75
+ email-validator==2.1.1
76
+ # via fastapi
77
+ executing==2.0.1
78
+ # via stack-data
79
+ fastapi==0.111.0
80
+ # via fastapi-cli
81
+ # via gradio
82
+ fastapi-cli==0.0.2
83
+ # via fastapi
84
+ fastjsonschema==2.19.1
85
+ # via nbformat
86
+ ffmpy==0.3.2
87
+ # via gradio
88
+ filelock==3.14.0
89
+ # via huggingface-hub
90
+ # via torch
91
+ # via transformers
92
+ flatbuffers==24.3.25
93
+ # via tensorflow
94
+ fonttools==4.51.0
95
+ # via matplotlib
96
+ fqdn==1.5.1
97
+ # via jsonschema
98
+ fsspec==2024.3.1
99
+ # via gradio-client
100
+ # via huggingface-hub
101
+ # via torch
102
+ gast==0.5.4
103
+ # via tensorflow
104
+ google-pasta==0.2.0
105
+ # via tensorflow
106
+ gradio==4.28.3
107
+ gradio-client==0.16.0
108
+ # via gradio
109
+ grpcio==1.63.0
110
+ # via tensorboard
111
+ # via tensorflow
112
+ h11==0.14.0
113
+ # via httpcore
114
+ # via uvicorn
115
+ h5py==3.11.0
116
+ # via keras
117
+ # via tensorflow
118
+ httpcore==1.0.5
119
+ # via httpx
120
+ httptools==0.6.1
121
+ # via uvicorn
122
+ httpx==0.27.0
123
+ # via fastapi
124
+ # via gradio
125
+ # via gradio-client
126
+ # via jupyterlab
127
+ huggingface-hub==0.23.0
128
+ # via accelerate
129
+ # via gradio
130
+ # via gradio-client
131
+ # via tokenizers
132
+ # via transformers
133
+ idna==3.7
134
+ # via anyio
135
+ # via email-validator
136
+ # via httpx
137
+ # via jsonschema
138
+ # via requests
139
+ imbalanced-learn==0.12.2
140
+ # via imblearn
141
+ imblearn==0.0
142
+ importlib-resources==6.4.0
143
+ # via gradio
144
+ ipykernel==6.29.4
145
+ # via jupyterlab
146
+ ipython==8.24.0
147
+ # via ipykernel
148
+ isoduration==20.11.0
149
+ # via jsonschema
150
+ jedi==0.19.1
151
+ # via ipython
152
+ jinja2==3.1.3
153
+ # via altair
154
+ # via fastapi
155
+ # via gradio
156
+ # via jupyter-server
157
+ # via jupyterlab
158
+ # via jupyterlab-server
159
+ # via nbconvert
160
+ # via torch
161
+ joblib==1.4.2
162
+ # via imbalanced-learn
163
+ # via scikit-learn
164
+ json5==0.9.25
165
+ # via jupyterlab-server
166
+ jsonpointer==2.4
167
+ # via jsonschema
168
+ jsonschema==4.22.0
169
+ # via altair
170
+ # via jupyter-events
171
+ # via jupyterlab-server
172
+ # via nbformat
173
+ jsonschema-specifications==2023.12.1
174
+ # via jsonschema
175
+ jupyter-client==8.6.1
176
+ # via ipykernel
177
+ # via jupyter-server
178
+ # via nbclient
179
+ jupyter-core==5.7.2
180
+ # via ipykernel
181
+ # via jupyter-client
182
+ # via jupyter-server
183
+ # via jupyterlab
184
+ # via nbclient
185
+ # via nbconvert
186
+ # via nbformat
187
+ jupyter-events==0.10.0
188
+ # via jupyter-server
189
+ jupyter-lsp==2.2.5
190
+ # via jupyterlab
191
+ jupyter-server==2.14.0
192
+ # via jupyter-lsp
193
+ # via jupyterlab
194
+ # via jupyterlab-server
195
+ # via notebook-shim
196
+ jupyter-server-terminals==0.5.3
197
+ # via jupyter-server
198
+ jupyterlab==4.1.8
199
+ jupyterlab-pygments==0.3.0
200
+ # via nbconvert
201
+ jupyterlab-server==2.27.1
202
+ # via jupyterlab
203
+ keras==3.3.3
204
+ # via tensorflow
205
+ kiwisolver==1.4.5
206
+ # via matplotlib
207
+ libclang==18.1.1
208
+ # via tensorflow
209
+ markdown==3.6
210
+ # via tensorboard
211
+ markdown-it-py==3.0.0
212
+ # via rich
213
+ markupsafe==2.1.5
214
+ # via gradio
215
+ # via jinja2
216
+ # via nbconvert
217
+ # via werkzeug
218
+ matplotlib==3.8.4
219
+ # via gradio
220
+ matplotlib-inline==0.1.7
221
+ # via ipykernel
222
+ # via ipython
223
+ mdurl==0.1.2
224
+ # via markdown-it-py
225
+ mistune==3.0.2
226
+ # via nbconvert
227
+ ml-dtypes==0.3.2
228
+ # via keras
229
+ # via tensorflow
230
+ mpmath==1.3.0
231
+ # via sympy
232
+ namex==0.0.8
233
+ # via keras
234
+ nbclient==0.10.0
235
+ # via nbconvert
236
+ nbconvert==7.16.4
237
+ # via jupyter-server
238
+ nbformat==5.10.4
239
+ # via jupyter-server
240
+ # via nbclient
241
+ # via nbconvert
242
+ nest-asyncio==1.6.0
243
+ # via ipykernel
244
+ networkx==3.3
245
+ # via torch
246
+ notebook-shim==0.2.4
247
+ # via jupyterlab
248
+ numpy==1.26.4
249
+ # via accelerate
250
+ # via altair
251
+ # via contourpy
252
+ # via gradio
253
+ # via h5py
254
+ # via imbalanced-learn
255
+ # via keras
256
+ # via matplotlib
257
+ # via ml-dtypes
258
+ # via opt-einsum
259
+ # via pandas
260
+ # via scikit-learn
261
+ # via scipy
262
+ # via tensorboard
263
+ # via tensorflow
264
+ # via transformers
265
+ opt-einsum==3.3.0
266
+ # via tensorflow
267
+ optree==0.11.0
268
+ # via keras
269
+ orjson==3.10.2
270
+ # via fastapi
271
+ # via gradio
272
+ overrides==7.7.0
273
+ # via jupyter-server
274
+ packaging==24.0
275
+ # via accelerate
276
+ # via altair
277
+ # via gradio
278
+ # via gradio-client
279
+ # via huggingface-hub
280
+ # via ipykernel
281
+ # via jupyter-server
282
+ # via jupyterlab
283
+ # via jupyterlab-server
284
+ # via matplotlib
285
+ # via nbconvert
286
+ # via tensorflow
287
+ # via transformers
288
+ pandas==2.2.2
289
+ # via altair
290
+ # via gradio
291
+ pandocfilters==1.5.1
292
+ # via nbconvert
293
+ parso==0.8.4
294
+ # via jedi
295
+ pexpect==4.9.0
296
+ # via ipython
297
+ pillow==10.3.0
298
+ # via gradio
299
+ # via matplotlib
300
+ platformdirs==4.2.1
301
+ # via jupyter-core
302
+ prometheus-client==0.20.0
303
+ # via jupyter-server
304
+ prompt-toolkit==3.0.43
305
+ # via ipython
306
+ protobuf==4.25.3
307
+ # via tensorboard
308
+ # via tensorflow
309
+ psutil==5.9.8
310
+ # via accelerate
311
+ # via ipykernel
312
+ ptyprocess==0.7.0
313
+ # via pexpect
314
+ # via terminado
315
+ pure-eval==0.2.2
316
+ # via stack-data
317
+ pycparser==2.22
318
+ # via cffi
319
+ pydantic==2.7.1
320
+ # via fastapi
321
+ # via gradio
322
+ pydantic-core==2.18.2
323
+ # via pydantic
324
+ pydub==0.25.1
325
+ # via gradio
326
+ pygments==2.17.2
327
+ # via ipython
328
+ # via nbconvert
329
+ # via rich
330
+ pyparsing==3.1.2
331
+ # via matplotlib
332
+ python-dateutil==2.9.0.post0
333
+ # via arrow
334
+ # via jupyter-client
335
+ # via matplotlib
336
+ # via pandas
337
+ python-dotenv==1.0.1
338
+ # via uvicorn
339
+ python-json-logger==2.0.7
340
+ # via jupyter-events
341
+ python-multipart==0.0.9
342
+ # via fastapi
343
+ # via gradio
344
+ pytz==2024.1
345
+ # via pandas
346
+ pyyaml==6.0.1
347
+ # via accelerate
348
+ # via gradio
349
+ # via huggingface-hub
350
+ # via jupyter-events
351
+ # via transformers
352
+ # via uvicorn
353
+ pyzmq==26.0.3
354
+ # via ipykernel
355
+ # via jupyter-client
356
+ # via jupyter-server
357
+ referencing==0.35.1
358
+ # via jsonschema
359
+ # via jsonschema-specifications
360
+ # via jupyter-events
361
+ regex==2024.4.28
362
+ # via transformers
363
+ requests==2.31.0
364
+ # via huggingface-hub
365
+ # via jupyterlab-server
366
+ # via tensorflow
367
+ # via transformers
368
+ rfc3339-validator==0.1.4
369
+ # via jsonschema
370
+ # via jupyter-events
371
+ rfc3986-validator==0.1.1
372
+ # via jsonschema
373
+ # via jupyter-events
374
+ rich==13.7.1
375
+ # via keras
376
+ # via typer
377
+ rpds-py==0.18.0
378
+ # via jsonschema
379
+ # via referencing
380
+ ruff==0.4.2
381
+ # via gradio
382
+ safetensors==0.4.3
383
+ # via accelerate
384
+ # via transformers
385
+ scikit-learn==1.4.2
386
+ # via imbalanced-learn
387
+ scipy==1.13.0
388
+ # via imbalanced-learn
389
+ # via scikit-learn
390
+ semantic-version==2.10.0
391
+ # via gradio
392
+ send2trash==1.8.3
393
+ # via jupyter-server
394
+ setuptools==69.5.1
395
+ # via tensorboard
396
+ # via tensorflow
397
+ shellingham==1.5.4
398
+ # via typer
399
+ six==1.16.0
400
+ # via asttokens
401
+ # via astunparse
402
+ # via bleach
403
+ # via google-pasta
404
+ # via python-dateutil
405
+ # via rfc3339-validator
406
+ # via tensorboard
407
+ # via tensorflow
408
+ sniffio==1.3.1
409
+ # via anyio
410
+ # via httpx
411
+ soupsieve==2.5
412
+ # via beautifulsoup4
413
+ stack-data==0.6.3
414
+ # via ipython
415
+ starlette==0.37.2
416
+ # via fastapi
417
+ sympy==1.12
418
+ # via torch
419
+ tensorboard==2.16.2
420
+ # via tensorflow
421
+ tensorboard-data-server==0.7.2
422
+ # via tensorboard
423
+ tensorflow==2.16.1
424
+ # via tf-keras
425
+ termcolor==2.4.0
426
+ # via tensorflow
427
+ terminado==0.18.1
428
+ # via jupyter-server
429
+ # via jupyter-server-terminals
430
+ tf-keras==2.16.0
431
+ threadpoolctl==3.5.0
432
+ # via imbalanced-learn
433
+ # via scikit-learn
434
+ tinycss2==1.3.0
435
+ # via nbconvert
436
+ tokenizers==0.19.1
437
+ # via transformers
438
+ tomlkit==0.12.0
439
+ # via gradio
440
+ toolz==0.12.1
441
+ # via altair
442
+ torch==2.3.0
443
+ # via accelerate
444
+ # via torchaudio
445
+ # via transformers
446
+ torchaudio==2.3.0
447
+ tornado==6.4
448
+ # via ipykernel
449
+ # via jupyter-client
450
+ # via jupyter-server
451
+ # via jupyterlab
452
+ # via terminado
453
+ tqdm==4.66.4
454
+ # via huggingface-hub
455
+ # via transformers
456
+ traitlets==5.14.3
457
+ # via comm
458
+ # via ipykernel
459
+ # via ipython
460
+ # via jupyter-client
461
+ # via jupyter-core
462
+ # via jupyter-events
463
+ # via jupyter-server
464
+ # via jupyterlab
465
+ # via matplotlib-inline
466
+ # via nbclient
467
+ # via nbconvert
468
+ # via nbformat
469
+ transformers==4.40.1
470
+ typer==0.12.3
471
+ # via fastapi-cli
472
+ # via gradio
473
+ types-python-dateutil==2.9.0.20240316
474
+ # via arrow
475
+ typing-extensions==4.11.0
476
+ # via fastapi
477
+ # via gradio
478
+ # via gradio-client
479
+ # via huggingface-hub
480
+ # via optree
481
+ # via pydantic
482
+ # via pydantic-core
483
+ # via tensorflow
484
+ # via torch
485
+ # via typer
486
+ tzdata==2024.1
487
+ # via pandas
488
+ ujson==5.9.0
489
+ # via fastapi
490
+ uri-template==1.3.0
491
+ # via jsonschema
492
+ urllib3==2.2.1
493
+ # via gradio
494
+ # via requests
495
+ uvicorn==0.29.0
496
+ # via fastapi
497
+ # via fastapi-cli
498
+ # via gradio
499
+ uvloop==0.19.0
500
+ # via uvicorn
501
+ watchfiles==0.21.0
502
+ # via uvicorn
503
+ wcwidth==0.2.13
504
+ # via prompt-toolkit
505
+ webcolors==1.13
506
+ # via jsonschema
507
+ webencodings==0.5.1
508
+ # via bleach
509
+ # via tinycss2
510
+ websocket-client==1.8.0
511
+ # via jupyter-server
512
+ websockets==11.0.3
513
+ # via gradio-client
514
+ # via uvicorn
515
+ werkzeug==3.0.2
516
+ # via tensorboard
517
+ wheel==0.43.0
518
+ # via astunparse
519
+ wrapt==1.16.0
520
+ # via tensorflow
requirements.lock ADDED
@@ -0,0 +1,520 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # generated by rye
2
+ # use `rye lock` or `rye sync` to update this lockfile
3
+ #
4
+ # last locked with the following flags:
5
+ # pre: false
6
+ # features: []
7
+ # all-features: false
8
+ # with-sources: false
9
+
10
+ absl-py==2.1.0
11
+ # via keras
12
+ # via tensorboard
13
+ # via tensorflow
14
+ accelerate==0.29.3
15
+ # via transformers
16
+ aiofiles==23.2.1
17
+ # via gradio
18
+ altair==5.3.0
19
+ # via gradio
20
+ annotated-types==0.6.0
21
+ # via pydantic
22
+ anyio==4.3.0
23
+ # via httpx
24
+ # via jupyter-server
25
+ # via starlette
26
+ # via watchfiles
27
+ appnope==0.1.4
28
+ # via ipykernel
29
+ argon2-cffi==23.1.0
30
+ # via jupyter-server
31
+ argon2-cffi-bindings==21.2.0
32
+ # via argon2-cffi
33
+ arrow==1.3.0
34
+ # via isoduration
35
+ asttokens==2.4.1
36
+ # via stack-data
37
+ astunparse==1.6.3
38
+ # via tensorflow
39
+ async-lru==2.0.4
40
+ # via jupyterlab
41
+ attrs==23.2.0
42
+ # via jsonschema
43
+ # via referencing
44
+ babel==2.14.0
45
+ # via jupyterlab-server
46
+ beautifulsoup4==4.12.3
47
+ # via nbconvert
48
+ bleach==6.1.0
49
+ # via nbconvert
50
+ certifi==2024.2.2
51
+ # via httpcore
52
+ # via httpx
53
+ # via requests
54
+ cffi==1.16.0
55
+ # via argon2-cffi-bindings
56
+ charset-normalizer==3.3.2
57
+ # via requests
58
+ click==8.1.7
59
+ # via typer
60
+ # via uvicorn
61
+ comm==0.2.2
62
+ # via ipykernel
63
+ contourpy==1.2.1
64
+ # via matplotlib
65
+ cycler==0.12.1
66
+ # via matplotlib
67
+ debugpy==1.8.1
68
+ # via ipykernel
69
+ decorator==5.1.1
70
+ # via ipython
71
+ defusedxml==0.7.1
72
+ # via nbconvert
73
+ dnspython==2.6.1
74
+ # via email-validator
75
+ email-validator==2.1.1
76
+ # via fastapi
77
+ executing==2.0.1
78
+ # via stack-data
79
+ fastapi==0.111.0
80
+ # via fastapi-cli
81
+ # via gradio
82
+ fastapi-cli==0.0.2
83
+ # via fastapi
84
+ fastjsonschema==2.19.1
85
+ # via nbformat
86
+ ffmpy==0.3.2
87
+ # via gradio
88
+ filelock==3.14.0
89
+ # via huggingface-hub
90
+ # via torch
91
+ # via transformers
92
+ flatbuffers==24.3.25
93
+ # via tensorflow
94
+ fonttools==4.51.0
95
+ # via matplotlib
96
+ fqdn==1.5.1
97
+ # via jsonschema
98
+ fsspec==2024.3.1
99
+ # via gradio-client
100
+ # via huggingface-hub
101
+ # via torch
102
+ gast==0.5.4
103
+ # via tensorflow
104
+ google-pasta==0.2.0
105
+ # via tensorflow
106
+ gradio==4.28.3
107
+ gradio-client==0.16.0
108
+ # via gradio
109
+ grpcio==1.63.0
110
+ # via tensorboard
111
+ # via tensorflow
112
+ h11==0.14.0
113
+ # via httpcore
114
+ # via uvicorn
115
+ h5py==3.11.0
116
+ # via keras
117
+ # via tensorflow
118
+ httpcore==1.0.5
119
+ # via httpx
120
+ httptools==0.6.1
121
+ # via uvicorn
122
+ httpx==0.27.0
123
+ # via fastapi
124
+ # via gradio
125
+ # via gradio-client
126
+ # via jupyterlab
127
+ huggingface-hub==0.23.0
128
+ # via accelerate
129
+ # via gradio
130
+ # via gradio-client
131
+ # via tokenizers
132
+ # via transformers
133
+ idna==3.7
134
+ # via anyio
135
+ # via email-validator
136
+ # via httpx
137
+ # via jsonschema
138
+ # via requests
139
+ imbalanced-learn==0.12.2
140
+ # via imblearn
141
+ imblearn==0.0
142
+ importlib-resources==6.4.0
143
+ # via gradio
144
+ ipykernel==6.29.4
145
+ # via jupyterlab
146
+ ipython==8.24.0
147
+ # via ipykernel
148
+ isoduration==20.11.0
149
+ # via jsonschema
150
+ jedi==0.19.1
151
+ # via ipython
152
+ jinja2==3.1.3
153
+ # via altair
154
+ # via fastapi
155
+ # via gradio
156
+ # via jupyter-server
157
+ # via jupyterlab
158
+ # via jupyterlab-server
159
+ # via nbconvert
160
+ # via torch
161
+ joblib==1.4.2
162
+ # via imbalanced-learn
163
+ # via scikit-learn
164
+ json5==0.9.25
165
+ # via jupyterlab-server
166
+ jsonpointer==2.4
167
+ # via jsonschema
168
+ jsonschema==4.22.0
169
+ # via altair
170
+ # via jupyter-events
171
+ # via jupyterlab-server
172
+ # via nbformat
173
+ jsonschema-specifications==2023.12.1
174
+ # via jsonschema
175
+ jupyter-client==8.6.1
176
+ # via ipykernel
177
+ # via jupyter-server
178
+ # via nbclient
179
+ jupyter-core==5.7.2
180
+ # via ipykernel
181
+ # via jupyter-client
182
+ # via jupyter-server
183
+ # via jupyterlab
184
+ # via nbclient
185
+ # via nbconvert
186
+ # via nbformat
187
+ jupyter-events==0.10.0
188
+ # via jupyter-server
189
+ jupyter-lsp==2.2.5
190
+ # via jupyterlab
191
+ jupyter-server==2.14.0
192
+ # via jupyter-lsp
193
+ # via jupyterlab
194
+ # via jupyterlab-server
195
+ # via notebook-shim
196
+ jupyter-server-terminals==0.5.3
197
+ # via jupyter-server
198
+ jupyterlab==4.1.8
199
+ jupyterlab-pygments==0.3.0
200
+ # via nbconvert
201
+ jupyterlab-server==2.27.1
202
+ # via jupyterlab
203
+ keras==3.3.3
204
+ # via tensorflow
205
+ kiwisolver==1.4.5
206
+ # via matplotlib
207
+ libclang==18.1.1
208
+ # via tensorflow
209
+ markdown==3.6
210
+ # via tensorboard
211
+ markdown-it-py==3.0.0
212
+ # via rich
213
+ markupsafe==2.1.5
214
+ # via gradio
215
+ # via jinja2
216
+ # via nbconvert
217
+ # via werkzeug
218
+ matplotlib==3.8.4
219
+ # via gradio
220
+ matplotlib-inline==0.1.7
221
+ # via ipykernel
222
+ # via ipython
223
+ mdurl==0.1.2
224
+ # via markdown-it-py
225
+ mistune==3.0.2
226
+ # via nbconvert
227
+ ml-dtypes==0.3.2
228
+ # via keras
229
+ # via tensorflow
230
+ mpmath==1.3.0
231
+ # via sympy
232
+ namex==0.0.8
233
+ # via keras
234
+ nbclient==0.10.0
235
+ # via nbconvert
236
+ nbconvert==7.16.4
237
+ # via jupyter-server
238
+ nbformat==5.10.4
239
+ # via jupyter-server
240
+ # via nbclient
241
+ # via nbconvert
242
+ nest-asyncio==1.6.0
243
+ # via ipykernel
244
+ networkx==3.3
245
+ # via torch
246
+ notebook-shim==0.2.4
247
+ # via jupyterlab
248
+ numpy==1.26.4
249
+ # via accelerate
250
+ # via altair
251
+ # via contourpy
252
+ # via gradio
253
+ # via h5py
254
+ # via imbalanced-learn
255
+ # via keras
256
+ # via matplotlib
257
+ # via ml-dtypes
258
+ # via opt-einsum
259
+ # via pandas
260
+ # via scikit-learn
261
+ # via scipy
262
+ # via tensorboard
263
+ # via tensorflow
264
+ # via transformers
265
+ opt-einsum==3.3.0
266
+ # via tensorflow
267
+ optree==0.11.0
268
+ # via keras
269
+ orjson==3.10.2
270
+ # via fastapi
271
+ # via gradio
272
+ overrides==7.7.0
273
+ # via jupyter-server
274
+ packaging==24.0
275
+ # via accelerate
276
+ # via altair
277
+ # via gradio
278
+ # via gradio-client
279
+ # via huggingface-hub
280
+ # via ipykernel
281
+ # via jupyter-server
282
+ # via jupyterlab
283
+ # via jupyterlab-server
284
+ # via matplotlib
285
+ # via nbconvert
286
+ # via tensorflow
287
+ # via transformers
288
+ pandas==2.2.2
289
+ # via altair
290
+ # via gradio
291
+ pandocfilters==1.5.1
292
+ # via nbconvert
293
+ parso==0.8.4
294
+ # via jedi
295
+ pexpect==4.9.0
296
+ # via ipython
297
+ pillow==10.3.0
298
+ # via gradio
299
+ # via matplotlib
300
+ platformdirs==4.2.1
301
+ # via jupyter-core
302
+ prometheus-client==0.20.0
303
+ # via jupyter-server
304
+ prompt-toolkit==3.0.43
305
+ # via ipython
306
+ protobuf==4.25.3
307
+ # via tensorboard
308
+ # via tensorflow
309
+ psutil==5.9.8
310
+ # via accelerate
311
+ # via ipykernel
312
+ ptyprocess==0.7.0
313
+ # via pexpect
314
+ # via terminado
315
+ pure-eval==0.2.2
316
+ # via stack-data
317
+ pycparser==2.22
318
+ # via cffi
319
+ pydantic==2.7.1
320
+ # via fastapi
321
+ # via gradio
322
+ pydantic-core==2.18.2
323
+ # via pydantic
324
+ pydub==0.25.1
325
+ # via gradio
326
+ pygments==2.17.2
327
+ # via ipython
328
+ # via nbconvert
329
+ # via rich
330
+ pyparsing==3.1.2
331
+ # via matplotlib
332
+ python-dateutil==2.9.0.post0
333
+ # via arrow
334
+ # via jupyter-client
335
+ # via matplotlib
336
+ # via pandas
337
+ python-dotenv==1.0.1
338
+ # via uvicorn
339
+ python-json-logger==2.0.7
340
+ # via jupyter-events
341
+ python-multipart==0.0.9
342
+ # via fastapi
343
+ # via gradio
344
+ pytz==2024.1
345
+ # via pandas
346
+ pyyaml==6.0.1
347
+ # via accelerate
348
+ # via gradio
349
+ # via huggingface-hub
350
+ # via jupyter-events
351
+ # via transformers
352
+ # via uvicorn
353
+ pyzmq==26.0.3
354
+ # via ipykernel
355
+ # via jupyter-client
356
+ # via jupyter-server
357
+ referencing==0.35.1
358
+ # via jsonschema
359
+ # via jsonschema-specifications
360
+ # via jupyter-events
361
+ regex==2024.4.28
362
+ # via transformers
363
+ requests==2.31.0
364
+ # via huggingface-hub
365
+ # via jupyterlab-server
366
+ # via tensorflow
367
+ # via transformers
368
+ rfc3339-validator==0.1.4
369
+ # via jsonschema
370
+ # via jupyter-events
371
+ rfc3986-validator==0.1.1
372
+ # via jsonschema
373
+ # via jupyter-events
374
+ rich==13.7.1
375
+ # via keras
376
+ # via typer
377
+ rpds-py==0.18.0
378
+ # via jsonschema
379
+ # via referencing
380
+ ruff==0.4.2
381
+ # via gradio
382
+ safetensors==0.4.3
383
+ # via accelerate
384
+ # via transformers
385
+ scikit-learn==1.4.2
386
+ # via imbalanced-learn
387
+ scipy==1.13.0
388
+ # via imbalanced-learn
389
+ # via scikit-learn
390
+ semantic-version==2.10.0
391
+ # via gradio
392
+ send2trash==1.8.3
393
+ # via jupyter-server
394
+ setuptools==69.5.1
395
+ # via tensorboard
396
+ # via tensorflow
397
+ shellingham==1.5.4
398
+ # via typer
399
+ six==1.16.0
400
+ # via asttokens
401
+ # via astunparse
402
+ # via bleach
403
+ # via google-pasta
404
+ # via python-dateutil
405
+ # via rfc3339-validator
406
+ # via tensorboard
407
+ # via tensorflow
408
+ sniffio==1.3.1
409
+ # via anyio
410
+ # via httpx
411
+ soupsieve==2.5
412
+ # via beautifulsoup4
413
+ stack-data==0.6.3
414
+ # via ipython
415
+ starlette==0.37.2
416
+ # via fastapi
417
+ sympy==1.12
418
+ # via torch
419
+ tensorboard==2.16.2
420
+ # via tensorflow
421
+ tensorboard-data-server==0.7.2
422
+ # via tensorboard
423
+ tensorflow==2.16.1
424
+ # via tf-keras
425
+ termcolor==2.4.0
426
+ # via tensorflow
427
+ terminado==0.18.1
428
+ # via jupyter-server
429
+ # via jupyter-server-terminals
430
+ tf-keras==2.16.0
431
+ threadpoolctl==3.5.0
432
+ # via imbalanced-learn
433
+ # via scikit-learn
434
+ tinycss2==1.3.0
435
+ # via nbconvert
436
+ tokenizers==0.19.1
437
+ # via transformers
438
+ tomlkit==0.12.0
439
+ # via gradio
440
+ toolz==0.12.1
441
+ # via altair
442
+ torch==2.3.0
443
+ # via accelerate
444
+ # via torchaudio
445
+ # via transformers
446
+ torchaudio==2.3.0
447
+ tornado==6.4
448
+ # via ipykernel
449
+ # via jupyter-client
450
+ # via jupyter-server
451
+ # via jupyterlab
452
+ # via terminado
453
+ tqdm==4.66.4
454
+ # via huggingface-hub
455
+ # via transformers
456
+ traitlets==5.14.3
457
+ # via comm
458
+ # via ipykernel
459
+ # via ipython
460
+ # via jupyter-client
461
+ # via jupyter-core
462
+ # via jupyter-events
463
+ # via jupyter-server
464
+ # via jupyterlab
465
+ # via matplotlib-inline
466
+ # via nbclient
467
+ # via nbconvert
468
+ # via nbformat
469
+ transformers==4.40.1
470
+ typer==0.12.3
471
+ # via fastapi-cli
472
+ # via gradio
473
+ types-python-dateutil==2.9.0.20240316
474
+ # via arrow
475
+ typing-extensions==4.11.0
476
+ # via fastapi
477
+ # via gradio
478
+ # via gradio-client
479
+ # via huggingface-hub
480
+ # via optree
481
+ # via pydantic
482
+ # via pydantic-core
483
+ # via tensorflow
484
+ # via torch
485
+ # via typer
486
+ tzdata==2024.1
487
+ # via pandas
488
+ ujson==5.9.0
489
+ # via fastapi
490
+ uri-template==1.3.0
491
+ # via jsonschema
492
+ urllib3==2.2.1
493
+ # via gradio
494
+ # via requests
495
+ uvicorn==0.29.0
496
+ # via fastapi
497
+ # via fastapi-cli
498
+ # via gradio
499
+ uvloop==0.19.0
500
+ # via uvicorn
501
+ watchfiles==0.21.0
502
+ # via uvicorn
503
+ wcwidth==0.2.13
504
+ # via prompt-toolkit
505
+ webcolors==1.13
506
+ # via jsonschema
507
+ webencodings==0.5.1
508
+ # via bleach
509
+ # via tinycss2
510
+ websocket-client==1.8.0
511
+ # via jupyter-server
512
+ websockets==11.0.3
513
+ # via gradio-client
514
+ # via uvicorn
515
+ werkzeug==3.0.2
516
+ # via tensorboard
517
+ wheel==0.43.0
518
+ # via astunparse
519
+ wrapt==1.16.0
520
+ # via tensorflow
requirements.txt CHANGED
@@ -1,9 +1,520 @@
1
- pandas
2
- torch
3
- torchaudio
4
- keras==2.15.0
5
- tensorflow==2.15.1
6
- pillow==7.0.0
7
- tensorflow
8
- tf-keras
9
- transformers[torch]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # generated by rye
2
+ # use `rye lock` or `rye sync` to update this lockfile
3
+ #
4
+ # last locked with the following flags:
5
+ # pre: false
6
+ # features: []
7
+ # all-features: false
8
+ # with-sources: false
9
+
10
+ absl-py==2.1.0
11
+ # via keras
12
+ # via tensorboard
13
+ # via tensorflow
14
+ accelerate==0.29.3
15
+ # via transformers
16
+ aiofiles==23.2.1
17
+ # via gradio
18
+ altair==5.3.0
19
+ # via gradio
20
+ annotated-types==0.6.0
21
+ # via pydantic
22
+ anyio==4.3.0
23
+ # via httpx
24
+ # via jupyter-server
25
+ # via starlette
26
+ # via watchfiles
27
+ appnope==0.1.4
28
+ # via ipykernel
29
+ argon2-cffi==23.1.0
30
+ # via jupyter-server
31
+ argon2-cffi-bindings==21.2.0
32
+ # via argon2-cffi
33
+ arrow==1.3.0
34
+ # via isoduration
35
+ asttokens==2.4.1
36
+ # via stack-data
37
+ astunparse==1.6.3
38
+ # via tensorflow
39
+ async-lru==2.0.4
40
+ # via jupyterlab
41
+ attrs==23.2.0
42
+ # via jsonschema
43
+ # via referencing
44
+ babel==2.14.0
45
+ # via jupyterlab-server
46
+ beautifulsoup4==4.12.3
47
+ # via nbconvert
48
+ bleach==6.1.0
49
+ # via nbconvert
50
+ certifi==2024.2.2
51
+ # via httpcore
52
+ # via httpx
53
+ # via requests
54
+ cffi==1.16.0
55
+ # via argon2-cffi-bindings
56
+ charset-normalizer==3.3.2
57
+ # via requests
58
+ click==8.1.7
59
+ # via typer
60
+ # via uvicorn
61
+ comm==0.2.2
62
+ # via ipykernel
63
+ contourpy==1.2.1
64
+ # via matplotlib
65
+ cycler==0.12.1
66
+ # via matplotlib
67
+ debugpy==1.8.1
68
+ # via ipykernel
69
+ decorator==5.1.1
70
+ # via ipython
71
+ defusedxml==0.7.1
72
+ # via nbconvert
73
+ dnspython==2.6.1
74
+ # via email-validator
75
+ email-validator==2.1.1
76
+ # via fastapi
77
+ executing==2.0.1
78
+ # via stack-data
79
+ fastapi==0.111.0
80
+ # via fastapi-cli
81
+ # via gradio
82
+ fastapi-cli==0.0.2
83
+ # via fastapi
84
+ fastjsonschema==2.19.1
85
+ # via nbformat
86
+ ffmpy==0.3.2
87
+ # via gradio
88
+ filelock==3.14.0
89
+ # via huggingface-hub
90
+ # via torch
91
+ # via transformers
92
+ flatbuffers==24.3.25
93
+ # via tensorflow
94
+ fonttools==4.51.0
95
+ # via matplotlib
96
+ fqdn==1.5.1
97
+ # via jsonschema
98
+ fsspec==2024.3.1
99
+ # via gradio-client
100
+ # via huggingface-hub
101
+ # via torch
102
+ gast==0.5.4
103
+ # via tensorflow
104
+ google-pasta==0.2.0
105
+ # via tensorflow
106
+ gradio==4.28.3
107
+ gradio-client==0.16.0
108
+ # via gradio
109
+ grpcio==1.63.0
110
+ # via tensorboard
111
+ # via tensorflow
112
+ h11==0.14.0
113
+ # via httpcore
114
+ # via uvicorn
115
+ h5py==3.11.0
116
+ # via keras
117
+ # via tensorflow
118
+ httpcore==1.0.5
119
+ # via httpx
120
+ httptools==0.6.1
121
+ # via uvicorn
122
+ httpx==0.27.0
123
+ # via fastapi
124
+ # via gradio
125
+ # via gradio-client
126
+ # via jupyterlab
127
+ huggingface-hub==0.23.0
128
+ # via accelerate
129
+ # via gradio
130
+ # via gradio-client
131
+ # via tokenizers
132
+ # via transformers
133
+ idna==3.7
134
+ # via anyio
135
+ # via email-validator
136
+ # via httpx
137
+ # via jsonschema
138
+ # via requests
139
+ imbalanced-learn==0.12.2
140
+ # via imblearn
141
+ imblearn==0.0
142
+ importlib-resources==6.4.0
143
+ # via gradio
144
+ ipykernel==6.29.4
145
+ # via jupyterlab
146
+ ipython==8.24.0
147
+ # via ipykernel
148
+ isoduration==20.11.0
149
+ # via jsonschema
150
+ jedi==0.19.1
151
+ # via ipython
152
+ jinja2==3.1.3
153
+ # via altair
154
+ # via fastapi
155
+ # via gradio
156
+ # via jupyter-server
157
+ # via jupyterlab
158
+ # via jupyterlab-server
159
+ # via nbconvert
160
+ # via torch
161
+ joblib==1.4.2
162
+ # via imbalanced-learn
163
+ # via scikit-learn
164
+ json5==0.9.25
165
+ # via jupyterlab-server
166
+ jsonpointer==2.4
167
+ # via jsonschema
168
+ jsonschema==4.22.0
169
+ # via altair
170
+ # via jupyter-events
171
+ # via jupyterlab-server
172
+ # via nbformat
173
+ jsonschema-specifications==2023.12.1
174
+ # via jsonschema
175
+ jupyter-client==8.6.1
176
+ # via ipykernel
177
+ # via jupyter-server
178
+ # via nbclient
179
+ jupyter-core==5.7.2
180
+ # via ipykernel
181
+ # via jupyter-client
182
+ # via jupyter-server
183
+ # via jupyterlab
184
+ # via nbclient
185
+ # via nbconvert
186
+ # via nbformat
187
+ jupyter-events==0.10.0
188
+ # via jupyter-server
189
+ jupyter-lsp==2.2.5
190
+ # via jupyterlab
191
+ jupyter-server==2.14.0
192
+ # via jupyter-lsp
193
+ # via jupyterlab
194
+ # via jupyterlab-server
195
+ # via notebook-shim
196
+ jupyter-server-terminals==0.5.3
197
+ # via jupyter-server
198
+ jupyterlab==4.1.8
199
+ jupyterlab-pygments==0.3.0
200
+ # via nbconvert
201
+ jupyterlab-server==2.27.1
202
+ # via jupyterlab
203
+ keras==3.3.3
204
+ # via tensorflow
205
+ kiwisolver==1.4.5
206
+ # via matplotlib
207
+ libclang==18.1.1
208
+ # via tensorflow
209
+ markdown==3.6
210
+ # via tensorboard
211
+ markdown-it-py==3.0.0
212
+ # via rich
213
+ markupsafe==2.1.5
214
+ # via gradio
215
+ # via jinja2
216
+ # via nbconvert
217
+ # via werkzeug
218
+ matplotlib==3.8.4
219
+ # via gradio
220
+ matplotlib-inline==0.1.7
221
+ # via ipykernel
222
+ # via ipython
223
+ mdurl==0.1.2
224
+ # via markdown-it-py
225
+ mistune==3.0.2
226
+ # via nbconvert
227
+ ml-dtypes==0.3.2
228
+ # via keras
229
+ # via tensorflow
230
+ mpmath==1.3.0
231
+ # via sympy
232
+ namex==0.0.8
233
+ # via keras
234
+ nbclient==0.10.0
235
+ # via nbconvert
236
+ nbconvert==7.16.4
237
+ # via jupyter-server
238
+ nbformat==5.10.4
239
+ # via jupyter-server
240
+ # via nbclient
241
+ # via nbconvert
242
+ nest-asyncio==1.6.0
243
+ # via ipykernel
244
+ networkx==3.3
245
+ # via torch
246
+ notebook-shim==0.2.4
247
+ # via jupyterlab
248
+ numpy==1.26.4
249
+ # via accelerate
250
+ # via altair
251
+ # via contourpy
252
+ # via gradio
253
+ # via h5py
254
+ # via imbalanced-learn
255
+ # via keras
256
+ # via matplotlib
257
+ # via ml-dtypes
258
+ # via opt-einsum
259
+ # via pandas
260
+ # via scikit-learn
261
+ # via scipy
262
+ # via tensorboard
263
+ # via tensorflow
264
+ # via transformers
265
+ opt-einsum==3.3.0
266
+ # via tensorflow
267
+ optree==0.11.0
268
+ # via keras
269
+ orjson==3.10.2
270
+ # via fastapi
271
+ # via gradio
272
+ overrides==7.7.0
273
+ # via jupyter-server
274
+ packaging==24.0
275
+ # via accelerate
276
+ # via altair
277
+ # via gradio
278
+ # via gradio-client
279
+ # via huggingface-hub
280
+ # via ipykernel
281
+ # via jupyter-server
282
+ # via jupyterlab
283
+ # via jupyterlab-server
284
+ # via matplotlib
285
+ # via nbconvert
286
+ # via tensorflow
287
+ # via transformers
288
+ pandas==2.2.2
289
+ # via altair
290
+ # via gradio
291
+ pandocfilters==1.5.1
292
+ # via nbconvert
293
+ parso==0.8.4
294
+ # via jedi
295
+ pexpect==4.9.0
296
+ # via ipython
297
+ pillow==10.3.0
298
+ # via gradio
299
+ # via matplotlib
300
+ platformdirs==4.2.1
301
+ # via jupyter-core
302
+ prometheus-client==0.20.0
303
+ # via jupyter-server
304
+ prompt-toolkit==3.0.43
305
+ # via ipython
306
+ protobuf==4.25.3
307
+ # via tensorboard
308
+ # via tensorflow
309
+ psutil==5.9.8
310
+ # via accelerate
311
+ # via ipykernel
312
+ ptyprocess==0.7.0
313
+ # via pexpect
314
+ # via terminado
315
+ pure-eval==0.2.2
316
+ # via stack-data
317
+ pycparser==2.22
318
+ # via cffi
319
+ pydantic==2.7.1
320
+ # via fastapi
321
+ # via gradio
322
+ pydantic-core==2.18.2
323
+ # via pydantic
324
+ pydub==0.25.1
325
+ # via gradio
326
+ pygments==2.17.2
327
+ # via ipython
328
+ # via nbconvert
329
+ # via rich
330
+ pyparsing==3.1.2
331
+ # via matplotlib
332
+ python-dateutil==2.9.0.post0
333
+ # via arrow
334
+ # via jupyter-client
335
+ # via matplotlib
336
+ # via pandas
337
+ python-dotenv==1.0.1
338
+ # via uvicorn
339
+ python-json-logger==2.0.7
340
+ # via jupyter-events
341
+ python-multipart==0.0.9
342
+ # via fastapi
343
+ # via gradio
344
+ pytz==2024.1
345
+ # via pandas
346
+ pyyaml==6.0.1
347
+ # via accelerate
348
+ # via gradio
349
+ # via huggingface-hub
350
+ # via jupyter-events
351
+ # via transformers
352
+ # via uvicorn
353
+ pyzmq==26.0.3
354
+ # via ipykernel
355
+ # via jupyter-client
356
+ # via jupyter-server
357
+ referencing==0.35.1
358
+ # via jsonschema
359
+ # via jsonschema-specifications
360
+ # via jupyter-events
361
+ regex==2024.4.28
362
+ # via transformers
363
+ requests==2.31.0
364
+ # via huggingface-hub
365
+ # via jupyterlab-server
366
+ # via tensorflow
367
+ # via transformers
368
+ rfc3339-validator==0.1.4
369
+ # via jsonschema
370
+ # via jupyter-events
371
+ rfc3986-validator==0.1.1
372
+ # via jsonschema
373
+ # via jupyter-events
374
+ rich==13.7.1
375
+ # via keras
376
+ # via typer
377
+ rpds-py==0.18.0
378
+ # via jsonschema
379
+ # via referencing
380
+ ruff==0.4.2
381
+ # via gradio
382
+ safetensors==0.4.3
383
+ # via accelerate
384
+ # via transformers
385
+ scikit-learn==1.4.2
386
+ # via imbalanced-learn
387
+ scipy==1.13.0
388
+ # via imbalanced-learn
389
+ # via scikit-learn
390
+ semantic-version==2.10.0
391
+ # via gradio
392
+ send2trash==1.8.3
393
+ # via jupyter-server
394
+ setuptools==69.5.1
395
+ # via tensorboard
396
+ # via tensorflow
397
+ shellingham==1.5.4
398
+ # via typer
399
+ six==1.16.0
400
+ # via asttokens
401
+ # via astunparse
402
+ # via bleach
403
+ # via google-pasta
404
+ # via python-dateutil
405
+ # via rfc3339-validator
406
+ # via tensorboard
407
+ # via tensorflow
408
+ sniffio==1.3.1
409
+ # via anyio
410
+ # via httpx
411
+ soupsieve==2.5
412
+ # via beautifulsoup4
413
+ stack-data==0.6.3
414
+ # via ipython
415
+ starlette==0.37.2
416
+ # via fastapi
417
+ sympy==1.12
418
+ # via torch
419
+ tensorboard==2.16.2
420
+ # via tensorflow
421
+ tensorboard-data-server==0.7.2
422
+ # via tensorboard
423
+ tensorflow==2.16.1
424
+ # via tf-keras
425
+ termcolor==2.4.0
426
+ # via tensorflow
427
+ terminado==0.18.1
428
+ # via jupyter-server
429
+ # via jupyter-server-terminals
430
+ tf-keras==2.16.0
431
+ threadpoolctl==3.5.0
432
+ # via imbalanced-learn
433
+ # via scikit-learn
434
+ tinycss2==1.3.0
435
+ # via nbconvert
436
+ tokenizers==0.19.1
437
+ # via transformers
438
+ tomlkit==0.12.0
439
+ # via gradio
440
+ toolz==0.12.1
441
+ # via altair
442
+ torch==2.3.0
443
+ # via accelerate
444
+ # via torchaudio
445
+ # via transformers
446
+ torchaudio==2.3.0
447
+ tornado==6.4
448
+ # via ipykernel
449
+ # via jupyter-client
450
+ # via jupyter-server
451
+ # via jupyterlab
452
+ # via terminado
453
+ tqdm==4.66.4
454
+ # via huggingface-hub
455
+ # via transformers
456
+ traitlets==5.14.3
457
+ # via comm
458
+ # via ipykernel
459
+ # via ipython
460
+ # via jupyter-client
461
+ # via jupyter-core
462
+ # via jupyter-events
463
+ # via jupyter-server
464
+ # via jupyterlab
465
+ # via matplotlib-inline
466
+ # via nbclient
467
+ # via nbconvert
468
+ # via nbformat
469
+ transformers==4.40.1
470
+ typer==0.12.3
471
+ # via fastapi-cli
472
+ # via gradio
473
+ types-python-dateutil==2.9.0.20240316
474
+ # via arrow
475
+ typing-extensions==4.11.0
476
+ # via fastapi
477
+ # via gradio
478
+ # via gradio-client
479
+ # via huggingface-hub
480
+ # via optree
481
+ # via pydantic
482
+ # via pydantic-core
483
+ # via tensorflow
484
+ # via torch
485
+ # via typer
486
+ tzdata==2024.1
487
+ # via pandas
488
+ ujson==5.9.0
489
+ # via fastapi
490
+ uri-template==1.3.0
491
+ # via jsonschema
492
+ urllib3==2.2.1
493
+ # via gradio
494
+ # via requests
495
+ uvicorn==0.29.0
496
+ # via fastapi
497
+ # via fastapi-cli
498
+ # via gradio
499
+ uvloop==0.19.0
500
+ # via uvicorn
501
+ watchfiles==0.21.0
502
+ # via uvicorn
503
+ wcwidth==0.2.13
504
+ # via prompt-toolkit
505
+ webcolors==1.13
506
+ # via jsonschema
507
+ webencodings==0.5.1
508
+ # via bleach
509
+ # via tinycss2
510
+ websocket-client==1.8.0
511
+ # via jupyter-server
512
+ websockets==11.0.3
513
+ # via gradio-client
514
+ # via uvicorn
515
+ werkzeug==3.0.2
516
+ # via tensorboard
517
+ wheel==0.43.0
518
+ # via astunparse
519
+ wrapt==1.16.0
520
+ # via tensorflow
training_data.csv ADDED
The diff for this file is too large to render. See raw diff