Skip to content

Commit 9789502

Browse files
committed
finish problem statement
1 parent d4e532f commit 9789502

File tree

5 files changed

+115
-91
lines changed

5 files changed

+115
-91
lines changed

Udeneev2025Surrogate.pdf

8 KB
Binary file not shown.

code/train_models.ipynb

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -445,44 +445,53 @@
445445
},
446446
"outputs": [],
447447
"source": [
448-
"def evaluate_and_save_results(models, architectures, batch_size=1024, num_workers=6, folder_name=\"results\"):\n",
448+
"def evaluate_and_save_results(\n",
449+
" models, architectures, valid_loader, folder_name=\"results\"\n",
450+
"):\n",
451+
" \"\"\"\n",
452+
" Оценивает модели на валидационном наборе данных и сохраняет результаты в файлы JSON.\n",
453+
" Аргументы:\n",
454+
" models (list): Список обученных моделей.\n",
455+
" architectures (list): Список архитектур моделей.\n",
456+
" valid_loader (DataLoader): DataLoader для валидационных данных.\n",
457+
" folder_name (str, необязательно): Имя папки для сохранения результатов. По умолчанию \"results\".\n",
458+
" Исключения:\n",
459+
" ValueError: Если количество моделей и архитектур не совпадает.\n",
460+
" Результаты:\n",
461+
" Для каждой модели создается файл JSON с результатами, содержащий:\n",
462+
" - architecture: Архитектура модели.\n",
463+
" - valid_predictions: Предсказания модели на валидационном наборе данных.\n",
464+
" - valid_accuracy: Точность модели на валидационном наборе данных.\n",
465+
" \"\"\"\n",
449466
" if len(models) != len(architectures):\n",
450467
" raise ValueError(\"Количество моделей и архитектур должно совпадать\")\n",
451468
"\n",
452469
" device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
453470
" os.makedirs(folder_name, exist_ok=True)\n",
454471
"\n",
455-
" transform = transforms.Compose([\n",
456-
" transforms.ToTensor(),\n",
457-
" transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261)),\n",
458-
" ])\n",
459-
" test_dataset = CIFAR10(root=\"./data\", train=False, download=True, transform=transform)\n",
460-
" test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=num_workers)\n",
461-
"\n",
462472
" for i, (model, architecture) in enumerate(zip(models, architectures)):\n",
463473
" model.to(device)\n",
464474
" model.eval()\n",
465475
"\n",
466-
" test_correct = 0\n",
467-
" test_total = 0\n",
468-
" test_preds = []\n",
476+
" valid_correct = 0\n",
477+
" valid_total = 0\n",
478+
" valid_preds = []\n",
469479
"\n",
470-
" # Оценка на тестовом датасете\n",
471480
" with torch.no_grad():\n",
472-
" for images, labels in test_loader:\n",
481+
" for images, labels in valid_loader:\n",
473482
" images, labels = images.to(device), labels.to(device)\n",
474483
" outputs = model(images)\n",
475484
" _, predicted = torch.max(outputs, 1)\n",
476-
" test_preds.extend(predicted.cpu().tolist())\n",
477-
" test_correct += (predicted == labels).sum().item()\n",
478-
" test_total += labels.size(0)\n",
479-
" \n",
480-
" test_accuracy = test_correct / test_total\n",
485+
" valid_preds.extend(predicted.cpu().tolist())\n",
486+
" valid_correct += (predicted == labels).sum().item()\n",
487+
" valid_total += labels.size(0)\n",
488+
"\n",
489+
" valid_accuracy = valid_correct / valid_total\n",
481490
"\n",
482491
" result = {\n",
483492
" \"architecture\": architecture,\n",
484-
" \"test_predictions\": test_preds,\n",
485-
" \"test_accuracy\": test_accuracy\n",
493+
" \"valid_predictions\": valid_preds,\n",
494+
" \"valid_accuracy\": valid_accuracy,\n",
486495
" }\n",
487496
"\n",
488497
" file_name = f\"model_{i+1}_results.json\"\n",
@@ -491,7 +500,7 @@
491500
" with open(file_path, \"w\") as f:\n",
492501
" json.dump(result, f, indent=4)\n",
493502
"\n",
494-
" print(f\"Results for model_{i + 1} saved to {file_path}\")\n"
503+
" print(f\"Results for model_{i + 1} saved to {file_path}\")"
495504
]
496505
},
497506
{
@@ -630,7 +639,7 @@
630639
"sourceType": "notebook"
631640
},
632641
"kernelspec": {
633-
"display_name": "Python 3",
642+
"display_name": "usr",
634643
"language": "python",
635644
"name": "python3"
636645
},
@@ -644,7 +653,7 @@
644653
"name": "python",
645654
"nbconvert_exporter": "python",
646655
"pygments_lexer": "ipython3",
647-
"version": "3.10.12"
656+
"version": "3.12.3"
648657
}
649658
},
650659
"nbformat": 4,

