diff --git a/Assignment2/Assignment2.ipynb b/Assignment2/Assignment2.ipynb index e4c7f04..766589f 100644 --- a/Assignment2/Assignment2.ipynb +++ b/Assignment2/Assignment2.ipynb @@ -2,13 +2,21 @@ "cells": [ { "cell_type": "code", - "execution_count": 57, + "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "Данные успешно загружены.\n", + "Выбраны релевантные столбцы для Дании.\n", + "Пропущенные значения обработаны (удалены строки с NaN).\n", + "Сформированы массивы 24x3 (часы x признаки).\n", + "Создан DataFrame с массивами и метками сезонов.\n", + "Выполнено кодирование меток.\n", + "Данные разделены на обучающий, валидационный и тестовый наборы.\n", + "Выполнено масштабирование данных.\n", "Данные успешно сохранены в processed_data.npz\n" ] }, @@ -37,6 +45,7 @@ " # 1. Загрузка данных\n", " try:\n", " data = pd.read_csv(\"dataset/opsd_raw.csv\", parse_dates=[\"utc_timestamp\"])\n", + " print(\"Данные успешно загружены.\")\n", " except FileNotFoundError:\n", " print(\"Ошибка: Файл dataset/opsd_raw.csv не найден.\")\n", " return\n", @@ -57,10 +66,12 @@ " \n", " data = data[cols].copy()\n", " data.columns = [\"timestamp\", \"load\", \"wind\", \"solar\"]\n", + " print(\"Выбраны релевантные столбцы для Дании.\")\n", " \n", " # 3. Обработка пропущенных значений:\n", " # Удаляем строки, где есть хоть одно пропущенное значение\n", " data.dropna(inplace=True)\n", + " print(\"Пропущенные значения обработаны (удалены строки с NaN).\")\n", "\n", " # 4. Формирование массивов 24x3 (часы × признаки)\n", " data.set_index(\"timestamp\", inplace=True)\n", @@ -71,6 +82,7 @@ " if len(x) == 24 else None\n", " )\n", " daily_data = daily_data.dropna()\n", + " print(\"Сформированы массивы 24x3 (часы x признаки).\")\n", " \n", " # Преобразуем индексы в формат datetime для дальнейшей работы\n", " daily_data.index = pd.to_datetime(daily_data.index)\n", @@ -81,6 +93,7 @@ " \"data\": daily_data.values,\n", " \"season\": daily_data.index.map(lambda x: get_season(x.month))\n", " })\n", + " print(\"Создан DataFrame с массивами и метками сезонов.\")\n", " \n", " # 6. Разделение данных\n", " X = np.stack(df[\"data\"].values)\n", @@ -94,6 +107,7 @@ " # Encode labels\n", " label_encoder = LabelEncoder()\n", " y_encoded = label_encoder.fit_transform(y)\n", + " print(\"Выполнено кодирование меток.\")\n", " \n", " X_train, X_temp, y_train, y_temp = train_test_split(\n", " X, y_encoded, test_size=0.3, stratify=y_encoded, random_state=42\n", @@ -101,6 +115,7 @@ " X_val, X_test, y_val, y_test = train_test_split(\n", " X_temp, y_temp, test_size=0.5, stratify=y_temp, random_state=42\n", " )\n", + " print(\"Данные разделены на обучающий, валидационный и тестовый наборы.\")\n", " \n", " # 7. Масштабирование\n", " scaler = StandardScaler()\n", @@ -122,6 +137,7 @@ " return\n", " X_test_reshaped = X_test.reshape(-1, 3)\n", " X_test_scaled = scaler.transform(X_test_reshaped).reshape(X_test.shape)\n", + " print(\"Выполнено масштабирование данных.\")\n", " \n", " # 8. Сохранение данных\n", " try:\n", @@ -153,8 +169,9 @@ " for season in [\"winter\", \"spring\", \"summer\", \"autumn\"]:\n", " try:\n", " # Get the first day's data for the given season\n", - " season_encoded = df[df[\"season\"] == season].iloc[0][\"data\"]\n", - " plt.plot(season_encoded[0], label=f\"{season} load\") # Plot the 'load' data\n", + " season_data = df[df[\"season\"] == season].iloc[0][\"data\"]\n", + " # Plotting only the 'load' data\n", + " plt.plot(season_data[0], label=f\"{season} load\")\n", " except IndexError:\n", " print(f\"Предупреждение: Нет данных для сезона {season} для построения графика.\")\n", " plt.title(\"Суточные профили потребления энергии по сезонам\")\n", @@ -171,7 +188,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 80, "metadata": {}, "outputs": [ { @@ -353,14 +370,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "Лучшие параметры: {'activation': 'tanh', 'alpha': 0.0001, 'hidden_layer_sizes': (50,), 'solver': 'adam'}\n", + "Лучшие параметры: \n", "Точность (Accuracy): 0.7587\n", " precision recall f1-score support\n", "\n", - " 0 0.76 0.70 0.73 73\n", - " 1 0.84 0.59 0.70 83\n", - " 2 0.72 0.92 0.81 83\n", - " 3 0.74 0.83 0.78 76\n", + " autumn 0.76 0.70 0.73 73\n", + " spring 0.84 0.59 0.70 83\n", + " summer 0.72 0.92 0.81 83\n", + " winter 0.74 0.83 0.78 76\n", "\n", " accuracy 0.76 315\n", " macro avg 0.77 0.76 0.75 315\n", @@ -386,6 +404,7 @@ " data = np.load(\"processed_data.npz\", allow_pickle=True)\n", " X_train, X_val, X_test = data[\"X_train\"], data[\"X_val\"], data[\"X_test\"]\n", " y_train, y_val, y_test = data[\"y_train\"], data[\"y_val\"], data[\"y_test\"]\n", + " classes = data[\"classes\"]\n", " except FileNotFoundError:\n", " print(\"Ошибка: Файл processed_data.npz не найден. Запустите task1_preprocessing() перед выполнением этой задачи.\")\n", " return\n", @@ -407,14 +426,14 @@ "\n", " # 4. Лучшая модель и её параметры\n", " best_model = grid_search.best_estimator_\n", - " print(\"Лучшие параметры:\", grid_search.best_params_)\n", + " print(\"Лучшие параметры:\", best_model.get_params)\n", "\n", " # 5. Оценка модели на тестовом наборе\n", " y_pred = best_model.predict(X_test.reshape(X_test.shape[0], -1))\n", "\n", " accuracy = accuracy_score(y_test, y_pred)\n", " print(f\"Точность (Accuracy): {accuracy:.4f}\")\n", - " print(classification_report(y_test, y_pred))\n", + " print(classification_report(y_test, y_pred, target_names=classes))\n", "\n", "# Запуск обучения MLP\n", "task2_mlp()\n" @@ -422,25 +441,28 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 81, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/50\n" + ] + }, { "ename": "ValueError", - "evalue": "Computed output size would be negative. Received `inputs shape=(None, 0, 64)`, `kernel shape=(3, 64, 32)`, `dilation_rate=[1]`.", + "evalue": "Exception encountered when calling Sequential.call().\n\n\u001b[1mInput 0 of layer \"conv1d_24\" is incompatible with the layer: expected axis -1 of input shape to have value 3, but received input with shape (None, 3, 24)\u001b[0m\n\nArguments received by Sequential.call():\n • inputs=tf.Tensor(shape=(None, 3, 24), dtype=float32)\n • training=True\n • mask=None", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[59]\u001b[39m\u001b[32m, line 74\u001b[39m\n\u001b[32m 71\u001b[39m model.save(\u001b[33m\"\u001b[39m\u001b[33m1d_cnn_model.h5\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 73\u001b[39m \u001b[38;5;66;03m# Запуск обучения 1D CNN\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m74\u001b[39m \u001b[43mtask3_1d_cnn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[59]\u001b[39m\u001b[32m, line 33\u001b[39m, in \u001b[36mtask3_1d_cnn\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m 30\u001b[39m y_test = to_categorical(y_test, num_classes)\n\u001b[32m 32\u001b[39m \u001b[38;5;66;03m# Построение модели 1D CNN\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m33\u001b[39m model = \u001b[43mSequential\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\n\u001b[32m 34\u001b[39m \u001b[43m \u001b[49m\u001b[43mtf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mkeras\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlayers\u001b[49m\u001b[43m.\u001b[49m\u001b[43mConv1D\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilters\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m64\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkernel_size\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m3\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mactivation\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mrelu\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_shape\u001b[49m\u001b[43m=\u001b[49m\u001b[43m(\u001b[49m\u001b[32;43m3\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m24\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Corrected input shape\u001b[39;49;00m\n\u001b[32m 35\u001b[39m \u001b[43m \u001b[49m\u001b[43mtf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mkeras\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlayers\u001b[49m\u001b[43m.\u001b[49m\u001b[43mMaxPooling1D\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpool_size\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m2\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 36\u001b[39m \u001b[43m \u001b[49m\u001b[43mtf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mkeras\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlayers\u001b[49m\u001b[43m.\u001b[49m\u001b[43mConv1D\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilters\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m32\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkernel_size\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m3\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mactivation\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mrelu\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 37\u001b[39m \u001b[43m \u001b[49m\u001b[43mtf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mkeras\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlayers\u001b[49m\u001b[43m.\u001b[49m\u001b[43mMaxPooling1D\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpool_size\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m2\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 38\u001b[39m \u001b[43m \u001b[49m\u001b[43mtf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mkeras\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlayers\u001b[49m\u001b[43m.\u001b[49m\u001b[43mFlatten\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 39\u001b[39m \u001b[43m \u001b[49m\u001b[43mtf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mkeras\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlayers\u001b[49m\u001b[43m.\u001b[49m\u001b[43mDense\u001b[49m\u001b[43m(\u001b[49m\u001b[32;43m64\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mactivation\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mrelu\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 40\u001b[39m \u001b[43m \u001b[49m\u001b[43mtf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mkeras\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlayers\u001b[49m\u001b[43m.\u001b[49m\u001b[43mDropout\u001b[49m\u001b[43m(\u001b[49m\u001b[32;43m0.5\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 41\u001b[39m \u001b[43m \u001b[49m\u001b[43mtf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mkeras\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlayers\u001b[49m\u001b[43m.\u001b[49m\u001b[43mDense\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnum_classes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mactivation\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43msoftmax\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 42\u001b[39m \u001b[43m\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 44\u001b[39m \u001b[38;5;66;03m# Компиляция модели\u001b[39;00m\n\u001b[32m 45\u001b[39m model.compile(optimizer=Adam(learning_rate=\u001b[32m0.001\u001b[39m),\n\u001b[32m 46\u001b[39m loss=\u001b[33m'\u001b[39m\u001b[33mcategorical_crossentropy\u001b[39m\u001b[33m'\u001b[39m,\n\u001b[32m 47\u001b[39m metrics=[\u001b[33m'\u001b[39m\u001b[33maccuracy\u001b[39m\u001b[33m'\u001b[39m])\n", - "\u001b[36mFile \u001b[39m\u001b[32m/var/data/python/lib/python3.12/site-packages/keras/src/models/sequential.py:76\u001b[39m, in \u001b[36mSequential.__init__\u001b[39m\u001b[34m(self, layers, trainable, name)\u001b[39m\n\u001b[32m 74\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m layer \u001b[38;5;129;01min\u001b[39;00m layers:\n\u001b[32m 75\u001b[39m \u001b[38;5;28mself\u001b[39m.add(layer, rebuild=\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[32m---> \u001b[39m\u001b[32m76\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_maybe_rebuild\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m/var/data/python/lib/python3.12/site-packages/keras/src/models/sequential.py:149\u001b[39m, in \u001b[36mSequential._maybe_rebuild\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 147\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m._layers[\u001b[32m0\u001b[39m], InputLayer) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m._layers) > \u001b[32m1\u001b[39m:\n\u001b[32m 148\u001b[39m input_shape = \u001b[38;5;28mself\u001b[39m._layers[\u001b[32m0\u001b[39m].batch_shape\n\u001b[32m--> \u001b[39m\u001b[32m149\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mbuild\u001b[49m\u001b[43m(\u001b[49m\u001b[43minput_shape\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 150\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(\u001b[38;5;28mself\u001b[39m._layers[\u001b[32m0\u001b[39m], \u001b[33m\"\u001b[39m\u001b[33minput_shape\u001b[39m\u001b[33m\"\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m._layers) > \u001b[32m1\u001b[39m:\n\u001b[32m 151\u001b[39m \u001b[38;5;66;03m# We can build the Sequential model if the first layer has the\u001b[39;00m\n\u001b[32m 152\u001b[39m \u001b[38;5;66;03m# `input_shape` property. This is most commonly found in Functional\u001b[39;00m\n\u001b[32m 153\u001b[39m \u001b[38;5;66;03m# model.\u001b[39;00m\n\u001b[32m 154\u001b[39m input_shape = \u001b[38;5;28mself\u001b[39m._layers[\u001b[32m0\u001b[39m].input_shape\n", - "\u001b[36mFile \u001b[39m\u001b[32m/var/data/python/lib/python3.12/site-packages/keras/src/layers/layer.py:230\u001b[39m, in \u001b[36mLayer.__new__..build_wrapper\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 228\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m obj._open_name_scope():\n\u001b[32m 229\u001b[39m obj._path = current_path()\n\u001b[32m--> \u001b[39m\u001b[32m230\u001b[39m \u001b[43moriginal_build_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 231\u001b[39m \u001b[38;5;66;03m# Record build config.\u001b[39;00m\n\u001b[32m 232\u001b[39m signature = inspect.signature(original_build_method)\n", - "\u001b[36mFile \u001b[39m\u001b[32m/var/data/python/lib/python3.12/site-packages/keras/src/models/sequential.py:195\u001b[39m, in \u001b[36mSequential.build\u001b[39m\u001b[34m(self, input_shape)\u001b[39m\n\u001b[32m 193\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m layer \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m._layers[\u001b[32m1\u001b[39m:]:\n\u001b[32m 194\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m195\u001b[39m x = \u001b[43mlayer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 196\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m:\n\u001b[32m 197\u001b[39m \u001b[38;5;66;03m# Can happen if shape inference is not implemented.\u001b[39;00m\n\u001b[32m 198\u001b[39m \u001b[38;5;66;03m# TODO: consider reverting inbound nodes on layers processed.\u001b[39;00m\n\u001b[32m 199\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[81]\u001b[39m\u001b[32m, line 76\u001b[39m\n\u001b[32m 73\u001b[39m model.save(\u001b[33m\"\u001b[39m\u001b[33m1d_cnn_model.h5\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 75\u001b[39m \u001b[38;5;66;03m# Запуск обучения 1D CNN\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m76\u001b[39m \u001b[43mtask3_1d_cnn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[81]\u001b[39m\u001b[32m, line 56\u001b[39m, in \u001b[36mtask3_1d_cnn\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m 47\u001b[39m model.compile(optimizer=Adam(learning_rate=\u001b[32m0.001\u001b[39m),\n\u001b[32m 48\u001b[39m loss=\u001b[33m'\u001b[39m\u001b[33mcategorical_crossentropy\u001b[39m\u001b[33m'\u001b[39m,\n\u001b[32m 49\u001b[39m metrics=[\u001b[33m'\u001b[39m\u001b[33maccuracy\u001b[39m\u001b[33m'\u001b[39m])\n\u001b[32m 51\u001b[39m \u001b[38;5;66;03m# X_train = np.transpose(X_train, (0, 2, 1))\u001b[39;00m\n\u001b[32m 52\u001b[39m \u001b[38;5;66;03m# X_val = np.transpose(X_val, (0, 2, 1))\u001b[39;00m\n\u001b[32m 53\u001b[39m \u001b[38;5;66;03m# X_test = np.transpose(X_test, (0, 2, 1))\u001b[39;00m\n\u001b[32m 54\u001b[39m \n\u001b[32m 55\u001b[39m \u001b[38;5;66;03m# Обучение модели\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m56\u001b[39m history = \u001b[43mmodel\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 57\u001b[39m \u001b[43m \u001b[49m\u001b[43mvalidation_data\u001b[49m\u001b[43m=\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_val\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[32m 58\u001b[39m \u001b[43m \u001b[49m\u001b[43mepochs\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m50\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 59\u001b[39m \u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m32\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 60\u001b[39m \u001b[43m \u001b[49m\u001b[43mverbose\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 62\u001b[39m \u001b[38;5;66;03m# Оценка модели на тестовом наборе\u001b[39;00m\n\u001b[32m 63\u001b[39m y_pred = model.predict(X_test)\n", "\u001b[36mFile \u001b[39m\u001b[32m/var/data/python/lib/python3.12/site-packages/keras/src/utils/traceback_utils.py:122\u001b[39m, in \u001b[36mfilter_traceback..error_handler\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 119\u001b[39m filtered_tb = _process_traceback_frames(e.__traceback__)\n\u001b[32m 120\u001b[39m \u001b[38;5;66;03m# To get the full stack trace, call:\u001b[39;00m\n\u001b[32m 121\u001b[39m \u001b[38;5;66;03m# `keras.config.disable_traceback_filtering()`\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m122\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m e.with_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 123\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m 124\u001b[39m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n", - "\u001b[36mFile \u001b[39m\u001b[32m/var/data/python/lib/python3.12/site-packages/keras/src/ops/operation_utils.py:221\u001b[39m, in \u001b[36mcompute_conv_output_shape\u001b[39m\u001b[34m(input_shape, filters, kernel_size, strides, padding, data_format, dilation_rate)\u001b[39m\n\u001b[32m 219\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;28mlen\u001b[39m(output_spatial_shape)):\n\u001b[32m 220\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m i \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m none_dims \u001b[38;5;129;01mand\u001b[39;00m output_spatial_shape[i] < \u001b[32m0\u001b[39m:\n\u001b[32m--> \u001b[39m\u001b[32m221\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 222\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mComputed output size would be negative. Received \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 223\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m`inputs shape=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00minput_shape\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m`, \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 224\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m`kernel shape=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkernel_shape\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m`, \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 225\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m`dilation_rate=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mdilation_rate\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m`.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 226\u001b[39m )\n\u001b[32m 227\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m padding == \u001b[33m\"\u001b[39m\u001b[33msame\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m padding == \u001b[33m\"\u001b[39m\u001b[33mcausal\u001b[39m\u001b[33m\"\u001b[39m:\n\u001b[32m 228\u001b[39m output_spatial_shape = np.floor((spatial_shape - \u001b[32m1\u001b[39m) / strides) + \u001b[32m1\u001b[39m\n", - "\u001b[31mValueError\u001b[39m: Computed output size would be negative. Received `inputs shape=(None, 0, 64)`, `kernel shape=(3, 64, 32)`, `dilation_rate=[1]`." + "\u001b[36mFile \u001b[39m\u001b[32m/var/data/python/lib/python3.12/site-packages/keras/src/layers/input_spec.py:227\u001b[39m, in \u001b[36massert_input_compatibility\u001b[39m\u001b[34m(input_spec, inputs, layer_name)\u001b[39m\n\u001b[32m 222\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m axis, value \u001b[38;5;129;01min\u001b[39;00m spec.axes.items():\n\u001b[32m 223\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m value \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m shape[axis] \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m {\n\u001b[32m 224\u001b[39m value,\n\u001b[32m 225\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 226\u001b[39m }:\n\u001b[32m--> \u001b[39m\u001b[32m227\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 228\u001b[39m \u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33mInput \u001b[39m\u001b[38;5;132;01m{\u001b[39;00minput_index\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m of layer \u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mlayer_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\u001b[33m is \u001b[39m\u001b[33m'\u001b[39m\n\u001b[32m 229\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mincompatible with the layer: expected axis \u001b[39m\u001b[38;5;132;01m{\u001b[39;00maxis\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 230\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mof input shape to have value \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m, \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 231\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mbut received input with \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 232\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mshape \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mshape\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 233\u001b[39m )\n\u001b[32m 234\u001b[39m \u001b[38;5;66;03m# Check shape.\u001b[39;00m\n\u001b[32m 235\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m spec.shape \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[31mValueError\u001b[39m: Exception encountered when calling Sequential.call().\n\n\u001b[1mInput 0 of layer \"conv1d_24\" is incompatible with the layer: expected axis -1 of input shape to have value 3, but received input with shape (None, 3, 24)\u001b[0m\n\nArguments received by Sequential.call():\n • inputs=tf.Tensor(shape=(None, 3, 24), dtype=float32)\n • training=True\n • mask=None" ] } ], @@ -476,9 +498,12 @@ " y_val = to_categorical(y_val, num_classes)\n", " y_test = to_categorical(y_test, num_classes)\n", "\n", + " # strategy = tf.distribute.get_strategy()\n", + " # with strategy.scope():\n", + "\n", " # Построение модели 1D CNN\n", " model = Sequential([\n", - " tf.keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(3, 24)), # Corrected input shape\n", + " tf.keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(24, 3)), # Corrected input shape\n", " tf.keras.layers.MaxPooling1D(pool_size=2),\n", " tf.keras.layers.Conv1D(filters=32, kernel_size=3, activation='relu'),\n", " tf.keras.layers.MaxPooling1D(pool_size=2),\n", @@ -487,16 +512,15 @@ " tf.keras.layers.Dropout(0.5),\n", " tf.keras.layers.Dense(num_classes, activation='softmax')\n", " ])\n", - "\n", " # Компиляция модели\n", " model.compile(optimizer=Adam(learning_rate=0.001),\n", " loss='categorical_crossentropy',\n", " metrics=['accuracy'])\n", "\n", - " X_train = np.transpose(X_train, (0, 2, 1))\n", - " X_val = np.transpose(X_val, (0, 2, 1))\n", - " X_test = np.transpose(X_test, (0, 2, 1))\n", - " \n", + " # X_train = np.transpose(X_train, (0, 2, 1))\n", + " # X_val = np.transpose(X_val, (0, 2, 1))\n", + " # X_test = np.transpose(X_test, (0, 2, 1))\n", + "\n", " # Обучение модели\n", " history = model.fit(X_train, y_train,\n", " validation_data=(X_val, y_val),\n",