{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nimport tensorflow_hub as hub\nimport tensorflow_io as tfio\n\nimport pandas as pd\nimport numpy as np\nimport librosa\nimport librosa.display\nimport glob\n\nimport csv\nimport io\n\nimport ast\nimport librosa\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport plotly.express as px\nimport plotly.graph_objs as go\nfrom collections import Counter\nimport matplotlib.pyplot as plt\nfrom IPython.display import Audio\n\nimport matplotlib.pyplot as plt\nfrom IPython.display import Audio\n\n# Function to load and preprocess the audio file\ndef load_audio_file(file_path, resample_to=22050):\n    audio, sr = librosa.load(file_path, sr=resample_to)\n    return audio, sr\n\n# Load sample audio files from two different species\naudio_abe, sr_abe = load_audio_file(\"/kaggle/input/birdclef-2023/train_audio/abethr1/XC128013.ogg\")\naudio_abh, sr_abh = load_audio_file(\"/kaggle/input/birdclef-2023/train_audio/abhori1/XC127317.ogg\")\n\n# Play the audio\nprint(\"Audio 1:\")\nAudio(data=audio_abe, rate=sr_abe)\n\nprint(\"Audio 2:\")\nAudio(data=audio_abh, rate=sr_abh)\n\n# Function to visualize waveforms and spectrograms\ndef visualize_audio(audio, sr, title=\"\"):\n    # Waveform\n    plt.figure(figsize=(10, 4))\n    librosa.display.waveshow(audio, sr=sr)\n    plt.title(f\"{title} - Waveform\")\n    plt.show()\n\n    # Spectrogram\n    plt.figure(figsize=(10, 4))\n    spectrogram = librosa.amplitude_to_db(np.abs(librosa.stft(audio)), ref=np.max)\n    librosa.display.specshow(spectrogram, sr=sr, x_axis='time', y_axis='log')\n    plt.colorbar(format='%+2.0f dB')\n    plt.title(f\"{title} - Spectrogram\")\n    plt.show()\n\n# Visualize the audio files\nvisualize_audio(audio_abe, sr_abe, title=\"Audio 1 - Species A\")\nvisualize_audio(audio_abh, sr_abh, title=\"Audio 2 - Species B\")\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-19T02:11:15.565581Z","iopub.execute_input":"2023-03-19T02:11:15.566438Z","iopub.status.idle":"2023-03-19T02:11:40.216778Z","shell.execute_reply.started":"2023-03-19T02:11:15.566396Z","shell.execute_reply":"2023-03-19T02:11:40.215628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import seaborn as sns\n\n# Set Seaborn style\nsns.set(style=\"whitegrid\")\n\n# Function to visualize waveforms and spectrograms\ndef visualize_audio(audio, sr, title=\"\", cmap=\"viridis\"):\n    # Waveform\n    plt.figure(figsize=(12, 4))\n    librosa.display.waveshow(audio, sr=sr)\n    plt.title(f\"{title} - Waveform\", fontsize=16)\n    plt.gca().spines[\"top\"].set_visible(False)\n    plt.gca().spines[\"right\"].set_visible(False)\n    plt.gca().spines[\"bottom\"].set_visible(False)\n    plt.gca().spines[\"left\"].set_visible(False)\n    plt.show()\n\n    # Spectrogram\n    plt.figure(figsize=(12, 4))\n    spectrogram = librosa.amplitude_to_db(np.abs(librosa.stft(audio)), ref=np.max)\n    img = librosa.display.specshow(spectrogram, sr=sr, x_axis='time', y_axis='log', cmap=cmap)\n    plt.colorbar(img, format='%+2.0f dB')\n    plt.title(f\"{title} - Spectrogram\", fontsize=16)\n    plt.gca().spines[\"top\"].set_visible(False)\n    plt.gca().spines[\"right\"].set_visible(False)\n    plt.gca().spines[\"bottom\"].set_visible(False)\n    plt.gca().spines[\"left\"].set_visible(False)\n    plt.show()\n\n# Visualize the audio files\nvisualize_audio(audio_abe, sr_abe, title=\"Audio 1 - Species A\")\nvisualize_audio(audio_abh, sr_abh, title=\"Audio 2 - Species B\")","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:40.219178Z","iopub.execute_input":"2023-03-19T02:11:40.220254Z","iopub.status.idle":"2023-03-19T02:11:44.315781Z","shell.execute_reply.started":"2023-03-19T02:11:40.220214Z","shell.execute_reply":"2023-03-19T02:11:44.314910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\n# Load the metadata file\nmetadata_path = \"/kaggle/input/birdclef-2023/train_metadata.csv\"\nmetadata = pd.read_csv(metadata_path)\n\n# Get column names\ncolumn_names = metadata.columns\n\n# Print column names\nprint(\"Column names:\")\nfor col in column_names:\n    print(col)","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:44.317564Z","iopub.execute_input":"2023-03-19T02:11:44.318157Z","iopub.status.idle":"2023-03-19T02:11:44.428393Z","shell.execute_reply.started":"2023-03-19T02:11:44.318120Z","shell.execute_reply":"2023-03-19T02:11:44.427229Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\n# Load the metadata file\nmetadata_path = \"/kaggle/input/birdclef-2023/train_metadata.csv\"\nmetadata = pd.read_csv(metadata_path)\n\n# Print the first few rows\nprint(metadata.head())\n\n# Print summary statistics\nprint(metadata.describe())\n\n# Print column names\nprint(metadata.columns)","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:44.431500Z","iopub.execute_input":"2023-03-19T02:11:44.431861Z","iopub.status.idle":"2023-03-19T02:11:44.515458Z","shell.execute_reply.started":"2023-03-19T02:11:44.431830Z","shell.execute_reply":"2023-03-19T02:11:44.514184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Count the number of unique species (primary labels)\nunique_species = metadata[\"primary_label\"].nunique()\nprint(f\"There are {unique_species} unique species in the dataset.\")","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:44.517731Z","iopub.execute_input":"2023-03-19T02:11:44.518159Z","iopub.status.idle":"2023-03-19T02:11:44.527600Z","shell.execute_reply.started":"2023-03-19T02:11:44.518102Z","shell.execute_reply":"2023-03-19T02:11:44.526090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Load the metadata\nmetadata = pd.read_csv('/kaggle/input/birdclef-2023/train_metadata.csv')\n\n# Unique species\nprint(f\"Number of unique species: {metadata['primary_label'].nunique()}\")\n\n# Distribution of species\nplt.figure(figsize=(16, 6))\nsns.countplot(data=metadata, x='primary_label', order=metadata['primary_label'].value_counts().index)\nplt.xticks(rotation=90)\nplt.xlabel('Species')\nplt.ylabel('Count')\nplt.title('Distribution of Species')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:44.529535Z","iopub.execute_input":"2023-03-19T02:11:44.530423Z","iopub.status.idle":"2023-03-19T02:11:51.003071Z","shell.execute_reply.started":"2023-03-19T02:11:44.530357Z","shell.execute_reply":"2023-03-19T02:11:51.001899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\n# Load the metadata\nmetadata = pd.read_csv('/kaggle/input/birdclef-2023/train_metadata.csv')\n\n# Compute the counts per species\nspecies_counts = metadata['primary_label'].value_counts()\n\n# Convert the counts to a NumPy array\nspecies_counts_array = np.array(species_counts)\n\n# Print the counts per species as an array\nprint(species_counts_array)","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:51.005011Z","iopub.execute_input":"2023-03-19T02:11:51.005434Z","iopub.status.idle":"2023-03-19T02:11:51.069257Z","shell.execute_reply.started":"2023-03-19T02:11:51.005377Z","shell.execute_reply":"2023-03-19T02:11:51.067238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainmeta_df = pd.read_csv(\"/kaggle/input/birdclef-2023/train_metadata.csv\")\ntrainmeta_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:51.070687Z","iopub.execute_input":"2023-03-19T02:11:51.071261Z","iopub.status.idle":"2023-03-19T02:11:51.139592Z","shell.execute_reply.started":"2023-03-19T02:11:51.071221Z","shell.execute_reply":"2023-03-19T02:11:51.138344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x = trainmeta_df[trainmeta_df[\"primary_label\"] == \"afgfly1\"]\nx","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:51.141463Z","iopub.execute_input":"2023-03-19T02:11:51.141853Z","iopub.status.idle":"2023-03-19T02:11:51.163000Z","shell.execute_reply.started":"2023-03-19T02:11:51.141803Z","shell.execute_reply":"2023-03-19T02:11:51.161754Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(trainmeta_df.info())","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:51.168304Z","iopub.execute_input":"2023-03-19T02:11:51.170106Z","iopub.status.idle":"2023-03-19T02:11:51.191550Z","shell.execute_reply.started":"2023-03-19T02:11:51.170069Z","shell.execute_reply":"2023-03-19T02:11:51.190509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\n# Load the metadata file\nmetadata_path = \"/kaggle/input/birdclef-2023/train_metadata.csv\"\nmetadata = pd.read_csv(metadata_path)\n\n# Get column names\ncolumn_names = metadata.columns\n\n# Print column names\nprint(\"Column names:\")\nfor col in column_names:\n    print(col)","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:51.193003Z","iopub.execute_input":"2023-03-19T02:11:51.193340Z","iopub.status.idle":"2023-03-19T02:11:51.251095Z","shell.execute_reply.started":"2023-03-19T02:11:51.193296Z","shell.execute_reply":"2023-03-19T02:11:51.249939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metadata_file = \"/kaggle/input/birdclef-2023/train_metadata.csv\"\nmetadata_df = pd.read_csv(metadata_file)\n\nspecies_count = metadata_df['primary_label'].value_counts()\nprint(species_count)\n\n# Plot the distribution\nplt.figure(figsize=(10, 5))\nsns.countplot(x='primary_label', data=metadata_df)\nplt.xticks(rotation=90)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:51.252598Z","iopub.execute_input":"2023-03-19T02:11:51.253247Z","iopub.status.idle":"2023-03-19T02:11:57.492194Z","shell.execute_reply.started":"2023-03-19T02:11:51.253207Z","shell.execute_reply":"2023-03-19T02:11:57.491063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import ast\nimport librosa\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport plotly.express as px\nimport plotly.graph_objs as go\nfrom collections import Counter\nimport matplotlib.pyplot as plt\nfrom IPython.display import Audio\n\n# Load your metadata into trainmeta_df\ntrainmeta_df = pd.read_csv(\"/kaggle/input/birdclef-2023/train_metadata.csv\")\n\n# Distribution of Primary Labels (Bird Species)\nfig = px.histogram(trainmeta_df, x=\"primary_label\", nbins=len(trainmeta_df[\"primary_label\"].unique()))\n\n# Customize the appearance of the plot\nfig.update_layout(\n    title={\n        'text': \"Distribution of Primary Labels\",\n        'y': 0.95,\n        'x': 0.5,\n        'xanchor': 'center',\n        'yanchor': 'top',\n        'font': {'size': 24, 'family': 'Arial'}\n    },\n    xaxis_title=\"Primary Labels\",\n    yaxis_title=\"Frequency\",\n    xaxis_tickangle=-45,\n    xaxis_tickfont={'size': 12},\n    yaxis_tickfont={'size': 12},\n    legend_title=\"Primary Labels\",\n    legend_title_font={'size': 16},\n    legend_font={'size': 14},\n    plot_bgcolor='rgba(255, 255, 255, 1)',\n    xaxis_showgrid=False,\n    yaxis_showgrid=True,\n    yaxis_gridwidth=1,\n    yaxis_gridcolor='rgba(128, 128, 128, 0.2)',\n    margin=dict(l=20, r=20, t=80, b=80),\n)\n\nfig.show()\n\n# Geographical Distribution of Recordings\nfig = px.scatter_geo(trainmeta_df,\n                     lat=\"latitude\",\n                     lon=\"longitude\",\n                     color=\"primary_label\",\n                     title=\"Geographical Distribution of Recordings\",\n                     projection=\"natural earth\")\n\nfig.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:57.493839Z","iopub.execute_input":"2023-03-19T02:11:57.494301Z","iopub.status.idle":"2023-03-19T02:11:59.626946Z","shell.execute_reply.started":"2023-03-19T02:11:57.494260Z","shell.execute_reply":"2023-03-19T02:11:59.625788Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport librosa\nimport librosa.display\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\n# Read metadata file\nmetadata_path = \"/kaggle/input/birdclef-2023/train_metadata.csv\"\ntrain_metadata = pd.read_csv(metadata_path)\n\n# # Display some statistics\n# print(train_metadata.describe())\n\n# # Distribution of bird species\n# species_count = train_metadata['primary_label'].value_counts()\n# plt.figure(figsize=(20, 5))\n# sns.barplot(x=species_count.index, y=species_count.values)\n# plt.title('Distribution of Bird Species')\n# plt.xlabel('Species')\n# plt.ylabel('Count')\n# plt.xticks(rotation=90)\n# plt.show()\n\n# Load an example audio file\nbird_name = train_metadata['primary_label'].iloc[0]\nexample_audio_file = train_metadata[train_metadata['primary_label'] == bird_name]['filename'].iloc[0]\naudio_path = f\"/kaggle/input/birdclef-2023/train_audio/{example_audio_file}\"\n\n# Load audio with librosa\nsignal, sr = librosa.load(audio_path, sr=None)\n\n# Display waveform\nplt.figure(figsize=(20, 5))\nlibrosa.display.waveshow(signal, sr=sr)\nplt.title(f'Waveform of {bird_name} ({example_audio_file})')\nplt.xlabel('Time (s)')\nplt.ylabel('Amplitude')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:11:59.628404Z","iopub.execute_input":"2023-03-19T02:11:59.629409Z","iopub.status.idle":"2023-03-19T02:12:00.207830Z","shell.execute_reply.started":"2023-03-19T02:11:59.629371Z","shell.execute_reply":"2023-03-19T02:12:00.206815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\n# Set the path to the test audio files\ntrain_audio_path = \"/kaggle/input/birdclef-2023/train_audio\"\n\n# Loop through the test_audio folder and print the file names\nfor file in os.listdir(train_audio_path):\n    if file.endswith(\".ogg\"):\n        print(file)","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:12:00.209778Z","iopub.execute_input":"2023-03-19T02:12:00.210531Z","iopub.status.idle":"2023-03-19T02:12:00.229817Z","shell.execute_reply.started":"2023-03-19T02:12:00.210490Z","shell.execute_reply":"2023-03-19T02:12:00.228886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\n# Set the path to the test_audio files\ntest_audio_path = \"/kaggle/input/birdclef-2023/train_audio\"\n\n# List all the folder names inside the test_audio folder\nfolder_names = [folder for folder in os.listdir(test_audio_path) if os.path.isdir(os.path.join(test_audio_path, folder))]\n\n# Print the folder names\nprint(folder_names)","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:12:00.231201Z","iopub.execute_input":"2023-03-19T02:12:00.231733Z","iopub.status.idle":"2023-03-19T02:12:00.242610Z","shell.execute_reply.started":"2023-03-19T02:12:00.231695Z","shell.execute_reply":"2023-03-19T02:12:00.241634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import librosa\nimport numpy as np\n\ndef extract_features(audio_path, n_mfcc=13):\n    # Load audio with librosa\n    signal, sr = librosa.load(audio_path, sr=None)\n\n    # Extract MFCCs\n    mfccs = librosa.feature.mfcc(y=signal, sr=sr, n_mfcc=n_mfcc)\n\n    # Extract Chroma features\n    chroma_stft = librosa.feature.chroma_stft(y=signal, sr=sr)\n\n    # Extract spectral contrast\n    spectral_contrast = librosa.feature.spectral_contrast(y=signal, sr=sr)\n\n    # Extract tonnetz features\n    tonnetz = librosa.feature.tonnetz(y=librosa.effects.harmonic(signal), sr=sr)\n\n    # Calculate mean and standard deviation for each feature\n    features = {\n        'mfcc_mean': np.mean(mfccs, axis=1),\n        'mfcc_std': np.std(mfccs, axis=1),\n        'chroma_mean': np.mean(chroma_stft, axis=1),\n        'chroma_std': np.std(chroma_stft, axis=1),\n        'spectral_contrast_mean': np.mean(spectral_contrast, axis=1),\n        'spectral_contrast_std': np.std(spectral_contrast, axis=1),\n        'tonnetz_mean': np.mean(tonnetz, axis=1),\n        'tonnetz_std': np.std(tonnetz, axis=1)\n    }\n\n    return features\n\n# Example usage:\nbird_name = train_metadata['primary_label'].iloc[0]\nexample_audio_file = train_metadata[train_metadata['primary_label'] == bird_name]['filename'].iloc[0]\naudio_path = f\"/kaggle/input/birdclef-2023/train_audio/{example_audio_file}\"\n\nfeatures = extract_features(audio_path)\nprint(features)","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:12:00.243921Z","iopub.execute_input":"2023-03-19T02:12:00.245160Z","iopub.status.idle":"2023-03-19T02:12:07.003820Z","shell.execute_reply.started":"2023-03-19T02:12:00.245123Z","shell.execute_reply":"2023-03-19T02:12:07.000349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport librosa\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score, classification_report\n\ndef extract_mfcc_features(audio_path, n_mfcc=13):\n    signal, sr = librosa.load(audio_path, sr=None)\n    mfccs = librosa.feature.mfcc(y=signal, sr=sr, n_mfcc=n_mfcc)\n    return np.mean(mfccs, axis=1)\n\ndef create_features_dataframe(metadata, audio_base_path):\n    data = []\n\n    for index, row in metadata.iterrows():\n        bird_name = row['primary_label']\n#         print(bird_name)\n        audio_file = row['filename']\n        \n        audio_file = os.path.basename(audio_file)\n\n#         print(audio_file)\n        audio_path = os.path.join(audio_base_path, bird_name, audio_file)\n\n        features = extract_mfcc_features(audio_path)\n        data.append(np.append(features, bird_name))\n\n    columns = [f\"mfcc_{i}\" for i in range(features.shape[0])] + ['primary_label']\n    return pd.DataFrame(data, columns=columns)\n\nmetadata_path = \"/kaggle/input/birdclef-2023/train_metadata.csv\"\naudio_base_path = \"/kaggle/input/birdclef-2023/train_audio\"\ntrain_metadata = pd.read_csv(metadata_path)\n\nfeatures_df = create_features_dataframe(train_metadata, audio_base_path)\n\nX = features_df.drop('primary_label', axis=1)\ny = features_df['primary_label']\n\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)\n\nscaler = StandardScaler()\nX_train = scaler.fit_transform(X_train)\nX_val = scaler.transform(X_val)\n\nmodel = RandomForestClassifier(n_estimators=100, random_state=42)\nmodel.fit(X_train, y_train)\n\ny_pred = model.predict(X_val)\n\naccuracy = accuracy_score(y_val, y_pred)\nprint(f\"Validation accuracy: {accuracy:.2f}\")\n\nprint(\"Classification report:\")\nprint(classification_report(y_val, y_pred))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import librosa\nimport numpy as np\n\ndef extract_mel_spectrogram(audio_path, n_mels=128):\n    signal, sr = librosa.load(audio_path, sr=None, mono=True)\n    mel_spectrogram = librosa.feature.melspectrogram(y=signal, sr=sr, n_mels=n_mels)\n    return librosa.power_to_db(mel_spectrogram, ref=np.max)\n\nX = []\ny = []\n\nfor index, row in train_metadata.iterrows():\n    bird_name = row['primary_label']\n    audio_file = row['filename']\n    audio_path = f\"/kaggle/input/birdclef-2023/train_audio/{audio_file}\"\n    \n    mel_spectrogram = extract_mel_spectrogram(audio_path)\n    X.append(mel_spectrogram)\n    y.append(bird_name)\n\nX = np.array(X)\ny = np.array(y)\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\n\nlabel_encoder = LabelEncoder()\ny_encoded = label_encoder.fit_transform(y)\n\nX_train, X_val, y_train, y_val = train_test_split(X, y_encoded, test_size=0.2, random_state=42)\n\nX_train = X_train[..., np.newaxis]\nX_val = X_val[..., np.newaxis]\ninput_shape = X_train.shape[1:]\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout, Conv2D, MaxPooling2D, Flatten\nfrom tensorflow.keras.optimizers import Adam\n\nmodel = Sequential()\nmodel.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Flatten())\nmodel.add(Dense(128, activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(len(label_encoder.classes_), activation='softmax'))\n\nmodel.compile(optimizer=Adam(lr=0.001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n\nhistory = model.fit(X_train, y_train, validation_data=(X_val, y_val), batch_size=32, epochs=20, verbose=1)\n\nval_loss, val_accuracy = model.evaluate(X_val, y_val, verbose=0)\nprint(f\"Validation loss: {val_loss:.4f}, Validation accuracy: {val_accuracy:.4f}\")","metadata":{"execution":{"iopub.status.busy":"2023-03-19T02:35:44.716569Z","iopub.status.idle":"2023-03-19T02:35:44.717391Z","shell.execute_reply.started":"2023-03-19T02:35:44.717113Z","shell.execute_reply":"2023-03-19T02:35:44.717142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}