Files
INTUIA/Testes/speach recon model.ipynb
T

1058 lines
177 KiB
Plaintext
Raw Normal View History

2026-03-15 13:27:50 +00:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import librosa\n",
"import numpy as np\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"import tensorflow as tf\n",
"from tensorflow.keras.layers import Conv2D\n",
"from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import classification_report\n",
"from tensorflow.keras import layers, models\n",
"from pydub import AudioSegment\n",
"from keras.utils import plot_model\n",
"from tensorflow import keras\n",
"from IPython.display import HTML, display\n",
"from torch.utils.data import DataLoader, Dataset, TensorDataset\n",
"import torch\n",
"import torchaudio\n",
"from transformers import Wav2Vec2Processor, Wav2Vec2Model\n",
"import torch.nn as nn\n",
"import torch.optim as optim\n",
"os.environ[\"CUDA_LAUNCH_BLOCKING\"] = \"1\"\n",
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
"from tensorflow.keras import regularizers\n",
"from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def read_wave(folder_path, max_duration=None):\n",
" audio_data = []\n",
" sample_rates = []\n",
" labels = []\n",
"\n",
" for root, dirs, files in os.walk(folder_path):\n",
" for file in files:\n",
" if file.endswith(\".wav\"):\n",
" file_path = os.path.join(root, file)\n",
" label = os.path.splitext(file)[0] \n",
" try:\n",
" audio, sr = librosa.load(file_path, sr=None, duration=max_duration)\n",
" sample_rates.append(sr)\n",
" audio_data.append(audio)\n",
" labels.append(label)\n",
" except Exception as e:\n",
" print(f\"Error processing file {file}: {str(e)}\")\n",
"\n",
" return audio_data, sample_rates, labels"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"speech_audio,speech_sar,speech_labels = read_wave('C:\\\\Users\\\\garci\\\\OneDrive\\\\Área de Trabalho\\\\Ambiente de trabalho unbunto\\\\Cienciadedados\\\\IPL\\\\Tese\\\\RAVDNESS\\\\Audio\\\\Speech', max_duration=10.0)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"speech_data = pd.DataFrame({'audio':speech_audio,'sample_rate':speech_sar,'label':speech_labels})"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>audio</th>\n",
" <th>sample_rate</th>\n",
" <th>label</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...</td>\n",
" <td>48000</td>\n",
" <td>03-01-01-01-01-01-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>[0.0, 0.0, -3.0517578e-05, 0.0, 0.0, 0.0, 0.0,...</td>\n",
" <td>48000</td>\n",
" <td>03-01-01-01-01-02-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>[3.0517578e-05, 3.0517578e-05, 0.0, 3.0517578e...</td>\n",
" <td>48000</td>\n",
" <td>03-01-01-01-02-01-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>[3.0517578e-05, 3.0517578e-05, 3.0517578e-05, ...</td>\n",
" <td>48000</td>\n",
" <td>03-01-01-01-02-02-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>[3.0517578e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...</td>\n",
" <td>48000</td>\n",
" <td>03-01-02-01-01-01-01</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" audio sample_rate \\\n",
"0 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... 48000 \n",
"1 [0.0, 0.0, -3.0517578e-05, 0.0, 0.0, 0.0, 0.0,... 48000 \n",
"2 [3.0517578e-05, 3.0517578e-05, 0.0, 3.0517578e... 48000 \n",
"3 [3.0517578e-05, 3.0517578e-05, 3.0517578e-05, ... 48000 \n",
"4 [3.0517578e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... 48000 \n",
"\n",
" label \n",
"0 03-01-01-01-01-01-01 \n",
"1 03-01-01-01-01-02-01 \n",
"2 03-01-01-01-02-01-01 \n",
"3 03-01-01-01-02-02-01 \n",
"4 03-01-02-01-01-01-01 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"speech_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"audio_data=speech_data"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"audio_data['modality']= audio_data['label'].str.split('-',expand=True)[0].astype(int)\n",
"audio_data['vocal_channel']= audio_data['label'].str.split('-',expand=True)[1].astype(int)\n",
"audio_data['emotion']= audio_data['label'].str.split('-',expand=True)[2].astype(int)\n",
"audio_data['emotional_intensity'] = audio_data['label'].str.split('-',expand=True)[3].astype(int)\n",
"audio_data['statement']= audio_data['label'].str.split('-',expand=True)[4].astype(int)\n",
"audio_data['repetition']= audio_data['label'].str.split('-',expand=True)[5].astype(int)\n",
"audio_data['actor']= audio_data['label'].str.split('-',expand=True)[6].astype(int)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>audio</th>\n",
" <th>sample_rate</th>\n",
" <th>label</th>\n",
" <th>modality</th>\n",
" <th>vocal_channel</th>\n",
" <th>emotion</th>\n",
" <th>emotional_intensity</th>\n",
" <th>statement</th>\n",
" <th>repetition</th>\n",
" <th>actor</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...</td>\n",
" <td>48000</td>\n",
" <td>03-01-01-01-01-01-01</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>[0.0, 0.0, -3.0517578e-05, 0.0, 0.0, 0.0, 0.0,...</td>\n",
" <td>48000</td>\n",
" <td>03-01-01-01-01-02-01</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>[3.0517578e-05, 3.0517578e-05, 0.0, 3.0517578e...</td>\n",
" <td>48000</td>\n",
" <td>03-01-01-01-02-01-01</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>[3.0517578e-05, 3.0517578e-05, 3.0517578e-05, ...</td>\n",
" <td>48000</td>\n",
" <td>03-01-01-01-02-02-01</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>[3.0517578e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...</td>\n",
" <td>48000</td>\n",
" <td>03-01-02-01-01-01-01</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" audio sample_rate \\\n",
"0 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... 48000 \n",
"1 [0.0, 0.0, -3.0517578e-05, 0.0, 0.0, 0.0, 0.0,... 48000 \n",
"2 [3.0517578e-05, 3.0517578e-05, 0.0, 3.0517578e... 48000 \n",
"3 [3.0517578e-05, 3.0517578e-05, 3.0517578e-05, ... 48000 \n",
"4 [3.0517578e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... 48000 \n",
"\n",
" label modality vocal_channel emotion \\\n",
"0 03-01-01-01-01-01-01 3 1 1 \n",
"1 03-01-01-01-01-02-01 3 1 1 \n",
"2 03-01-01-01-02-01-01 3 1 1 \n",
"3 03-01-01-01-02-02-01 3 1 1 \n",
"4 03-01-02-01-01-01-01 3 1 2 \n",
"\n",
" emotional_intensity statement repetition actor \n",
"0 1 1 1 1 \n",
"1 1 1 2 1 \n",
"2 1 2 1 1 \n",
"3 1 2 2 1 \n",
"4 1 1 1 1 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"audio_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"audio_data.drop(columns=['label'],inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['audio', 'sample_rate', 'modality', 'vocal_channel', 'emotion',\n",
" 'emotional_intensity', 'statement', 'repetition', 'actor'],\n",
" dtype='object')"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"audio_data.columns"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 1440 entries, 0 to 1439\n",
"Data columns (total 9 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 audio 1440 non-null object\n",
" 1 sample_rate 1440 non-null int64 \n",
" 2 modality 1440 non-null int32 \n",
" 3 vocal_channel 1440 non-null int32 \n",
" 4 emotion 1440 non-null int32 \n",
" 5 emotional_intensity 1440 non-null int32 \n",
" 6 statement 1440 non-null int32 \n",
" 7 repetition 1440 non-null int32 \n",
" 8 actor 1440 non-null int32 \n",
"dtypes: int32(7), int64(1), object(1)\n",
"memory usage: 62.0+ KB\n"
]
}
],
"source": [
"audio_data.info()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def pad_audio(audio, desired_length):\n",
" audio_length = len(audio)\n",
" if audio_length < desired_length:\n",
" silence = np.zeros(desired_length - audio_length)\n",
" padded_audio = np.concatenate((audio, silence))\n",
" else:\n",
" padded_audio = audio[:desired_length]\n",
" return padded_audio\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"audio_data['audio'] = audio_data['audio'].apply(lambda x: pad_audio(x, 192000)).tolist()\n",
"audio_data['audio'] = audio_data['audio'].apply(lambda x: np.array(x).astype(float))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"audio_data['audio'] = audio_data['audio'].apply(lambda x: np.concatenate(np.atleast_1d(x)) if np.ndim(x) == 0 else x).tolist()\n",
"audio_data['audio'] = audio_data['audio'].apply(lambda x: np.array(x).astype(float))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>audio</th>\n",
" <th>sample_rate</th>\n",
" <th>modality</th>\n",
" <th>vocal_channel</th>\n",
" <th>emotion</th>\n",
" <th>emotional_intensity</th>\n",
" <th>statement</th>\n",
" <th>repetition</th>\n",
" <th>actor</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...</td>\n",
" <td>48000</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>[0.0, 0.0, -3.0517578125e-05, 0.0, 0.0, 0.0, 0...</td>\n",
" <td>48000</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>[3.0517578125e-05, 3.0517578125e-05, 0.0, 3.05...</td>\n",
" <td>48000</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>[3.0517578125e-05, 3.0517578125e-05, 3.0517578...</td>\n",
" <td>48000</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>[3.0517578125e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
" <td>48000</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" audio sample_rate modality \\\n",
"0 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... 48000 3 \n",
"1 [0.0, 0.0, -3.0517578125e-05, 0.0, 0.0, 0.0, 0... 48000 3 \n",
"2 [3.0517578125e-05, 3.0517578125e-05, 0.0, 3.05... 48000 3 \n",
"3 [3.0517578125e-05, 3.0517578125e-05, 3.0517578... 48000 3 \n",
"4 [3.0517578125e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.... 48000 3 \n",
"\n",
" vocal_channel emotion emotional_intensity statement repetition actor \n",
"0 1 1 1 1 1 1 \n",
"1 1 1 1 1 2 1 \n",
"2 1 1 1 2 1 1 \n",
"3 1 1 1 2 2 1 \n",
"4 1 2 1 1 1 1 "
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"audio_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 800x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"emotion_labels = {\n",
" 1: 'Calm',\n",
" 2: 'Neutral',\n",
" 3: 'happiness',\n",
" 4: 'sadness',\n",
" 5: 'anger',\n",
" 6: 'fear',\n",
" 7: 'Disgust',\n",
" 8: 'surprise'\n",
"}\n",
"\n",
"sns.set(style='whitegrid')\n",
"plt.figure(figsize=(8, 6))\n",
"emotion_counts = audio_data['emotion'].value_counts().sort_index()\n",
"emotion_labels = [emotion_labels[label] for label in emotion_counts.index]\n",
"bars = plt.bar(emotion_labels, emotion_counts, color=['skyblue', 'lightcoral'])\n",
"\n",
"plt.title('Distribution of Emotions')\n",
"plt.xlabel('Emotion')\n",
"plt.ylabel('Count')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>emotion</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1435</th>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1436</th>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1437</th>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1438</th>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1439</th>\n",
" <td>8</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1440 rows × 1 columns</p>\n",
"</div>"
],
"text/plain": [
" emotion\n",
"0 1\n",
"1 1\n",
"2 1\n",
"3 1\n",
"4 2\n",
"... ...\n",
"1435 8\n",
"1436 8\n",
"1437 8\n",
"1438 8\n",
"1439 8\n",
"\n",
"[1440 rows x 1 columns]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame(audio_data['emotion'])\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Treino: 864 amostras (60.00%)\n",
"Validação: 288 amostras (20.00%)\n",
"Teste: 288 amostras (20.00%)\n"
]
}
],
"source": [
"X = np.array(audio_data['audio'])\n",
"Y = np.array(audio_data['emotion'])\n",
"X_normalized = []\n",
"for audio in X:\n",
" audio_normalized = audio / np.max(np.abs(audio))\n",
" X_normalized.append(audio_normalized)\n",
"X = np.array(X_normalized)\n",
"X_train_val, X_test, y_train_val, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)\n",
"X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.25, random_state=42) \n",
"print(f\"Treino: {len(X_train)} amostras ({len(X_train)/len(X):.2%})\")\n",
"print(f\"Validação: {len(X_val)} amostras ({len(X_val)/len(X):.2%})\")\n",
"print(f\"Teste: {len(X_test)} amostras ({len(X_test)/len(X):.2%})\")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Valores únicos nos rótulos de treino: [1 2 3 4 5 6 7 8]\n",
"Valores únicos nos rótulos de validação: [1 2 3 4 5 6 7 8]\n",
"Valores únicos nos rótulos de teste: [1 2 3 4 5 6 7 8]\n"
]
}
],
"source": [
"print(f\"Valores únicos nos rótulos de treino: {np.unique(y_train)}\")\n",
"print(f\"Valores únicos nos rótulos de validação: {np.unique(y_val)}\")\n",
"print(f\"Valores únicos nos rótulos de teste: {np.unique(y_test)}\")\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"8"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(audio_data['emotion'].value_counts())"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"def audio_to_spectrogram(audio, sr=16000, n_mels=400, n_fft=2048, hop_length=512):\n",
" mel_spec = librosa.feature.melspectrogram(y=audio, sr=sr, n_mels=n_mels, n_fft=n_fft, hop_length=hop_length)\n",
" mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max)\n",
" mel_spec_db = librosa.util.fix_length(mel_spec_db, size=480, axis=1)\n",
" return mel_spec_db"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"X_train_spec = np.array([audio_to_spectrogram(x) for x in X_train])\n",
"X_val_spec = np.array([audio_to_spectrogram(x) for x in X_val])\n",
"X_test_spec = np.array([audio_to_spectrogram(x) for x in X_test])\n",
"X_train_spec = np.array([(x - np.min(x)) / (np.max(x) - np.min(x) + 1e-6) for x in X_train_spec])\n",
"X_val_spec = np.array([(x - np.min(x)) / (np.max(x) - np.min(x) + 1e-6) for x in X_val_spec])\n",
"X_test_spec = np.array([(x - np.min(x)) / (np.max(x) - np.min(x) + 1e-6) for x in X_test_spec])\n",
"X_train_spec = X_train_spec[..., np.newaxis]\n",
"X_val_spec = X_val_spec[..., np.newaxis]\n",
"X_test_spec = X_test_spec[..., np.newaxis]\n",
"\n",
"model = models.Sequential([\n",
" layers.Conv2D(32, (3, 3), activation='relu', input_shape=(400, 480, 1)),\n",
" layers.BatchNormalization(), \n",
" layers.MaxPooling2D((2, 2)), \n",
" layers.Conv2D(64, (3, 3), activation='relu'),\n",
" layers.BatchNormalization(),\n",
" layers.MaxPooling2D((2, 2)),\n",
" layers.Conv2D(128, (3, 3), activation='relu'),\n",
" layers.BatchNormalization(),\n",
" layers.MaxPooling2D((2, 2)),\n",
" layers.Conv2D(256, (3, 3), activation='relu'),\n",
" layers.BatchNormalization(),\n",
" layers.MaxPooling2D((2, 2)),\n",
" layers.Flatten(),\n",
" layers.Dense(256, activation='relu', kernel_regularizer=regularizers.l2(0.001)),\n",
" layers.Dropout(0.4), \n",
" layers.Reshape((16, 16)),\n",
" layers.Bidirectional(layers.LSTM(64, return_sequences=True, dropout=0.3, recurrent_dropout=0.2)),\n",
" layers.Bidirectional(layers.LSTM(32, dropout=0.3, recurrent_dropout=0.2)),\n",
" layers.Dense(64, activation='relu'),\n",
" layers.Dense(9, activation='softmax')\n",
"])"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m135s\u001b[0m 2s/step - accuracy: 0.1223 - loss: 2.9732 - val_accuracy: 0.1215 - val_loss: 2.6830 - learning_rate: 0.0010\n",
"Epoch 2/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m119s\u001b[0m 2s/step - accuracy: 0.1171 - loss: 2.6005 - val_accuracy: 0.0938 - val_loss: 2.5034 - learning_rate: 0.0010\n",
"Epoch 3/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m116s\u001b[0m 2s/step - accuracy: 0.1240 - loss: 2.4394 - val_accuracy: 0.1354 - val_loss: 2.2894 - learning_rate: 0.0010\n",
"Epoch 4/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m117s\u001b[0m 2s/step - accuracy: 0.1158 - loss: 2.2760 - val_accuracy: 0.1354 - val_loss: 2.2216 - learning_rate: 0.0010\n",
"Epoch 5/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m117s\u001b[0m 2s/step - accuracy: 0.1461 - loss: 2.1990 - val_accuracy: 0.1389 - val_loss: 2.2154 - learning_rate: 0.0010\n",
"Epoch 6/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m119s\u001b[0m 2s/step - accuracy: 0.1224 - loss: 2.1806 - val_accuracy: 0.1597 - val_loss: 2.1650 - learning_rate: 0.0010\n",
"Epoch 7/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m118s\u001b[0m 2s/step - accuracy: 0.1345 - loss: 2.1594 - val_accuracy: 0.1215 - val_loss: 2.1643 - learning_rate: 0.0010\n",
"Epoch 8/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m117s\u001b[0m 2s/step - accuracy: 0.1308 - loss: 2.1291 - val_accuracy: 0.1389 - val_loss: 2.1482 - learning_rate: 0.0010\n",
"Epoch 9/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m120s\u001b[0m 2s/step - accuracy: 0.1350 - loss: 2.1427 - val_accuracy: 0.1076 - val_loss: 2.1440 - learning_rate: 0.0010\n",
"Epoch 10/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m120s\u001b[0m 2s/step - accuracy: 0.1304 - loss: 2.1162 - val_accuracy: 0.1215 - val_loss: 2.1535 - learning_rate: 0.0010\n",
"Epoch 11/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m120s\u001b[0m 2s/step - accuracy: 0.1197 - loss: 2.1208 - val_accuracy: 0.1215 - val_loss: 2.1095 - learning_rate: 0.0010\n",
"Epoch 12/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m119s\u001b[0m 2s/step - accuracy: 0.1111 - loss: 2.0991 - val_accuracy: 0.1215 - val_loss: 2.1343 - learning_rate: 0.0010\n",
"Epoch 13/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m118s\u001b[0m 2s/step - accuracy: 0.1385 - loss: 2.1327 - val_accuracy: 0.1215 - val_loss: 2.1699 - learning_rate: 0.0010\n",
"Epoch 14/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m119s\u001b[0m 2s/step - accuracy: 0.1311 - loss: 2.1293 - val_accuracy: 0.1215 - val_loss: 2.1023 - learning_rate: 0.0010\n",
"Epoch 15/40\n",
"\u001b[1m54/54\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m118s\u001b[0m 2s/step - accuracy: 0.0944 - loss: 2.0896 - val_accuracy: 0.1111 - val_loss: 2.1034 - learning_rate: 0.0010\n",
"Epoch 16/40\n",
"\u001b[1m29/54\u001b[0m \u001b[32m━━━━━━━━━━\u001b[0m\u001b[37m━━━━━━━━━━\u001b[0m \u001b[1m54s\u001b[0m 2s/step - accuracy: 0.1553 - loss: 2.0787"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[39], line 5\u001b[0m\n\u001b[0;32m 2\u001b[0m reduce_lr \u001b[38;5;241m=\u001b[39m ReduceLROnPlateau(monitor\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mval_loss\u001b[39m\u001b[38;5;124m'\u001b[39m, factor\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0.3\u001b[39m, patience\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m3\u001b[39m, verbose\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m 3\u001b[0m model\u001b[38;5;241m.\u001b[39mcompile(optimizer\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124madam\u001b[39m\u001b[38;5;124m'\u001b[39m, loss\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msparse_categorical_crossentropy\u001b[39m\u001b[38;5;124m'\u001b[39m, metrics\u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124maccuracy\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m----> 5\u001b[0m history \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mX_train_spec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[0;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43mepochs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m40\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[0;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m16\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[0;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalidation_data\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mX_val_spec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_val\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10\u001b[0m \u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[43mearly_stop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreduce_lr\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\n\u001b[0;32m 11\u001b[0m \u001b[43m)\u001b[49m\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\keras\\src\\utils\\traceback_utils.py:117\u001b[0m, in \u001b[0;36mfilter_traceback.<locals>.error_handler\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 115\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 116\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 117\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 118\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 119\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py:320\u001b[0m, in \u001b[0;36mTensorFlowTrainer.fit\u001b[1;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq)\u001b[0m\n\u001b[0;32m 318\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m step, iterator \u001b[38;5;129;01min\u001b[39;00m epoch_iterator\u001b[38;5;241m.\u001b[39menumerate_epoch():\n\u001b[0;32m 319\u001b[0m callbacks\u001b[38;5;241m.\u001b[39mon_train_batch_begin(step)\n\u001b[1;32m--> 320\u001b[0m logs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain_function\u001b[49m\u001b[43m(\u001b[49m\u001b[43miterator\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 321\u001b[0m callbacks\u001b[38;5;241m.\u001b[39mon_train_batch_end(step, logs)\n\u001b[0;32m 322\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstop_training:\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\tensorflow\\python\\util\\traceback_utils.py:150\u001b[0m, in \u001b[0;36mfilter_traceback.<locals>.error_handler\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 148\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 149\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 150\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 151\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 152\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\polymorphic_function.py:833\u001b[0m, in \u001b[0;36mFunction.__call__\u001b[1;34m(self, *args, **kwds)\u001b[0m\n\u001b[0;32m 830\u001b[0m compiler \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mxla\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jit_compile \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnonXla\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 832\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m OptionalXlaContext(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jit_compile):\n\u001b[1;32m--> 833\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 835\u001b[0m new_tracing_count \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexperimental_get_tracing_count()\n\u001b[0;32m 836\u001b[0m without_tracing \u001b[38;5;241m=\u001b[39m (tracing_count \u001b[38;5;241m==\u001b[39m new_tracing_count)\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\polymorphic_function.py:878\u001b[0m, in \u001b[0;36mFunction._call\u001b[1;34m(self, *args, **kwds)\u001b[0m\n\u001b[0;32m 875\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lock\u001b[38;5;241m.\u001b[39mrelease()\n\u001b[0;32m 876\u001b[0m \u001b[38;5;66;03m# In this case we have not created variables on the first call. So we can\u001b[39;00m\n\u001b[0;32m 877\u001b[0m \u001b[38;5;66;03m# run the first trace but we should fail if variables are created.\u001b[39;00m\n\u001b[1;32m--> 878\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[43mtracing_compilation\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcall_function\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 879\u001b[0m \u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_variable_creation_config\u001b[49m\n\u001b[0;32m 880\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 881\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_created_variables:\n\u001b[0;32m 882\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCreating variables on a non-first call to a function\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 883\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m decorated with tf.function.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\tracing_compilation.py:139\u001b[0m, in \u001b[0;36mcall_function\u001b[1;34m(args, kwargs, tracing_options)\u001b[0m\n\u001b[0;32m 137\u001b[0m bound_args \u001b[38;5;241m=\u001b[39m function\u001b[38;5;241m.\u001b[39mfunction_type\u001b[38;5;241m.\u001b[39mbind(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 138\u001b[0m flat_inputs \u001b[38;5;241m=\u001b[39m function\u001b[38;5;241m.\u001b[39mfunction_type\u001b[38;5;241m.\u001b[39munpack_inputs(bound_args)\n\u001b[1;32m--> 139\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunction\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_flat\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# pylint: disable=protected-access\u001b[39;49;00m\n\u001b[0;32m 140\u001b[0m \u001b[43m \u001b[49m\u001b[43mflat_inputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcaptured_inputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfunction\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcaptured_inputs\u001b[49m\n\u001b[0;32m 141\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\concrete_function.py:1322\u001b[0m, in \u001b[0;36mConcreteFunction._call_flat\u001b[1;34m(self, tensor_inputs, captured_inputs)\u001b[0m\n\u001b[0;32m 1318\u001b[0m possible_gradient_type \u001b[38;5;241m=\u001b[39m gradients_util\u001b[38;5;241m.\u001b[39mPossibleTapeGradientTypes(args)\n\u001b[0;32m 1319\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (possible_gradient_type \u001b[38;5;241m==\u001b[39m gradients_util\u001b[38;5;241m.\u001b[39mPOSSIBLE_GRADIENT_TYPES_NONE\n\u001b[0;32m 1320\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m executing_eagerly):\n\u001b[0;32m 1321\u001b[0m \u001b[38;5;66;03m# No tape is watching; skip to running the function.\u001b[39;00m\n\u001b[1;32m-> 1322\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_inference_function\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcall_preflattened\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1323\u001b[0m forward_backward \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_select_forward_and_backward_functions(\n\u001b[0;32m 1324\u001b[0m args,\n\u001b[0;32m 1325\u001b[0m possible_gradient_type,\n\u001b[0;32m 1326\u001b[0m executing_eagerly)\n\u001b[0;32m 1327\u001b[0m forward_function, args_with_tangents \u001b[38;5;241m=\u001b[39m forward_backward\u001b[38;5;241m.\u001b[39mforward()\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\atomic_function.py:216\u001b[0m, in \u001b[0;36mAtomicFunction.call_preflattened\u001b[1;34m(self, args)\u001b[0m\n\u001b[0;32m 214\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mcall_preflattened\u001b[39m(\u001b[38;5;28mself\u001b[39m, args: Sequence[core\u001b[38;5;241m.\u001b[39mTensor]) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Any:\n\u001b[0;32m 215\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Calls with flattened tensor inputs and returns the structured output.\"\"\"\u001b[39;00m\n\u001b[1;32m--> 216\u001b[0m flat_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcall_flat\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 217\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunction_type\u001b[38;5;241m.\u001b[39mpack_output(flat_outputs)\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\atomic_function.py:251\u001b[0m, in \u001b[0;36mAtomicFunction.call_flat\u001b[1;34m(self, *args)\u001b[0m\n\u001b[0;32m 249\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m record\u001b[38;5;241m.\u001b[39mstop_recording():\n\u001b[0;32m 250\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bound_context\u001b[38;5;241m.\u001b[39mexecuting_eagerly():\n\u001b[1;32m--> 251\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_bound_context\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcall_function\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 252\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 253\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 254\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfunction_type\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mflat_outputs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 255\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 256\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 257\u001b[0m outputs \u001b[38;5;241m=\u001b[39m make_call_op_in_graph(\n\u001b[0;32m 258\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 259\u001b[0m \u001b[38;5;28mlist\u001b[39m(args),\n\u001b[0;32m 260\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bound_context\u001b[38;5;241m.\u001b[39mfunction_call_options\u001b[38;5;241m.\u001b[39mas_attrs(),\n\u001b[0;32m 261\u001b[0m )\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\tensorflow\\python\\eager\\context.py:1683\u001b[0m, in \u001b[0;36mContext.call_function\u001b[1;34m(self, name, tensor_inputs, num_outputs)\u001b[0m\n\u001b[0;32m 1681\u001b[0m cancellation_context \u001b[38;5;241m=\u001b[39m cancellation\u001b[38;5;241m.\u001b[39mcontext()\n\u001b[0;32m 1682\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m cancellation_context \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m-> 1683\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[43mexecute\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1684\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mutf-8\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1685\u001b[0m \u001b[43m \u001b[49m\u001b[43mnum_outputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnum_outputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1686\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtensor_inputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1687\u001b[0m \u001b[43m \u001b[49m\u001b[43mattrs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattrs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1688\u001b[0m \u001b[43m \u001b[49m\u001b[43mctx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1689\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1690\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 1691\u001b[0m outputs \u001b[38;5;241m=\u001b[39m execute\u001b[38;5;241m.\u001b[39mexecute_with_cancellation(\n\u001b[0;32m 1692\u001b[0m name\u001b[38;5;241m.\u001b[39mdecode(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mutf-8\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m 1693\u001b[0m num_outputs\u001b[38;5;241m=\u001b[39mnum_outputs,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1697\u001b[0m cancellation_manager\u001b[38;5;241m=\u001b[39mcancellation_context,\n\u001b[0;32m 1698\u001b[0m )\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\tensorflow\\python\\eager\\execute.py:53\u001b[0m, in \u001b[0;36mquick_execute\u001b[1;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[0;32m 51\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 52\u001b[0m ctx\u001b[38;5;241m.\u001b[39mensure_initialized()\n\u001b[1;32m---> 53\u001b[0m tensors \u001b[38;5;241m=\u001b[39m \u001b[43mpywrap_tfe\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mTFE_Py_Execute\u001b[49m\u001b[43m(\u001b[49m\u001b[43mctx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_handle\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdevice_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mop_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 54\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mattrs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnum_outputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 55\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m core\u001b[38;5;241m.\u001b[39m_NotOkStatusException \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 56\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
"\u001b[1;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"early_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True, verbose=1)\n",
"reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.3, patience=3, verbose=1)\n",
"model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n",
"\n",
"history = model.fit(\n",
" X_train_spec, y_train, \n",
" epochs=40, \n",
" batch_size=16, \n",
" validation_data=(X_val_spec, y_val),\n",
" callbacks=[early_stop, reduce_lr] \n",
")\n"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAHJCAYAAACR2K1xAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxnElEQVR4nO3dB3iTVfsG8Lt7t7Slkw1lFCh7yhYZKojgBAUFVBBxAQ5QUD8ERRFR/Bz491MBEZWlKIogU/beG1pG6d67TfO/nhNS2pJCR9qM3r/rekmavAlvTtP07jnnfY6NVqvVgoiIiIiKsC36JREREREJhiQiIiIiAxiSiIiIiAxgSCIiIiIygCGJiIiIyACGJCIiIiIDGJKIiIiIDGBIIiIiIjKAIYmIiIjIAIYkIqoSI0eORNOmTfHoo4+WuM/LL7+s9nn99dcr/P/t3r1bPZdcGvMxcv+CBQsqfHxEZP4Ykoioytja2uLQoUOIioq66b6MjAxs2rTJJMdFRGQIQxIRVZnmzZvDyckJf/311033SUBycXFBQECASY6NiKg4hiQiqjKurq7o1auXwZC0du1aDBgwAPb29kVuz87Oxn//+18MHDgQYWFh6N+/PxYuXIj8/Pwi+y1btkw9vlWrVnj88ccRGRl50/8ht02aNAmdOnVC69at8cQTT+DEiRMVek0xMTGYOnWqel3yfz/44IP4559/iuyzfft2PPzww2jbti06duyIZ599FufPny+4/9KlSxg/fjw6d+6sjuuRRx7Bli1bKnRcRFRxDElEVKXuueeem4bc0tLSsHXrVgwaNKjIvlqtVoWH//u//8NDDz2EL7/8UoWl+fPn46233irYb8mSJeprCSqff/65ChrTp08v8lwJCQlqPtTx48fVfR999JEKWo899liRwFIWcXFxKhTt27dPzaeSuUq1atXCc889h99++03tc/nyZUyYMAEtW7bEF198gVmzZuHixYt45pln1P8v27hx45CZmYkPPvhAHX+NGjVUkIqIiCjXcRGRcRT9k42IqJL17t1bDatJb9KTTz6pblu/fj18fX3Rvn37IvtKcNqxYwfmzZuHe++9V93WrVs3ODs745NPPsGoUaMQEhKigoWEr2nTpql9unfvroKX9C7pff/990hKSsKPP/6ogozo2bOnepw816efflrm1/Ltt9+q8LVu3bqC55SgJq9LAo+EviNHjiArK0sFIf1QYmBgoOptknlYEo4uXLiggpQ8VkiP1GeffYacnJxytjIRGQN7koioSknAufPOO4sMuf3xxx+4++67YWNjU2TfPXv2qOE36T0q7L777iu4XwJGfHw8+vTpU2Qfeb7Cdu7cidDQUBVU8vLy1CYTySUoSRArD/n/ZQhNH5AKH19sbKw6NunVknlY0uMkvUjbtm1Ds2bNVM+Tu7s7atasqYKe9G699tprWLNmjepdkiG8xo0bl+u4iMg42JNERFVOAszEiRPVkJsECAkwL7300k37JScnw9vbG3Z2dkVu9/PzU5epqalqHyH7GdpHT3qRZPiqRYsWBo9JenTKSv7vOnXq3HS7BB+RkpKiApAMB8o8quXLl2PRokXw9PTEiBEj1GuWYPi///1PDcVJj9rq1avh4OCAu+66C++88w68vLzKfFxEZBwMSURU5aT3xs3NTfUmyWTu2rVrqzk7xUlASExMhEajKRKUZLK0Phjpw5H0JhUPRYV5eHioCduvvvqqwWNydHQs8+uQ45Meo+L0t+mPrfDw2f79+/HTTz+p+VXSoySBUXq33n77bTWv6tSpU6pdvv76a/X4wnOviKhqcbiNiKqcBBLpKZG5PH/++WfBfKPiJNTIsFjxs+H0k6JlDlP9+vURFBR00z7Fay7Jc8mE6QYNGqiz5PTbr7/+qnp4ivdWlYacqXbw4EFcvXr1puOTnqx69erhu+++U0OBEpDkdXft2hUzZ84sONtOHn/HHXeouUvSqyRDgjIU16RJE4Nn6BFR1WFPEhGZhEyYlsnMMi/ozTffLLHHSU6Ll/ujo6NVz4vMA5JelqFDh6qhLDFlyhRMnjxZ7Sfzl+TsOZmgXZhMppZAJJdjxoxRvTRSduDnn39W83/KY/To0SoQyXPK8KGclSbDZbt27cLs2bPVa+vSpQvmzp2rzniT0gQSxmRCuQQmCU8yn0nmaUkP1/PPP6+G6mSO1MmTJ9XEdCIyHYYkIjIJ6T2RuTnSC9SoUSOD+0jPyldffaXOPJMeGTmTTIbmpNaRBBQ9OYtMAomc5SZBSHph/vOf/6j99GRIS8KJnPovQ1tSf0l6oWQytUyqLg/pLZIwJs/57rvvIjc3VwU5OY6+ffuqfeRrGVqTWk9yPDJ0KEOLMg+pYcOGah+5Ls8hxyLzmOS45PiHDRtWruMiIuOw0UohEiIiIiIqgnOSiIiIiAxgSCIiIiIygCGJiIiIyACGJCIiIiIDGJKIiIiIDGBIIiIiIjLHOkmydICs8L1582a1anfTpk1VUbgOHToY3P/AgQP4+OOPceLECbWcgRSbe+WVV1QRNyELQ0r5/19++UWt6yQVcWfMmGFwfaXSkoq4UilB1lMiIiIiyyC1y6TemixEbZE9SVJcTUKIBKUVK1aokvxjx45Vq2cXJ0sKyH0SpKRKroQlKeX/4osvFuwjRdyWLl2qyv5L4TgJTU899ZRaEqC8JCBVRjkpeU45rupeqortcAPbQoftoMN2uIFtocN2KFs7VPj3t9aEwsPDtU2aNNHu27ev4Lb8/HztXXfdpZ0/f/5N+8+bN0/bv39/tY/e3r171XNcunRJm52drW3btq32hx9+KLg/OTlZ26pVK+2aNWvKfZxHjhxRm7Glp6er1y6X1Rnb4Qa2hQ7bQYftcAPbQoftULZ2qOjvb5MOt8naSQsXLlSLTOpJt5hsUpq/uPvuu0+tdST3F95fJCcnq9XC09PT1QKSerLsQfPmzbF37161dAERERFRaZg0JEmA6dWrV5HbZFXwiIgITJs27ab9Da3vJAtdyvpJMgSnX/Vb1oIqzN/fH1FRURU6Vumuy8jIgDFlZmYWuayu2A43sC102A46bIcb2BY6bIeytYP87i7csWJxE7eLT8qW1bj79++P3r1733b/OXPmqAnfMlFbJlXrG0tW1y7MyclJ9TRVdPKXrMpdGcLDwyvleS0N2+EGtoUO20GH7XAD20KH7VD6diieCSwyJG3YsAFTpkxBu3btMHfu3NsGFjljbfXq1WqC9l133aVud3Z2VpcymUt/Xchq3y4uLhU6PglhISEhMCYJdfINlhW/K3p8loztcAPbQoftoMN2uIFtocN2KFs7nDt3DhVhFiFpyZIlmDVrFgYOHKh6h26V+qRMwMSJE7Fv3z51Rtzdd99dcJ9+mC0mJgZ169YtuF2+luG4ipDuOik5cCsajUYFuNKytbUtuNRfr45u1Q4STu3s7FDdyA/97d5v1QHbQYftcAPbQoftULp2qMhQm1mEJP3p+iNHjsQbb7xxyxckPUTjxo1Tw17ffPMNOnfuXOT+Zs2awd3dHbt37y4ISTIBXGoqPf7445X2GmTMU+Y8Sc2nspDyBPb29oiMjKzWIel27SA1sAIDAyv8ZiciIrKYkCR1j2bPno1+/fqp8BMXF1dwnwyX6ecSeXl5qd6lr776Cvv378dHH32Ehg0bIjY2tmB//T4ShmS4zsfHB7Vq1cKHH36ofsHKPKfKog9IMkFcEm1pf5lLz5MMBcrrrI69JbdrB/1keekJNDQhn4iIyGpDkpzJJsNT69evV1thQ4cOVduoUaOwaNEi1Wv0+++/q1+cUoCyOP0+L7zwAvLy8vDmm28iKytLVdyWXqfKqpYtv+D1AcnX17fMj9UHwuoekkpqB/1YswQlaePq3E5ERFSNQtL48ePVdiunT58uEqpuR36JyjIlslUF/Rwkjg1XHn3bSlszJBERUVWpvhNhjIzzZSoP25aIiEyBIYmIiIjIAIYkIiIiInMsAUDm4fXXX8eqVatKPT+stKS0g5xl+P7771fg6IiIiKoeQ5IJpWflISc7H4WKg5uM1KiaPHlywdfdu3dX6+f
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(history.history['accuracy'])\n",
"plt.plot(history.history['val_accuracy'])\n",
"plt.title('Model accuracy')\n",
"plt.ylabel('Accuracy')\n",
"plt.xlabel('Epoch')\n",
"plt.legend(['Train', 'Test'], loc='upper left')\n",
"plt.show()\n",
"\n",
"\n",
"plt.plot(history.history['loss'])\n",
"plt.plot(history.history['val_loss'])\n",
"plt.title('Model loss')\n",
"plt.ylabel('Loss')\n",
"plt.xlabel('Epoch')\n",
"plt.legend(['Train', 'Test'], loc='upper left')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m27/27\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 162ms/step\n",
" precision recall f1-score support\n",
"\n",
" 1 0.91 0.61 0.73 67\n",
" 2 0.77 0.79 0.78 107\n",
" 3 0.86 0.69 0.77 123\n",
" 4 0.66 0.82 0.73 99\n",
" 5 0.79 0.85 0.82 107\n",
" 6 0.80 0.80 0.80 118\n",
" 7 0.83 0.82 0.83 122\n",
" 8 0.71 0.79 0.75 121\n",
"\n",
" accuracy 0.78 864\n",
" macro avg 0.79 0.77 0.77 864\n",
"weighted avg 0.79 0.78 0.78 864\n",
"\n"
]
}
],
"source": [
"y_test_encoded = tf.keras.utils.to_categorical(y_test, num_classes=9)\n",
"y_pred = model.predict(X_test_reshaped)\n",
"y_pred_classes = np.argmax(y_pred, axis=1)\n",
"\n",
"y_true_classes = np.argmax(y_test_encoded, axis=1)\n",
"\n",
"report = classification_report(y_true_classes, y_pred_classes)\n",
"print(report)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m27/27\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 182ms/step - accuracy: 0.7781 - loss: 1.1730\n",
"Test Loss: 1.289555311203003\n",
"Test Accuracy: 0.7777777910232544\n"
]
}
],
"source": [
"evaluation_result = model.evaluate(X_test_reshaped, y_test)\n",
"\n",
"print(\"Test Loss:\", evaluation_result[0])\n",
"print(\"Test Accuracy:\", evaluation_result[1])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n"
]
}
],
"source": [
"model.save('model.h5')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "base",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}