Физтех.Статистика
Скачать ipynb
Введение в анализ данных¶
Домашнее задание 5. Компьютерное зрение & генеративные модели¶
Правила, прочитайте внимательно:
- Выполненную работу нужно отправить телеграм-боту
@miptstats_ds24_bot
. Для начала работы с ботом каждый раз отправляйте/start
. Работы, присланные иным способом, не принимаются. - Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.
- Прислать нужно ноутбук в формате
ipynb
. - Следите за размером файлов. Бот не может принимать файлы весом более 20 Мб. Если файл получается больше, заранее разделите его на несколько.
- Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания все участники списывания будут сдавать устный зачет.
- Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.
- Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.
- Комментарии к решению пишите в markdown-ячейках.
- Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.
- Если код будет не понятен проверяющему, оценка может быть снижена.
- Никакой код из данного задания при проверке запускаться не будет. Если код студента не выполнен, недописан и т.д., то он не оценивается.
Баллы за задание:
- Задача 1 — 150 баллов
- Задача 2 — 40 баллов
Баллы учитываются в факультативной части курса и не влияют на оценку по основной части.
# Bot check
# HW_ID: fpmi_ad5
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.
# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше.
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.
# Никакие значения в этой ячейке не влияют на факт сдачи работы.
!pip install torchinfo
import time
import warnings
from collections import defaultdict
from tqdm import tqdm
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import torch
from torch import nn
import torchvision
from torchvision import transforms
from torchinfo import summary
from IPython.display import clear_output
sns.set(font_scale=1, style="darkgrid", palette="Set2")
warnings.simplefilter("ignore")
device = f"cuda" if torch.cuda.is_available() else "cpu"
print(device)
Перед выполнением задания обязательно посмотрите презентацию и ноутбук про сверточные сети и классификацию, а так же презентацию и ноутбук про перенос стиля и генеративные сети.
Задача 1. Классификация MNIST¶
Цель: сравнить сверточные нейросети с разными параметрами на датасете рукописных цифр MNIST. В нем содержатся черно-белые изображения цифр, всего 10 классов для каждой цифры. Пользоваться кодом семинара можно без ограничений. Классификация MNIST намного легче, чем CIFAR, поэтому ваша задача хотя бы в одной из моделей получить 98% точности на валидации.
Использования слоев с семинара (свертка, pooling) более чем достаточно для достижения 98% точности на тесте. Также не делайте сеть глубокой.
Тестируйте работоспособность кода на CPU с небольшим кол-вом итераций. Если все работает, и хочется ускорить процесс, переходите на GPU.
Следуйте указаниям ниже.
Загрузим датаcет из torchvision.datasets
.
# Данные для обучения
train_dataset = torchvision.datasets.MNIST(
root="./data", train=True, download=True, transform=transforms.ToTensor()
)
# Данные для тестирования
val_dataset = torchvision.datasets.MNIST(
root="./data", train=False, download=True, transform=transforms.ToTensor()
)
# Классы объектов в датасете
classes = [str(i) for i in range(10)]
Визуализируйте несколько картинок с соответствующими метками из датасета.
Создайте генераторы батчей.
Эксперимент 1. Создайте хотя бы 5 сверточных нейросетей с разным количеством линейных и сверточных слоев. Должен присутствовать хотя бы 1 сверточный слой и хотя бы 1 линейный слой. Для каждой посмотрите количество параметров с помощью torchinfo.summary
.
Обучите сети, используя функцию потерь nn.CrossEntropyLoss
и оптимизатор torch.optim.Adam
с дефолтными параметрами.
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(simple_cnn.parameters())
<...>
Постройте график лосса и график accuracy, где сравниваются все модели (на train и на val). Нужная функция есть в семинаре.
Сделайте вывод. Как количество разных слоев влияет на качество и время обучения?
Вывод по эксперименту 1: <...>
Эксперимент 2. Теперь выберите лучший вариант, зафиксируйте это количество сверточных и линейных слоев и обучите хотя бы 4 сверточных нейросети, варьируя размеры ядер сверток. Например, в разном порядке поставьте ядра 3x3, 5x5.
Постройте график лосса и график accuracy, где сравниваются все модели этого эксперимента (на train и на val).
Сделайте вывод. Как размеры ядер влияют на качество и время обучения?
Вывод по эксперименту 2: <...>
Анализ лучшей модели. Выберите лучшую конфигурацию из всех по accuracy на валидации. Она должна быть не меньше 98%.
Проведите еще один проход валидации выбранной моделью по всему датасету. В нем посчитайте точность по каждому классу и соберите информацию о неправильных предсказаниях. Равномерна ли точность по отношению к классам? Покажите 10-20 примеров, на которых нейросеть выдала неправильную метку. Что можно о них сказать?
Ответ: <...>
Вывод по всей задаче: <...>
Задача 2. Перенос стиля¶
Здесь вы потренируетесь в работе с картинками и составлением промптов. Используя код с семинара, проведите перенос стиля на хотя бы 3 своих примерах.
Заметьте, что в примерах с семинара в качестве картинок стиля и контента использовались картинки среднего разрешения. Если возникают проблемы: оптимизация останавливается на 0-й эпохе и не создает картинку; loss в какой-то момент стал nan; нехватка RAM; — то либо уменьшите разрешение ваших картинок, либо попробуйте картинку полегче.
Теперь для каждой пары контекст-стиль попытайтесь сгенерировать картинку с таким контекстом и стилем с помощью диффузионной модели, рассмотренной на семинаре, задав нужный промпт.
Вывод: <...>