[Программирование, Алгоритмы, Машинное обучение] DARPA Challenge в песочнице
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Когда-то давно, бум 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 = 7000
for 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
===========
Похожие новости:
- [Java, NoSQL, Big Data, Машинное обучение, Natural Language Processing] Кластеризация и классификация больших Текстовых данных с помощью машинного обучения на Java. Статья #1 — Теория
- [Программирование микроконтроллеров] Разбираемся с модулем ШИМ на tms320
- [Разработка веб-сайтов, JavaScript, Программирование, VueJS] Vue 3 на Typescript
- [Ненормальное программирование, Assembler, Программирование микроконтроллеров] Excel как транслятор в ассемблер AVR
- [Python, Программирование, Анализ и проектирование систем, Разработка систем связи, Научно-популярное] Как принять сигналы немецкого ВМФ с помощью звуковой карты, или изучаем радиосигналы сверхнизких частот
- [Программирование, История IT, IT-компании] История Open Source кратко: от калькулятора до миллиардных сделок
- [Программирование] XPATH + XML = быстрая обработка
- [Анализ и проектирование систем, Работа с 3D-графикой, Алгоритмы, CAD/CAM] Нелинейный мир и инструменты для расчета сложных нелинейных задач методом конечных элементов
- [Алгоритмы, Машинное обучение, Искусственный интеллект] Рекомендательные системы, основанные на графах
- [Ненормальное программирование, Программирование, Java, Совершенный код, Алгоритмы] Пишем свой аналог Wolfram|Alpha
Теги для поиска: #_programmirovanie (Программирование), #_algoritmy (Алгоритмы), #_mashinnoe_obuchenie (Машинное обучение), #_nejronnye_seti (нейронные сети), #_pytorch, #_pygame, #_programmirovanie (
Программирование
), #_algoritmy (
Алгоритмы
), #_mashinnoe_obuchenie (
Машинное обучение
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:20
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Когда-то давно, бум online-образования только начинался, я прошел курс на ai-class.com. Захотелось сделать простую игру, в которой бы нейронная сеть обучалась, наблюдая за действиями пользователя. Игру хотелось сделать в стиле flappy birds, обучение должно было происходить в реальном времени, чтобы в любой момент можно было передать управление нейронной сети. В итоге я сделал маленький симулятор управления машинкой, которая обучается ездить сама. Получилась интересная комбинация pygame, pytorch и multiprocessing. Если интересно, добро пожаловать под кат. Идею с игрой упростил до задачи управлять машинкой, которая едет по сгенерированной дороге со случайными препятствиями. Реализация симулятора была моим первым опытом с pygame. На скриншотах, справа от дороги показаны веса всех слоев нейронной сети; слева — необученная сеть, справа — уже содержит тайные знания и что-то умеет. Принцип работы После запуска сеть инициализируется случайными значениями. На каждом кадре запоминаются нормированные показания 24х лидаров и последняя команда пользователя (left, right, straight). Таким образом получаем задачу классификации с тремя классами. Когда набирается N примеров для обучения (в данном случае 500), они отправляются в task_queue, где их ожидает модель для обучения в параллельном процессе. После обучения, состояние модели отправляется в result_queue, где в основном процессе обновляются параметры модели, рисуются новые значения весов, и пользователь может переключиться в режим автопилота. Стоит отметить проблемы при обучении на таких данных:
Модель и обучение Я использовал следующую модель из 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 = 7000 for 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 =========== Похожие новости:
Программирование ), #_algoritmy ( Алгоритмы ), #_mashinnoe_obuchenie ( Машинное обучение ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:20
Часовой пояс: UTC + 5