Русский
Русский
English
Статистика
Реклама

DARPA Challenge в песочнице

image

Когда-то давно, бум online-образования только начинался, я прошел курс на ai-class.com. Захотелось сделать простую игру, в которой бы нейронная сеть обучалась, наблюдая за действиями пользователя. Игру хотелось сделать в стиле flappy birds, обучение должно было происходить в реальном времени, чтобы в любой момент можно было передать управление нейронной сети. В итоге я сделал маленький симулятор управления машинкой, которая обучается ездить сама. Получилась интересная комбинация pygame, pytorch и multiprocessing. Если интересно, добро пожаловать под кат.

Идею с игрой упростил до задачи управлять машинкой, которая едет по сгенерированной дороге со случайными препятствиями. Реализация симулятора была моим первым опытом с pygame.
На скриншотах, справа от дороги показаны веса всех слоев нейронной сети; слева необученная сеть, справа уже содержит тайные знания и что-то умеет.

Принцип работы


После запуска сеть инициализируется случайными значениями. На каждом кадре запоминаются нормированные показания 24х лидаров и последняя команда пользователя (left, right, straight). Таким образом получаем задачу классификации с тремя классами. Когда набирается N примеров для обучения (в данном случае 500), они отправляются в task_queue, где их ожидает модель для обучения в параллельном процессе. После обучения, состояние модели отправляется в result_queue, где в основном процессе обновляются параметры модели, рисуются новые значения весов, и пользователь может переключиться в режим автопилота.

Стоит отметить проблемы при обучении на таких данных:
  • Чаще всего приходится ехать прямо, поэтому обучающая выборка сильно не сбалансирована, и после обучения такая модель будет иметь тенденцию проезжать сквозь повороты. Исправить это можно отсечением примеров преобладающего класса (down-sample the majority class)
  • Когда автопилот попадает в критические ситуации, модель не знает что с этим делать, т.к. этого не было в обучающих данных. В моей версии машинка просто врежется, но решением было бы телепортировать машинку в критическую ситуацию и показать, как из нее выруливать.


Модель и обучение


Я использовал следующую модель из 24х входных нейронов и трех скрытых слоев, на выходе 3 нейрона, максимальное значение есть предсказанная команда. Код выглядит вот так:
class Model(nn.Module):    def __init__(self, in_features=24, hidden=[56, 48, 48], out_features=3):        super().__init__()        layer_sizes = [in_features] + hidden        layers = []        for i in range(len(layer_sizes) - 1):            layers.append(nn.Linear(layer_sizes[i], layer_sizes[i + 1]))            layers.append(nn.ReLU(inplace=True))        layers.append(nn.Linear(layer_sizes[-1], out_features))        self.layers = nn.Sequential(*layers)    def forward(self, x):        return self.layers(x)


Обучение метод обратного распространения ошибки, можно найти в статьях по pytorch:
criterion = nn.CrossEntropyLoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.005)epochs = 7000for i in range(epochs):    y_pred = model.forward(X_train)    loss = criterion(y_pred, y_train)    if i % 100 == 1:        print(f'epoch: {i:2}  loss: {loss.item():10.8f}')    optimizer.zero_grad()    loss.backward()    optimizer.step()


Ниже видео, как это работает:


Исходный код всего проекта находится здесь. Предлагаю читателям поэкспериментировать с архитектурой нейронной сети, и количеством лидаров, а так же обучить машинку своему стилю вождения.

Это была моя проба пера в pytorch. Для создания и отладки модели было достаточно знаний курса на Udemy.
Хотелось бы услышать мнение опытных коллег, как в существующей постановке задачи сделать так, чтобы модель обучилась совсем не врезаться в препятствия.

Спасибо за внимание!

P.S. Картинки предоставлены ilyar
Источник: habr.com
К списку статей
Опубликовано: 08.11.2020 18:18:22
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Программирование

Алгоритмы

Машинное обучение

Нейронные сети

Pytorch

Pygame

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru