Комп’ютерний зір 🔥PyTorch

Технології комп’ютерного зору

Автор
Приналежність

Ігор Мірошниченко

КНУ імені Тараса Шевченка

Примітка

Вам не потрібно дотримуватися єдиного способу вирішення задачі. Використовуйте свій власний стиль кодування та експериментуйте з різними підходами.

Класифікація

  1. Створіть набір даних для бінарної класифікації за допомогою sklearn та функції make_moons().

    • Для узгодженості набір даних повинен містити 1000 зразків й власно обраний random_state.
    • Перетворіть дані в тензори PyTorch.
    • Розділіть дані на навчальний і тестовий набори за допомогою train_test_split: 80% навчальна та 20% тестова.
  2. Побудуйте модель, підклас nn.Module, яка включає нелінійні функції активації та здатна підганяти дані, створені вами в пункті 1.

    • Ви можете використовувати будь-яку комбінацію шарів PyTorch (лінійних і нелінійних) на свій розсуд.
  3. Налаштуйте функцію втрат, сумісну з бінарною класифікацією, та оптимізатор для використання під час навчання моделі, побудованої в пункті 2.

  4. Створіть цикл навчання та тестування.

    • Виконайте прямий прохід моделі, щоб побачити, що виходить у вигляді логітів, ймовірностей прогнозування та міток.
    • Щоб виміряти точність моделі, ви можете створити власну функцію точності або використовувати функцію точності в TorchMetrics.
    • Навчіть модель достатньо довго, щоб вона досягла точності понад 96%.
    • Цикл навчання повинен виводити прогрес кожні 10 епох навчання моделі, а також втрати та точність тестового набору.
  5. Зробіть прогнози за допомогою навченої моделі та побудуйте їх графік за допомогою функції plot_decision_boundary().

Код функції plot_decision_boundary() для візуалізації межі прийняття рішень
import matplotlib.pyplot as plt
import numpy as np

def plot_decision_boundary(model, X, y):
    """
    Функція для візуалізації межі прийняття рішень моделі.
    
    Аргументи:
    model -- навчена модель PyTorch
    X -- вхідні дані (тензор)
    y -- мітки (тензор)
    """
1    model.to("cpu")
    X, y = X.to("cpu"), y.to("cpu")

2    x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
    y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, 101),
                         np.linspace(y_min, y_max, 101))

3    X_to_pred_on = torch.from_numpy(np.column_stack((xx.ravel(), yy.ravel()))).float()

4    model.eval()
    with torch.inference_mode():
        y_logits = model(X_to_pred_on)

5    if len(torch.unique(y)) > 2:
        y_pred = torch.softmax(y_logits, dim=1).argmax(dim=1)
    else:
        y_pred = torch.round(torch.sigmoid(y_logits))
    
6    y_pred = y_pred.reshape(xx.shape).detach().numpy()
    plt.contourf(xx, yy, y_pred, cmap=plt.cm.RdYlBu, alpha=0.7)
    plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.RdYlBu)
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
1
Перенести все на CPU (краще працює з NumPy + Matplotlib)
2
Джерело (з модифікаціями)
3
Створення фічей для прогнозування
4
Прогнозування
5
Перевірка на багатокласовість або бінарність та перетворення логітів до міток прогнозування
6
Візуалізація
  1. Відтворіть функцію активації Tanh (гіперболічна тангенс) у чистому PyTorch.
  2. Створіть набір даних з декількома класами, використовуючи функцію створення даних спіралей з CS231n (код див. нижче).
    • Розділіть дані на навчальні та тестові набори (80% / 20%), а також перетворіть їх у тензори PyTorch.
    • Створіть модель, здатну оцінити дані (може знадобитися комбінація лінійних і нелінійних шарів).
    • Створіть функцію втрат і оптимізатор, здатні обробляти багатокласові дані1.
    • Створіть цикл навчання та тестування для багатокласових даних і навчіть модель на ньому, щоб досягти точності тестування понад 95% (ви можете використовувати будь-яку функцію вимірювання точності, яка вам подобається) — 1000 епох має бути достатньо.
    • Намалюйте межі прийняття рішень на наборі даних спіралей з прогнозів вашої моделі, функція plot_decision_boundary() також повинна працювати для цього набору даних.
Код для створення спірального набору даних з CS231n
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

red_pink   = "#e64173"
turquoise  = "#20B2AA"
orange     = "#FFA500"
np.random.seed(73)
1N = 100
2D = 2
3K = 3
4X = np.zeros((N*K,D))
5y = np.zeros(N*K, dtype='uint8')

for j in range(K):
  ix = range(N*j,N*(j+1))
6  r = np.linspace(0.0,1,N)
7  t = np.linspace(j*4,(j+1)*4,N) + np.random.randn(N)*0.2
  X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
  y[ix] = j

plt.figure(figsize=(1.9,3))
plt.scatter(X[:, 0], X[:, 1],
             c=y, s=40, cmap=ListedColormap([red_pink, turquoise, orange]))
plt.show()
1
Кількість точок на клас
2
Кількість вимірів (фіч)
3
Кількість класів
4
Ініціалізація матриці фіч
5
Ініціалізація вектору міток
6
Радіус (від 0 до 1)
7
\(\theta\) — кутова координата (з шумом)

Комп’ютерний зір

  1. Завантажте набір даних Places3652 за допомогою torchvision.datasets і розділіть його на навчальний і тестовий набори.
  2. Visualize at least 5 random images from the dataset along with their corresponding labels.
  3. Передайте навчальну та тестову вибірки в DataLoader з розміром батчу 32.
  4. Відтворіть модель з лекції і навчіть її на навчальному наборі даних.
  5. Навчіть модель, яку ви створили, протягом 5 епох на CPU та GPU і подивіться, скільки часу це займе на кожному з них.
  6. Зробіть прогнози, використовуючи навчену модель, і візуалізуйте принаймні 5 з них, порівнюючи прогноз із цільовою міткою.
  7. Побудуйте матрицю невідповідності, порівнюючи прогнози вашої моделі з істинними мітками.
  8. Створіть випадковий тензор форми [1, 3, 64, 64] і пропустіть його через шар nn.Conv2d() з різними налаштуваннями гіперпараметрів (це можуть бути будь-які налаштування на ваш вибір). Що ви помітите, якщо параметр kernel_size збільшиться або зменшиться?

Примітки

  1. Опціонально: використовуйте оптимізатор Adam замість SGD, можливо, доведеться поекспериментувати з різними значеннями швидкості навчання, щоб він запрацював↩︎

  2. Якщо ви не можете завантажити повний набір даних Places365 через обмеження пропускної здатності, ви можете використовувати менший піднабір або інший доступний набір даних з torchvision.datasets, наприклад, CIFAR-10. Але не використовуйте “класику” MNIST.↩︎