ответвлено от main/neurocomputers-python
Загрузить файлы в «lab3»
Этот коммит содержится в:
@@ -12,7 +12,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "15BpjnZQzAUG"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"> Цель работы: знакомство с применением многослойного персептрона для решения задач сжатия данных, прогнозирования временных рядов и распознавания образов.\n",
|
"> Цель работы: знакомство с применением многослойного персептрона для решения задач сжатия данных, прогнозирования временных рядов и распознавания образов.\n",
|
||||||
">\n",
|
">\n",
|
||||||
@@ -27,7 +29,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "F1-sSuk2zAUI"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Импорт библиотек:"
|
"Импорт библиотек:"
|
||||||
]
|
]
|
||||||
@@ -42,11 +46,11 @@
|
|||||||
"source": [
|
"source": [
|
||||||
"import numpy as np\n",
|
"import numpy as np\n",
|
||||||
"import pandas as pd\n",
|
"import pandas as pd\n",
|
||||||
"import seaborn as sns\n",
|
|
||||||
"import torch\n",
|
"import torch\n",
|
||||||
"import matplotlib.pyplot as plt\n",
|
"import matplotlib.pyplot as plt\n",
|
||||||
"from IPython.display import clear_output\n",
|
"from IPython.display import clear_output\n",
|
||||||
"from mpl_toolkits.mplot3d import Axes3D\n",
|
"from mpl_toolkits.mplot3d import Axes3D\n",
|
||||||
|
"from sklearn.model_selection import train_test_split\n",
|
||||||
"\n",
|
"\n",
|
||||||
"from torch import nn\n",
|
"from torch import nn\n",
|
||||||
"\n",
|
"\n",
|
||||||
@@ -55,7 +59,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "GtZJ1mGmzAUL"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"### Содержание: \n",
|
"### Содержание: \n",
|
||||||
"[1. Подготовка данных](#p_1) \n",
|
"[1. Подготовка данных](#p_1) \n",
|
||||||
@@ -65,14 +71,18 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "HZNHPPKUzAUM"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"## 1. Подготовка данных<a id=\"p_1\"></a>"
|
"## 1. Подготовка данных<a id=\"p_1\"></a>"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "h2JqhwwrzAUN"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Загрузим в датафрейм `data` данные о сорока образцах минеральной воды, хранящиеся в файле `min_water.txt`."
|
"Загрузим в датафрейм `data` данные о сорока образцах минеральной воды, хранящиеся в файле `min_water.txt`."
|
||||||
]
|
]
|
||||||
@@ -86,7 +96,7 @@
|
|||||||
"height": 256
|
"height": 256
|
||||||
},
|
},
|
||||||
"id": "PkNWYbQCpsl_",
|
"id": "PkNWYbQCpsl_",
|
||||||
"outputId": "ee2dd8c3-2d7d-4962-bc40-a5cc2dded5db"
|
"outputId": "1de6457f-9cc1-42a1-b4f1-2c13c5b66100"
|
||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -96,7 +106,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "YjqpAWl9zAUR"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Вынесем в отдельные переменные:\n",
|
"Вынесем в отдельные переменные:\n",
|
||||||
" - `y_binary` — выходной признак для задачи бинарной классификации (первый столбец датафрейма);\n",
|
" - `y_binary` — выходной признак для задачи бинарной классификации (первый столбец датафрейма);\n",
|
||||||
@@ -120,7 +132,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "rpgOkJkPzAUT"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Выпишите в список `features` отобранные в прошлой лабораторной работе признаки (формат: `features = ['VAR1', 'VAR2']`):"
|
"Выпишите в список `features` отобранные в прошлой лабораторной работе признаки (формат: `features = ['VAR1', 'VAR2']`):"
|
||||||
]
|
]
|
||||||
@@ -128,7 +142,9 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "R0bIf4PUzAUT"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"features = # Ваш код здесь"
|
"features = # Ваш код здесь"
|
||||||
@@ -136,7 +152,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "ddwgNPoyzAUV"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Датафрейм с отобранными входными признаками `X_data_filtered`:"
|
"Датафрейм с отобранными входными признаками `X_data_filtered`:"
|
||||||
]
|
]
|
||||||
@@ -150,7 +168,7 @@
|
|||||||
"height": 206
|
"height": 206
|
||||||
},
|
},
|
||||||
"id": "d6eTUCk2Cjdc",
|
"id": "d6eTUCk2Cjdc",
|
||||||
"outputId": "d89643dd-a410-42b2-9b91-c4534966fd1d"
|
"outputId": "656c9a35-26f6-4425-b35e-ca06930abc82"
|
||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -162,7 +180,7 @@
|
|||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"source": [
|
"source": [
|
||||||
"Произведите нормализацию или стандартизацию (на выбор) отобранных входных данных `X_data_filtered`. Результат сохраните в переменную `X_data_preprocessed`, которую затем представьте в виде тензора `X_data_tensor`:"
|
"C помощью функции `train_test_split` разбейте данные (`X_data_filtered`, `y_multiclass`) на обучающую (`X_multiclass_train`, `y_multiclass_train`), валидационную (`X_multiclass_valid`, `y_multiclass_valid`) и тестовую выборки (`X_multiclass_test`, `y_multiclass_test`) с сохранением соотншений классов (сортов минеральной воды):"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -173,19 +191,37 @@
|
|||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"# Ваш код здесь\n",
|
"X_multiclass_train, X_multiclass_test, y_multiclass_train, y_multiclass_test = # Ваш код здесь\n",
|
||||||
"\n",
|
"\n",
|
||||||
"X_data_preprocessed = # Ваш код здесь\n",
|
"X_multiclass_train, X_multiclass_valid, y_multiclass_train, y_multiclass_valid = # Ваш код здесь"
|
||||||
"\n",
|
]
|
||||||
"X_data_tensor = # Ваш код здесь"
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {
|
||||||
|
"id": "LAOh4V56zAUV"
|
||||||
|
},
|
||||||
|
"source": [
|
||||||
|
"Произведите нормализацию или стандартизацию (на выбор) входных данных. Результат сохраните в переменные (`X_multiclass_train`, `X_multiclass_valid`, `X_multiclass_test`), которую затем представьте в виде тензоров:"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"X_means = # Ваш код здесь\n",
|
||||||
|
"X_stds = # Ваш код здесь\n",
|
||||||
|
"\n",
|
||||||
|
"X_multiclass_train = # Ваш код здесь\n",
|
||||||
|
"X_multiclass_valid = # Ваш код здесь\n",
|
||||||
|
"X_multiclass_test = # Ваш код здесь"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"colab": {
|
|
||||||
"base_uri": "https://localhost:8080/"
|
|
||||||
},
|
|
||||||
"id": "AtGktiZmJiUV",
|
"id": "AtGktiZmJiUV",
|
||||||
"outputId": "f9edb4f0-c5ab-4a62-af28-6552c981512f"
|
"outputId": "f9edb4f0-c5ab-4a62-af28-6552c981512f"
|
||||||
},
|
},
|
||||||
@@ -211,7 +247,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "asRgUuyNzAUY"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Допишите класс `Autoencoder` структурами энкодера и декодера на основе полносвязных слоёв `nn.Linear`. В качестве функций активации используйте `nn.ReLU()`. При этом на выходе энкодера функцию активации можно не применять — это позволит сохранить отрицательные значения в кодированном представлении."
|
"Допишите класс `Autoencoder` структурами энкодера и декодера на основе полносвязных слоёв `nn.Linear`. В качестве функций активации используйте `nn.ReLU()`. При этом на выходе энкодера функцию активации можно не применять — это позволит сохранить отрицательные значения в кодированном представлении."
|
||||||
]
|
]
|
||||||
@@ -219,7 +257,9 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "F297Z81wzAUY"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"class Autoencoder(nn.Module):\n",
|
"class Autoencoder(nn.Module):\n",
|
||||||
@@ -240,7 +280,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "R5sVUOy7zAUZ"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Создайте экземпляр модели с двумя нейронами в «узком горле»:"
|
"Создайте экземпляр модели с двумя нейронами в «узком горле»:"
|
||||||
]
|
]
|
||||||
@@ -248,7 +290,9 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "MlSSzk2yzAUa"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"model_2 = Autoencoder(# Ващ код здесь\n",
|
"model_2 = Autoencoder(# Ващ код здесь\n",
|
||||||
@@ -258,9 +302,6 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"colab": {
|
|
||||||
"base_uri": "https://localhost:8080/"
|
|
||||||
},
|
|
||||||
"id": "tGS2_TqjK_SI",
|
"id": "tGS2_TqjK_SI",
|
||||||
"outputId": "a1a63c33-5dd5-461e-8d20-97fc34455f21"
|
"outputId": "a1a63c33-5dd5-461e-8d20-97fc34455f21"
|
||||||
},
|
},
|
||||||
@@ -276,16 +317,18 @@
|
|||||||
"base_uri": "https://localhost:8080/"
|
"base_uri": "https://localhost:8080/"
|
||||||
},
|
},
|
||||||
"id": "Y3GS-3AaKYt7",
|
"id": "Y3GS-3AaKYt7",
|
||||||
"outputId": "981a4cd8-3b19-4bf6-ac07-ddd13e3df131"
|
"outputId": "81ecb257-7d72-443e-aa9e-256271a17a6e"
|
||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"model_2(X_data_tensor[:3])"
|
"model_2(X_multiclass_train[:3])"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "8hJk8GWIzAUb"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Удостоверимся, что размерность её выхода совпадает с размерностью её входа:"
|
"Удостоверимся, что размерность её выхода совпадает с размерностью её входа:"
|
||||||
]
|
]
|
||||||
@@ -293,15 +336,19 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "pDmdGMRZzAUc"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"assert X_data_tensor[:3].shape == model_2(X_data_tensor[:3]).shape"
|
"assert X_multiclass_train[:3].shape == model_2(X_multiclass_train[:3]).shape"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "IjoYYn-ozAUc"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Проверим, как модель обучается. Зададим оптимизатор и среднеквадратическую функцию потерь:"
|
"Проверим, как модель обучается. Зададим оптимизатор и среднеквадратическую функцию потерь:"
|
||||||
]
|
]
|
||||||
@@ -320,7 +367,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "HqcQqxN7zAUd"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Рассчитаем значение функции потерь:"
|
"Рассчитаем значение функции потерь:"
|
||||||
]
|
]
|
||||||
@@ -333,19 +382,21 @@
|
|||||||
"base_uri": "https://localhost:8080/"
|
"base_uri": "https://localhost:8080/"
|
||||||
},
|
},
|
||||||
"id": "5kKYW89_KY8j",
|
"id": "5kKYW89_KY8j",
|
||||||
"outputId": "94e90485-ca86-4204-e61d-75d247a87fc4"
|
"outputId": "a5ece716-5c89-4553-c78c-1e5c7e20eedf"
|
||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"decoded = model_2(X_data_tensor)\n",
|
"decoded = model_2(X_multiclass_train)\n",
|
||||||
"\n",
|
"\n",
|
||||||
"loss = criterion(decoded, X_data_tensor)\n",
|
"loss = criterion(decoded, X_multiclass_train)\n",
|
||||||
"loss"
|
"loss"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "JVplv7O8zAUd"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Выполните несколько раз эту и предыдущую ячейку, чтобы убедиться в уменьшении ошибки:"
|
"Выполните несколько раз эту и предыдущую ячейку, чтобы убедиться в уменьшении ошибки:"
|
||||||
]
|
]
|
||||||
@@ -365,7 +416,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "iXqI-DurzAUe"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Задайте параметры для обучения автоассоциативной сети с двумя нейронами в «узком горле»:"
|
"Задайте параметры для обучения автоассоциативной сети с двумя нейронами в «узком горле»:"
|
||||||
]
|
]
|
||||||
@@ -373,7 +426,9 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "5s4GjW_PzAUe"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"torch.manual_seed(seed=42)\n",
|
"torch.manual_seed(seed=42)\n",
|
||||||
@@ -391,7 +446,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "SN8PZ41vzAUp"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"**Обучение нейронной сети:**"
|
"**Обучение нейронной сети:**"
|
||||||
]
|
]
|
||||||
@@ -402,16 +459,21 @@
|
|||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"loss_history = []\n",
|
"loss_train_history, loss_valid_history = [], []\n",
|
||||||
"\n",
|
"\n",
|
||||||
"for epoch in range(epochs):\n",
|
"for epoch in range(epochs):\n",
|
||||||
" # Ваш код здесь\n",
|
" # Ваш код здесь\n",
|
||||||
"\n",
|
"\n",
|
||||||
|
" # Отключаем градиенты для этапа валидации\n",
|
||||||
|
" with torch.no_grad():\n",
|
||||||
|
" # Ваш код здесь\n",
|
||||||
|
"\n",
|
||||||
" if (epoch + 1) % 5 == 0:\n",
|
" if (epoch + 1) % 5 == 0:\n",
|
||||||
"\n",
|
"\n",
|
||||||
" clear_output(True)\n",
|
" clear_output(True)\n",
|
||||||
" plt.plot(range(1, epoch+2), loss_history, label='Loss')\n",
|
" plt.plot(range(1, epoch+2), loss_train_history, label='Train', color='green')\n",
|
||||||
" plt.title(f'Epoch: {epoch + 1}, Loss: {loss_history[-1]:.6f}')\n",
|
" plt.plot(range(1, epoch+2), loss_valid_history, label='Valid', color='red')\n",
|
||||||
|
" plt.title(f'Epoch: {epoch + 1}, Loss Train: {loss_train_history[-1]:.6f}, Loss Valid: {loss_valid_history[-1]:.6f}')\n",
|
||||||
" plt.grid(True, alpha=0.3)\n",
|
" plt.grid(True, alpha=0.3)\n",
|
||||||
" plt.legend(loc='best')\n",
|
" plt.legend(loc='best')\n",
|
||||||
" plt.show()"
|
" plt.show()"
|
||||||
@@ -420,6 +482,54 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Проверим качество обученной сети на тестовой выборке:"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "t-Xkwg4h3gyS",
|
||||||
|
"outputId": "ddfc13ae-f942-4328-9036-92b318c726bc"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"with torch.no_grad():\n",
|
||||||
|
" decoded_test = model_2(X_multiclass_test)\n",
|
||||||
|
" loss_test = criterion(decoded_test, X_multiclass_test)\n",
|
||||||
|
"\n",
|
||||||
|
"print(f'Loss Test: {loss_test.item():.6f}')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Далее необходимо через обученную сети пропустить все имеющиеся входные данные. Здесь можно сконкатенировать обучающую, валидационную и тестовую выборки, но можно и заново стандартизировать исходные данные `X_data_filtered` с помощью переменных `X_means` и `X_stds`, которые обязательно должны быть ранее рассчитаны на обучающей выборке `X_multiclass_train` (аналогично будет и для нормировки данных). Результат будет прелставлен в виде тензора.\n",
|
||||||
|
"\n",
|
||||||
|
"Такой вариант сохранит исходный порядок записей в данных и позволит нам использовать исходный вектор `y_multiclass` для разметки классов ниже."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"id": "0RbKOwMeZUcn"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"X_data_tensor = torch.tensor(((X_data_filtered - X_means) / X_stds).values).float()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {
|
||||||
|
"id": "TrWOUf0vzAUq"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"После обучения сети получим двумерные данные с выхода энкодера:"
|
"После обучения сети получим двумерные данные с выхода энкодера:"
|
||||||
]
|
]
|
||||||
@@ -432,7 +542,7 @@
|
|||||||
"base_uri": "https://localhost:8080/"
|
"base_uri": "https://localhost:8080/"
|
||||||
},
|
},
|
||||||
"id": "HFcSAdGoOaog",
|
"id": "HFcSAdGoOaog",
|
||||||
"outputId": "36330737-7606-4a6a-e532-6bf372deb34d"
|
"outputId": "1233f17c-2188-402e-d1dc-697dc6c0bfb4"
|
||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -442,7 +552,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "GjtM4NXLzAUr"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Построим двумерную диаграмму рассеяния и отметим классы с помощью `y_multiclass`:"
|
"Построим двумерную диаграмму рассеяния и отметим классы с помощью `y_multiclass`:"
|
||||||
]
|
]
|
||||||
@@ -456,7 +568,7 @@
|
|||||||
"height": 430
|
"height": 430
|
||||||
},
|
},
|
||||||
"id": "KkToPCInQQ1J",
|
"id": "KkToPCInQQ1J",
|
||||||
"outputId": "244bae8a-94a9-4817-a564-69c630efea98"
|
"outputId": "8469b911-292a-4016-fbd3-38f92997adad"
|
||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -472,7 +584,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "t0EmzLHXzAUs"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"По аналогии обучите автоассоциативную сеть с тремя нейронами в «узком горле»:"
|
"По аналогии обучите автоассоциативную сеть с тремя нейронами в «узком горле»:"
|
||||||
]
|
]
|
||||||
@@ -480,7 +594,9 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "WasLielLzAUt"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"torch.manual_seed(seed=42)\n",
|
"torch.manual_seed(seed=42)\n",
|
||||||
@@ -493,7 +609,9 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "cFxc9xD-zAUt"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"# Ваш код здесь"
|
"# Ваш код здесь"
|
||||||
@@ -501,15 +619,19 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "18f786y5zAUv"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"После обучения сети получите трёхмерные данные с выхода энкодера:"
|
"После обучения сети получите трёхмерные данные с выхода энкодера (снова по всем данным `X_data_tensor`, которые уже были подготовлены выше):"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "PLjKuu-szAUw"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"encoded_3d = # Ваш код здесь"
|
"encoded_3d = # Ваш код здесь"
|
||||||
@@ -517,7 +639,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "BYn45sTnzAUx"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Построим трёхмерную диаграмму рассеяния:"
|
"Построим трёхмерную диаграмму рассеяния:"
|
||||||
]
|
]
|
||||||
@@ -531,7 +655,7 @@
|
|||||||
"height": 653
|
"height": 653
|
||||||
},
|
},
|
||||||
"id": "RpqVg5EeT72I",
|
"id": "RpqVg5EeT72I",
|
||||||
"outputId": "2f5e070d-aa49-4eab-cd8e-277bd3a2c4b5"
|
"outputId": "7b9aac3c-68d5-44d7-db56-8f7a53e3aa37"
|
||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -561,7 +685,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "NNWL9ZakzAUy"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Сохраним в бинарные файлы `.npy` выходы энкодеров обеих моделей — для следующей лабораторной работы:"
|
"Сохраним в бинарные файлы `.npy` выходы энкодеров обеих моделей — для следующей лабораторной работы:"
|
||||||
]
|
]
|
||||||
@@ -569,7 +695,9 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "p2Zx-Jz4zAUz"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"np.save('encoded_2d.npy', encoded_2d)\n",
|
"np.save('encoded_2d.npy', encoded_2d)\n",
|
||||||
@@ -578,14 +706,18 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "K-pYtaxBzAUz"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"## 3. Автоассоциативная нейронная сеть на неполных данных<a id=\"p_3\"></a>"
|
"## 3. Автоассоциативная нейронная сеть на неполных данных<a id=\"p_3\"></a>"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "J3RSV5WDzAU0"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Выберите класс, который нужно исключить:"
|
"Выберите класс, который нужно исключить:"
|
||||||
]
|
]
|
||||||
@@ -593,7 +725,9 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "_UuEf5TRzAU0"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"label_to_exclude = # Ваш код здесь"
|
"label_to_exclude = # Ваш код здесь"
|
||||||
@@ -601,7 +735,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "MmlBKShgzAU1"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Создадим маску для исключения данных этого класса:"
|
"Создадим маску для исключения данных этого класса:"
|
||||||
]
|
]
|
||||||
@@ -619,7 +755,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "SA3A39ARzAU1"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"Данные исключены:"
|
"Данные исключены:"
|
||||||
]
|
]
|
||||||
@@ -628,22 +766,60 @@
|
|||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"colab": {
|
"id": "I7sTKdWgQRWQ"
|
||||||
"base_uri": "https://localhost:8080/"
|
|
||||||
},
|
|
||||||
"id": "I7sTKdWgQRWQ",
|
|
||||||
"outputId": "95d2a292-7e2f-401e-e473-7d5f09b0d7fb"
|
|
||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"X_data_tensor[mask_to_exclude].shape"
|
"X_data_include = X_data_filtered.loc[mask_to_exclude, :]\n",
|
||||||
|
"y_include = y_multiclass[mask_to_exclude]"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"source": [
|
"source": [
|
||||||
"По аналогии с предыдущим пунктом реализуйте обучение автоассоциативных сетей с двумя и тремя нейронами в «узком горле» на неполных данных (т.е. на каждой эпохе вместо полных данных `X_data_tensor` на модель нужно подавать неполные данные `X_data_tensor[mask_to_exclude]`).\n",
|
"По аналогии с помощью функции `train_test_split` разбейте данные (`X_data_include`, `y_include`) на обучающую (`X_include_train`, `y_include_train`), валидационную (`X_include_valid`, `y_include_valid`) и тестовую выборки (`X_include_test`, `y_include_test`) с сохранением соотншений классов:"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"X_include_train, X_include_test, y_include_train, y_include_test = # Ваш код здесь\n",
|
||||||
|
"\n",
|
||||||
|
"X_include_train, X_include_valid, y_include_train, y_include_valid = # Ваш код здесь"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Обратите внимание, что `X_means` и `X_stds` перерасчитываются уже на другой по составу обучающей выборке."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"X_means = # Ваш код здесь\n",
|
||||||
|
"X_stds = # Ваш код здесь\n",
|
||||||
|
"\n",
|
||||||
|
"X_include_train = # Ваш код здесь\n",
|
||||||
|
"X_include_valid = # Ваш код здесь\n",
|
||||||
|
"X_include_test = # Ваш код здесь"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {
|
||||||
|
"id": "V2MUFTkczAU2"
|
||||||
|
},
|
||||||
|
"source": [
|
||||||
|
"По аналогии с предыдущим пунктом реализуйте обучение автоассоциативных сетей с двумя и тремя нейронами в «узком горле».\n",
|
||||||
"\n",
|
"\n",
|
||||||
"Результаты выходов энкодеров в обоих случаях также сохраните в отдельные бинарные файлы."
|
"Результаты выходов энкодеров в обоих случаях также сохраните в отдельные бинарные файлы."
|
||||||
]
|
]
|
||||||
@@ -651,7 +827,9 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "qnSnyqNGzAU2"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"# Ваш код здесь"
|
"# Ваш код здесь"
|
||||||
@@ -660,12 +838,41 @@
|
|||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"id": "MMW6h5P1zAU3"
|
||||||
|
},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"# Ваш код здесь"
|
"# Ваш код здесь"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Обратите внимание, что тензор `X_data_tensor` снова получен из исходных данных `X_data_filtered`, но уже с пересчитанными `X_means` и `X_stds` (без одного класса):"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"id": "1FjpRmrCaOp4"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"X_data_tensor = torch.tensor(((X_data_filtered - X_means) / X_stds).values).float()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"encoded_2d_include = # Ваш код здесь"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
@@ -678,8 +885,38 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# Ваш код здесь"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"encoded_3d_include = # Ваш код здесь"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"np.save('encoded_2d_include.npy', encoded_2d_include)\n",
|
||||||
|
"np.save('encoded_3d_include.npy', encoded_3d_include)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {
|
||||||
|
"id": "-BXig37czAU6"
|
||||||
|
},
|
||||||
"source": [
|
"source": [
|
||||||
"### Литература:\n",
|
"### Литература:\n",
|
||||||
"1. Бородкин А.А., Елисеев В.Л. Основы и применение искусственных нейронных сетей. Сборник лабораторных работ: методическое пособие. – М.: Издательский дом МЭИ, 2017.\n",
|
"1. Бородкин А.А., Елисеев В.Л. Основы и применение искусственных нейронных сетей. Сборник лабораторных работ: методическое пособие. – М.: Издательский дом МЭИ, 2017.\n",
|
||||||
@@ -689,10 +926,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
"source": [
|
"id": "-KIqZEHczAU6"
|
||||||
" "
|
},
|
||||||
]
|
"source": []
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"metadata": {
|
"metadata": {
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user