<jupyter_start><jupyter_text>PyTorch basics  В этой тетрадке мы познакомимся с общими принципами построения нейронных сетей.**Цели тетрадки**1. Знакомство с базовыми слоями PyTorch1. Практика в построении и обучении сетей**(повтор) Материалы по pytorch:*** [PyTorch docs](https://pytorch.org/docs/stable/index.html)* [Классная статья про pytorch internal](http://blog.ezyang.com/2019/05/pytorch-internals/)  Prerequirements```pip install torch torchvision numpy matplotlib```<jupyter_code>import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset, DataLoader

from torchvision import transforms
from torchvision.datasets import MNIST

import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>Hello MNISTПрежде чем собирать сеть, давайте определим инстансы класса `Dataset`, которые будут возвращать примеры из тренировочной и валидационной выборок.  С помощью ячейки ниже, мы скачаем датасет [MNIST](http://yann.lecun.com/exdb/mnist/) в текущую директорию и сможем получать примеры из соответствующих объектов.<jupyter_code>transform_to_tensor = transforms.Compose([
    transforms.ToTensor()
])

mnist_train = MNIST(root='./', train=True, download=True, transform=transform_to_tensor)
mnist_val = MNIST(root='./', train=False, download=True, transform=transform_to_tensor)<jupyter_output><empty_output><jupyter_text>Посмотрим на несколько примеров из тренировочной выборки<jupyter_code>def show_examples(dataset: Dataset, num_examples: int = 4):
    fig, ax = plt.subplots(1, num_examples)
    
    for i in range(num_examples):
        img, label = dataset[i]
        ax[i].imshow(img[0])
        ax[i].set_title(f'label: {label}')
        ax[i].axis('off')
    plt.show()
    
    
show_examples(dataset=mnist_train)<jupyter_output><empty_output><jupyter_text>Задание 1 (бонус)**(0.4 балла, бонус)** Напишите свою версию датасета, который будет читать картинки с диска.  Подразумевается, что если вы написали свой датасет, то он будет использоваться при обучении вместо дефолтного `MNIST`.  Вам понадобится архив [Google Drive](https://drive.google.com/file/d/1DOtScRd7la_sJflLgoNa0vFUuhjlVHa7/view?usp=sharing):- /    - /train.csv    - /val.csv    - /train/{image_name}.png    - /val/{image_name}.pngCSV файлы содержат название файла и его лейбл: image_name, label.*Hint 1:* нужно унаследоваться от класса `Dataset` и переопределить методы `__getitem__` и `__len__`.Первый должен возвращать картинку и ее лейбл, а второй количество примеров в датасете.(На самом деле второй метод не обязателен для самого датасета, но он необходим для[семплера](https://pytorch.org/docs/stable/data.htmltorch.utils.data.RandomSampler),который используется даталоадером)(см. [PyTorch docs](https://pytorch.org/docs/stable/data.htmltorch.utils.data.Dataset),[PyTorch tutorual](https://pytorch.org/tutorials/recipes/recipes/custom_dataset_transforms_loader.html?highlight=dataset))  *Hint 2:* для работы с картиноками лучше использовать OpenCV: `pip install opencv-python-headless`.В частности [cv2.imread](https://docs.opencv.org/master/d4/da8/group__imgcodecs.htmlga288b8b3da0892bd651fce07b3bbd3a56).  *Hint 3:* обратите особое внимание на то, что возвращает функция `cv2.imread`<jupyter_code>class DatasetMNIST(Dataset):
    def __init__(self):
        pass

    def __len__(self):
        pass
    
    def __getitem__(self, index):
        pass<jupyter_output><empty_output><jupyter_text>Задание 2**(0.3 балла)** Напишите класс MLP сети из 3 линейных слоев, которая будет получать на входбатч картинок размера [BS, C, H, W]*Hint 1:* метод `reshape` поможет вытянуть картинку в вектор.  *Hint 2:* выход должен соответствовать количеству лейблов, то есть 10.  *Hint 3:* пачка линейных слоев подряд не имеет смысла без нелинейностей между ними.<jupyter_code>class CustomMLP(nn.Module):
    def __init__(self,
                 num_pixels_per_img: int = 784,  # hint: 28*28 == 784
                 ):
        super().__init__()
        
        # here you can init layers and stack them with nn.Sequential
#         layers = nn.Sequential([])
        
    def forward(self, x):
        # describe usage of layers here, be careful with input shape
        pass
    
    def compute_all(self, batch):
        pass<jupyter_output><empty_output><jupyter_text>Задание 3**(0.3 балла)** Напишите класс CNN сети из 3 сверточных слоев.*Hint 1:* на вход все те же батчи размера [BS, C, H, W]  *Hint 2:* описание сверточных слоев [PyTorch docs](https://pytorch.org/docs/stable/nn.htmlconvolution-layers)<jupyter_code>class CustomCNN(nn.Module):
    def __init__(self):
        super().__init__()
        
        # here you can init layers and stack them with nn.Sequential
#         layers = nn.Sequential([])
        
    def forward(self, x):
        # describe usage of layers here, be careful with input shape
        pass
    
    def compute_all(self, batch):
        pass<jupyter_output><empty_output><jupyter_text>Задание 4**(0.3 балла)** Напишите класс CNN сети из 3 блоков с добавлением skip-connection блока(ResNet [paper](https://arxiv.org/abs/1512.03385)).  **(0.2 балла, бонус)** Реализовать residual блок в отдельном классе `ResBlock`.*Hint 1:* на вход все те же батчи размера [BS, C, H, W]  *Hint 2:* пример skip-connection:  ![image](https://i1.wp.com/dangminhthang.com/wp-content/uploads/2020/06/resnet-block.jpg?fit=400%2C225)<jupyter_code>class ResBlock(nn.Module):
    def __init__(self):
        super().__init__()
        
    def forward(self, x):
        pass
    
    def compute_all(self, batch):
        pass


class CustomResNet(nn.Module):
    def __init__(self):
        super().__init__()
        
        # here you can init layers and stack them with nn.Sequential
#         layers = nn.Sequential([])
        
    def forward(self, x):
        # describe usage of layers here, be careful with input shape
        pass
    
    def compute_all(self, batch):
        pass<jupyter_output><empty_output><jupyter_text>Задание 5**(0.1 балла)** Инициализируйте и обучите сети из пунктов 1, 2, 3, используя класс `Trainer` из семинара.<jupyter_code>model = SomeModel()
opt = optim.SGD(model.parameters(), lr=1e-2)
trainer = Trainer(model, opt, mnist_train, mnist_val, batch_size=128)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1081554635234151, 'fraction_numerical': 0.01752150366358713, 'mean_word_length': 4.159408381265407, 'pattern_counts': {'":': 0, '<': 33, '<?xml version=': 0, '>': 33, 'https://': 9, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '290014', 'license': 'Apache-2.0', 'n_tokens_mistral': 2379, 'n_tokens_neox': 2478, 'n_words': 538, 'path': '02-pytorch/homework.ipynb', 'repo_name': 'georbuz/dl-hse-2021', 'size': '6278'}