Разработка на Python — удалённая работа в Москве
Дата: 2024-10-16
Детали
Регион
Москва
Занятость
дистанционно
Стоимость
от 2000.00 руб.
Дата публикации
2024-10-16
Описание
решение задач. Разработка с нуля. 1. Загрузка данных Работаем с набором данных FashionMNIST. Это не совсем про тексты, но зато он численный и его можно вытянуть в вектор. Ниже предлагается реализовать собственный класс для считывания, обработки и упаковки данных. training_data = datasets.FashionMNIST( root=“data“, train=True, download=True ) test_data = datasets.FashionMNIST( root=“data“, train=False, download=True ) Воспользуемся функцией загрузки данных из репозитория наборов данных. def load_mnist(path, kind='train'): import os import gzip import numpy as np “““Load MNIST data from `path`“““ labels_path = os.path.join(path, '%s-labels-idx1-ubyte.gz' % kind) images_path = os.path.join(path, '%s-images-idx3-ubyte.gz' % kind) with gzip.open(labels_path, 'rb') as lbpath: labels = np.frombuffer(lbpath.read(), dtype=np.uint8, offset=8) with gzip.open(images_path, 'rb') as imgpath: images = np.frombuffer(imgpath.read(), dtype=np.uint8, offset=16).reshape(len(labels), 784) return images, labels Реализуем класс для FasionMnist. Элементами датасета должны являться пары '(np.array, int)', массив имеет размерность (28, 28), тип элемента np.float32. import os class FashionMnist(Dataset): def __init__(self, path, train=True, image_transform=None, label_transform=None): ### YOUR CODE HERE ### LOAD IMAGES AND LABELS WITH FUNCTION ... ### ALSO PROVIDE TRANSFORMS TO APPLY self.image_transform = self.label_transform = def __len__(self,): ### YOUR CODE # RETURN LENGTH OF DATASET def __getitem__(self, idx): ### YOUR CODE HERE ### APPLY TRANSFORMS AND RETURN ELEMENTS test_dataset = FashionMnist(“data/FashionMNIST“, train=False) train_dataset = FashionMnist(“data/FashionMNIST“) Визуализируйте случайные элементы набора данных. ### YOUR CODE HERE В конструктор Dataset можно передать объект torchvision.transforms, который позволяет преобразовать исходные данные. Преобразование torchvision.transforms.ToTensor позволяет преобразоать данные из типа PIL Image и numpy.float32 в тип torch.float32 Реализуйте собственную поддержку преобразований в FashionMnist. Проверьте, что приведение типов работает корректно. class ToTensor: “““Convert ndarrays in sample to Tensors.“““ def __call__(self, sample): ### YOUR CODE HERE # SHOULD BE CALLABLE ToTensor(x) transform = ToTensor() ### YOUR CODE HERE # init dataset with your transform and check datatype Элементы набора данных могут быть объединены в пакеты (batch) явно и неявно. Если данные могут быть сконкатенированы или объединены каким-нибудь тривиальным способом, то можно не передавать никаких дополнительных парамертов в torch.utils.data.Dataloader. test_dataloader = DataLoader(test_dataset, batch_size=15, num_workers=2, shuffle=True) batch = next(iter(test_dataloader)) print(f“The length of the batch is {len(batch)}“) print(f“The shape of the batch[0] is {batch[0].shape}“) Если наша структура данных не позволяет нам использовать объединение по умолчанию, то можно написать собственную функцию, которая будет пакетировать данные. Реализуйте функцию, преобразующую последовательность элементов массива в пакет (batch). ### YOUR CODE HERE ### WRITE A COLLATE FUNCTION and use it with dataloaders test_dataloader = ### YOUR CODE HERE train_dataloader = ### YOUR CODE HERE batch = next(iter(test_dataloader)) print(f“The length of the batch is {len(batch)}“) print(f“The shape of the batch[0] is {batch[0].shape}“) 2. Реализация модулей нейронной сети Сначала нужно реализовать прямой и обратный проход через слои. Наши слои будут соответствовать следующему интерфейсу (на примере “тождественного“ слоя): Сначала, мы реализуем функцию и её градиент. class IdentityFunction(Function): “““ We can implement our own custom autograd Functions by subclassing torch.autograd.Function and implementing the forward and backward passes which operate on Tensors. “““@staticmethod def forward(ctx, input): “““ In the forward pass we receive a Tensor containing the input and return a Tensor containing the output. ctx is a context object that can be used to stash information for backward computation. You can cache arbitrary objects for use in the backward pass using the ctx.save_for_backward method. “““ return input @staticmethod def backward(ctx, grad_output): “““ In the backward pass we receive a Tensor containing the gradient of the loss with respect to the output, and we need to compute the gradient of the loss with respect to the input. “““ return grad_output Разработанную функцию обернем классом IdentityLayer, все слои в PyTorch должны быть наследниками базового класса nn.Module() class IdentityLayer(nn.Module): def __init__(self): # An identity layer does nothing super().__init__() self.identity = IdentityFunction.apply def forward(self, inp): # An identity layer just returns whatever it gets as input. return self.identity(inp) 2.1 Функция активации ReLU Для начала реализуем функцию активации, слой нелинейности ReLU(x) = max(x, 0). Параметров у слоя нет. Метод forward должен вернуть результат поэлементного применения ReLU к входному массиву, метод backward - градиент функции потерь по входу слоя. В нуле будем считать производную равной 0. При обратном проходе могут понадобиться величины, посчитанные во время прямого прохода, поэтому их стоит сохранить в ctx. class ReLUFunction(Function): @staticmethod def forward(ctx, input): ### YOUR CODE HERE ### CALCULATE RELU FUNCTION WITH TORCH AND SAVE SOMETHING FOR BACKWARD VIA CTX @staticmethod def backward(ctx, grad_output): ### YOUR CODE HERE ### GET SOMETHING FROM FORWARD AND CALCULATE GRADIENT # CHECK LECTIONS OR GOOGLE out = ... return grad_output * out class ReLU(nn.Module): def __init__(self): super().__init__() self.relu = ReLUFunction.apply def forward(self, input): return self.relu(input) Проверяем градиент, испльзуя функцию gradcheck. torch.manual_seed(0) x = torch.rand((7,15), requires_grad = True, dtype=torch.double) relu = ReLU() assert gradcheck(relu, x) torch_relu = torch.relu our_relu = ReLU() assert torch.norm(torch_relu(x.float()) - our_relu(x)) < 1e-5 2.2 Линейный слой (linear, fully-connected) Далее реализуем полносвязный слой без нелинейности. Два набора параметра: матрица весов (weights) и вектор смещения (bias). class LinearFunction(Function): @staticmethod def forward(ctx, inp, weight, bias): ### YOUR CODE HERE ### CALCULATE OUTPUT ### AND SAVE SOMETHING FOR BACKWARD return output @staticmethod def backward(ctx, grad_output): # GET SOMETHING FROM BACKWARD # CHECK HOW BACKWARD PERFORMED grad_bias = grad_output.sum(0) grad_weight = grad_output.T @ inp grad_input = grad_output @ weight return grad_input, grad_weight, grad_bias class Linear(nn.Module): def __init__(self, input_units, output_units): super().__init__() ### YOUR CODE HERE ### initialize weights and bias with small random numbers or xavier ### do not forget to make them torch.nn.Parameter self.linear = LinearFunction.apply def forward(self,inp): return self.linear(inp, self.weight, self.bias) Проверка градиента, а также сравнение с работой нашего модуля с имплементированным в PyTorch. Проверка градиента: torch.manual_seed(0) x = torch.rand((6,12), requires_grad = True, dtype=torch.double) linear = Linear(12, 14) assert gradcheck(linear, x) Сравнение с PyTorch. output_units = 32 input_units = 15 x = torch.rand((16,15), requires_grad = True, dtype=torch.double) weight = torch.rand(size=(output_units, input_units), dtype=torch.double) bias = torch.rand(size=(output_units,), dtype=torch.double) torch_linear = torch.nn.Linear(input_units, output_units, dtype=torch.double) our_linear = Linear(input_units, output_units) state_dict = OrderedDict([(“weight“, weight), (“bias“, bias)]) torch_linear.load_state_dict(state_dict) our_linear.load_state_dict(state_dict) torch_forward = torch_linear.forward(x) our_forward = our_linear(x) assert torch.allclose(torch_forward, our_forward) 3. Сборка и обучение нейронной сети Реализуйте произвольную нейросеть, состоящую из ваших блоков. Она должна состоять из нескольких полносвязанных слоев. class Network(nn.Module): def __init__(self, input_size=28*28, hidden_layers_size=32, num_layers=5, num_classes=10): super().__init__() ### YOUR CODE HERE ### STACK LAYERS WITH DEFINED PARAMETERS ### USE nn.Dropout, your linear, your relu and whatever you like ### LAST LAYER SHOULD BE nn.LogSoftmax def forward(self, inp): ### YOUR CODE HERE ### APPLY YOUR NET TO THE INPUT Написать цикл обучения. class EmptyContext: def __enter__(self): pass def __exit__(self, *args): pass # accuract metric for our classififcation def accuracy(model_labels, labels): return torch.mean((model_labels == labels).float()) def perform_epoch(model, loader, criterion, optimizer=None, device=None): is_train = optimizer is not None ### YOUR CODE HERE ### MOVE MODEL TO DEVICE ### CHANGE MODEL TO TRAIN OR EVAL MODE ### SET LOGGING VALUES ### ITERATE OVER DATALOADER ### MOVE BATCH AND LABELS TO DEVICE ### GET MODEL OUTPUT ### GET MODEL PREDICTIONS (from the probabilites) ### CALCULATE LOSS ### BACKWARD IF TRAIN ### STEP WITH OPTIMIZER (DONT FORGET TO ZERO GRAD) ### UPDATE LOGGING VALUES WITH LOSS AND ACCURACY ### RETURN LOGGED VALUES Теперь обучим нашу нейронную сеть. # INIT YOUR MODEL # CRITERION # AND OPTIMIZER # Add device # SET NUMBER OF EPOCHS # ITERATE OVER NUMBERS OF EPOCH # TRAIN AND VALIDATE # LOG METRICS FOR TRAIN AND VAL LIKE BELOW. (YOU MAY USE YOUR OWN WAY) print(f“Epoch - {epoch} : loss {loss}, accuracy {acc}“) Дальше: Проведите эксперименты с числом слоев. Постройте графики зависимости качества модели на тренировочной и тестовой выборках от числа слоев. Для получения статистически значимых результатов повторите эксперименты несколько раз. Сделайте выводы.
Похожие заказы
Разработка на Python
дистанционно
договорная
Для работы. Нужна помощь и обучение основам. Хочу подтянуть базу по питону и делать рабочие задачи В cloud AWS. Пожелания и особенности: Хочу подтянуть базу по питону и делать рабочие задачи В cloud AWS.
Москва
Фрилансеры
2024-11-04
Разработка на Python
дистанционно
договорная
Графика. Доработка существующего продукта. Необходимо заменить в готовом файле точку на 3д модель, которая уже есть в другом файле. Доработать графику.
Москва
Фрилансеры
2024-11-04
Разработка на Python
дистанционно
договорная
Веб-разработка. Разработка с нуля, тестирование, настройка, доработка существующего продукта. **Помощник Python-разработчика** Ищу мотивированного и способного начинающего Python-разработчика для присоединения к нашей команде профессионалов. Если ты хочешь развиваться в программировании, разбираешься в Python и хочешь создавать функциональные и эффективные боты и парсеры для реальных проектов, это отличная возможность начать карьеру и получить ценный опыт под руководством опытных наставников! **Что будет входить в твои задачи:** - Помощь в разработке и тестировании различных ботов и парсеров; - Участие в проектировании архитектуры решений и написании чистого, поддерживаемого кода; - Работа с API, парсинг данных с различных источников и оптимизация скорости выполнения; - Изучение и настройка библиотек и инструментов, необходимых для выполнения задач (requests, BeautifulSoup, Django, asyncio и другие); - Участие в мозговых штурмах для разработки креативных решений и улучшения функциональности проектов. **Требования:** - Уверенное знание Python (базовые структуры данных, работа с библиотеками, основы ООП); - Базовые навыки работы с REST API и библиотеками для парсинга (например, BeautifulSoup или Scrapy); - Опыт работы с Django и понимание принципов построения веб-приложений; - Внимание к деталям и желание обучаться новому; - Опыт в разработке небольших проектов или скриптов для автоматизации будет преимуществом. **Условия:** - Гибкий график с оплатой 300 рублей в час (средняя зп джуниора составляет 30000–40000 рублей в месяц, что эквивалентно 218 рублей в час; мы округляем в вашу пользу); - Бесплатное менторство и поддержка команды профессионалов; - Возможность профессионального роста и работы над интересными проектами. Откликайтесь тут или в TГ andrew_developer.
Москва
Фрилансеры
2024-11-03
Разработка на Python
дистанционно
договорная
Задания. Помощь с выполнением задания. Решить три задачи в Питон начального уровня.
Москва
Фрилансеры
2024-11-02
Разработка на Python
дистанционно
договорная
Веб-разработка. Доработка существующего продукта. Нужно сделать емейл сервис для автоматизации отправки писем с готовой html разметкой. Язык - python. Отправка будет происходить с собственного домена@mywebsite.com . Краткие требования: будет являться дополнением к имеющемуся бекенду на flask, то есть отдельным роутом. Нужно использовать библиотеку python apscheduler т.к. некоторые письма должны будут отправляться с задержкой. Если все устроит, в проекте есть и другие задачи.
Москва
Фрилансеры
2024-11-01
Разработка на Python
дистанционно
от 3000.00 руб.
Разроботка софта для телеграмма для автоматической отправки жалоб на пользователей, каналы , группы , на сообщения в чатах, на ботов. Разработка с нуля. Разроботка софта для телеграмма для автоматической отправки жалоб на пользователей, каналы , группы , на сообщения в чатах, на ботов.
Москва
Фрилансеры
2024-11-01
Разработка на Python
дистанционно
от 50000.00 руб.
Веб-разработка. Разработка с нуля. Сайт. Пожелания и особенности: Сайт.
Москва
Фрилансеры
2024-11-01