code/train_models.py

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -118,66 +118,52 @@ def train_model(
118118
return model
119119

120120
def evaluate_and_save_results(
121-
models, architectures, batch_size=512, num_workers=6, folder_name="results"
121+
models, architectures, valid_loader, folder_name="results"
122122
):
123123
"""
124-
Оценивает модели на тестовом наборе данных CIFAR-10 и сохраняет результаты в файлы JSON.
124+
Оценивает модели на валидационном наборе данных и сохраняет результаты в файлы JSON.
125125
Аргументы:
126126
models (list): Список обученных моделей.
127127
architectures (list): Список архитектур моделей.
128-
batch_size (int, необязательно): Размер батча для загрузчика данных. По умолчанию 1024.
129-
num_workers (int, необязательно): Количество потоков для загрузчика данных. По умолчанию 6.
128+
valid_loader (DataLoader): DataLoader для валидационных данных.
130129
folder_name (str, необязательно): Имя папки для сохранения результатов. По умолчанию "results".
131130
Исключения:
132131
ValueError: Если количество моделей и архитектур не совпадает.
133132
Результаты:
134133
Для каждой модели создается файл JSON с результатами, содержащий:
135134
- architecture: Архитектура модели.
136-
- test_predictions: Предсказания модели на тестовом наборе данных.
137-
- test_accuracy: Точность модели на тестовом наборе данных.
135+
- valid_predictions: Предсказания модели на валидационном наборе данных.
136+
- valid_accuracy: Точность модели на валидационном наборе данных.
138137
"""
139138
if len(models) != len(architectures):
140139
raise ValueError("Количество моделей и архитектур должно совпадать")
141140

142141
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
143142
os.makedirs(folder_name, exist_ok=True)
144143

145-
transform = transforms.Compose(
146-
[
147-
transforms.ToTensor(),
148-
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261)),
149-
]
150-
)
151-
test_dataset = CIFAR10(
152-
root="./data", train=False, download=True, transform=transform
153-
)
154-
test_loader = DataLoader(
155-
test_dataset, batch_size=batch_size, shuffle=False, num_workers=num_workers
156-
)
157-
158144
for i, (model, architecture) in enumerate(zip(models, architectures)):
159145
model.to(device)
160146
model.eval()
161147

162-
test_correct = 0
163-
test_total = 0
164-
test_preds = []
148+
valid_correct = 0
149+
valid_total = 0
150+
valid_preds = []
165151

166152
with torch.no_grad():
167-
for images, labels in test_loader:
153+
for images, labels in valid_loader:
168154
images, labels = images.to(device), labels.to(device)
169155
outputs = model(images)
170156
_, predicted = torch.max(outputs, 1)
171-
test_preds.extend(predicted.cpu().tolist())
172-
test_correct += (predicted == labels).sum().item()
173-
test_total += labels.size(0)
157+
valid_preds.extend(predicted.cpu().tolist())
158+
valid_correct += (predicted == labels).sum().item()
159+
valid_total += labels.size(0)
174160

175-
test_accuracy = test_correct / test_total
161+
valid_accuracy = valid_correct / valid_total
176162

177163
result = {
178164
"architecture": architecture,
179-
"test_predictions": test_preds,
180-
"test_accuracy": test_accuracy,
165+
"valid_predictions": valid_preds,
166+
"valid_accuracy": valid_accuracy,
181167
}
182168

183169
file_name = f"model_{i+1}_results.json"
@@ -195,8 +181,6 @@ def evaluate_and_save_results(
195181
batch_size=BATCH_SIZE
196182
) # Получаем загрузчики CIFAR10
197183

198-
models = []
199-
architectures = []
200184
for architecture in tqdm(arch_dicts):
201185
model = train_model( # Обучаем модель
202186
architecture,
@@ -205,10 +189,8 @@ def evaluate_and_save_results(
205189
max_epochs=MAX_EPOCHS,
206190
learning_rate=LEARNING_RATE,
207191
)
208-
models.append(model)
209-
architectures.append(architecture)
210192
clear_output(wait=True)
211-
212-
evaluate_and_save_results(
213-
models, architectures, batch_size=BATCH_SIZE
214-
) # Оцениваем и сохраняем архитектуры, предсказания на тестовом наборе CIFAR10 и accuracy
193+
194+
evaluate_and_save_results(
195+
[model], [architecture], valid_loader=search_valid_loader, folder_name="results"
196+
) # Оцениваем и сохраняем архитектуры, предсказания на тестовом наборе CIFAR10 и accuracy

0 commit comments

Comments
 (0)