Вопрос или проблема
У меня есть нейронная сеть, которая принимает около 25 входов и выдает 3 действия. Выходы: дельта X и дельта Y робота и угол робота. После ввода данных в модель я получаю очень разные (и странные) предсказания угла. В чем может быть причина? И как это можно исправить? Если кто-то может приложить патч (или другую модель), это очень мне поможет! 🙂
Вот некоторые детали: Уникальные значения в первом столбце Y: [-65. -45. 0. 10. 15. 25. 35. 45. 65. 90. 115. 135. 155. 180. 225. 245. 250. 270.]
Метки угла: tensor([ 0., 270., 270., 0., 0., 0., 180., 180., 270., 0., 90., 0., 270., 0., 90., 90., 0., 90., 90., 0., 0., 90., 90., 0., 270., 270., 0., 270., 270., 270., 0., 180., 90., 180., 0., 90., 0., 270., 0., 180., 90., 180., 0., 90., 180., 180., 180., 90., 0., 180., 0., 270., 270., 90., 180., 180., 0., 0., 90., 180., 270., 90., 90., 0.])
Выходы угла (предсказание): tensor([ 58.0496, 134.1157, 86.4644, 38.5840, 207.9981, 45.4016, 145.8846, 95.8378, 85.2003, 149.1076, 138.2106, 194.3036, 38.5840, 76.8651, 57.8443, 109.1870, 45.4016, 146.5283, 40.7307])
Это моя модель:
# Определите модель нейронной сети
class NeuralNetwork(nn.Module):
def __init__(self, input_size, num_actions):
super(NeuralNetwork, self).__init__()
self.layer1 = nn.Linear(input_size, 64*2)
self.relu = nn.ReLU()
self.layer2 = nn.Linear(64*2, 32*2)
self.output_layer = nn.Linear(32*2, num_actions)
def forward(self, x):
out = self.layer1(x)
out = self.relu(out)
out = self.layer2(out)
out = self.relu(out)
out = self.output_layer(out)
return out
Большое спасибо!
Я вижу четыре возможных решения для вас:
- обдумайте ваши данные – включены ли все необходимые входные переменные? вывод в самой удобной форме для моделирования? Может быть, он должен быть в радианах, а не в градусах?
- измените ваш вывод – это самое простое решение, и я бы сначала попробовал нормализовать вывод. Такая модель может испытывать трудности с выходными данными с разными распределениями.
- добавьте больше слоев – это может помочь, если смоделированная связь сложная. Если вы добавите больше слоев, вы можете рассмотреть BatchNormalization (я бы добавил это даже сейчас перед первым слоем в качестве альтернативы, чтобы нормализовать его перед моделью). Иногда также полезно добавить функцию активации, которая похожа на связь, над которой вы работаете.
- измените архитектуру вашей сети – вы можете попробовать разделить ваши последние слои на три отдельных ветки, чтобы модели могли обрабатывать эти кусочки информации отдельно. Это очень помогло мне во время одного проекта.
Ответ или решение
Построение Нейронной Сети для Мульти-выходной Регрессии
Введение
Создание нейронной сети для мульти-выходной регрессии требует учитывать несколько важных факторов, включая структуру сети, обработку данных и распределение выходных значений. В вашем случае вы столкнулись с проблемой предсказания угла робота, что может быть вызвано множеством факторов, таких как формат выходных данных, архитектура модели или недостаточная предобработка данных.
Проблема с предсказаниями угла
Ваши предсказания для угла робота (выход) оказываются странными и отличаются от реальных значений. Исходя из вашего описания, можно выделить несколько потенциальных причин:
-
Формат выходных данных: Вы используете углы в градусах, которые могут быть представлены как числа в диапазоне от 0 до 360. Однако при моделировании может иметь место эффект разрыва, когда различные значения сливаются, поскольку углы 0 и 360 — это одно и то же. Хорошей практикой будет преобразование углов в радианы. Это может помочь модели лучше учитывать особенности обхода круговых данных.
-
Разные масштабы выходных данных: Разные
Y
-выходы (delta X, delta Y, угол) могут иметь разные диапазоны значений. Это может привести к тому, что одна из величин начинает доминировать над остальными в процессе обучения. Нормализация выходов (например, использованиеMin-Max Scaling
илиZ-score Normalization
) может существенно улучшить общий результат.
Структура модели
Ваша модель имеет базовую структуру, но могут быть внесены изменения для улучшения работы. Рассмотрим несколько предложенных улучшений:
-
Увеличение глубины сети: Добавление дополнительных слоев может помочь модели лучше захватывать сложные паттерны в данных. Например, добавление нескольких слоев с
Batch Normalization
может ускорить процесс обучения и повысить стабильность градиентов. -
Отдельные выходные блоки для каждого выходного значения: Использование различных ветвей для каждого из
Y
-выходов может оказаться полезным. Это поможет модели узнать специфические представления дляdelta X
,delta Y
и угла. Каждый выходной блок можно настраивать по своему – использовать свои функцию активации и количество нейронов.
Пример улучшенной модели
Ниже представлен пример улучшенной версии вашей модели, включающей дополнительные слои и отдельные выходные блоки:
import torch
import torch.nn as nn
class ImprovedNeuralNetwork(nn.Module):
def __init__(self, input_size):
super(ImprovedNeuralNetwork, self).__init__()
self.layer1 = nn.Linear(input_size, 128)
self.layer2 = nn.Linear(128, 64)
self.relu = nn.ReLU()
self.deltaX_output = nn.Linear(64, 1)
self.deltaY_output = nn.Linear(64, 1)
self.angle_output = nn.Linear(64, 1)
def forward(self, x):
out = self.layer1(x)
out = self.relu(out)
out = self.layer2(out)
out = self.relu(out)
deltaX = self.deltaX_output(out)
deltaY = self.deltaY_output(out)
angle = self.angle_output(out)
return deltaX, deltaY, angle
# Пример использования:
model = ImprovedNeuralNetwork(input_size=25)
Обработка данных
Не менее важным шагом является предобработка ваших данных. Убедитесь, что все ваши входные данные нормально распределены и стандартизированы. Если необходимо, примените методы уменьшения размерности (например, PCA
), чтобы выявить более четкие паттерны.
Заключение
Мульти-выходная регрессия — это сложная задача, но с правильным подходом и некоторыми изменениями в архитектуре и обработке данных возможно улучшить производительность вашей нейронной сети. Попробовав предложенные советы, вы сможете добиться более стабильных и предсказуемых результатов для ваших углов и перемещений робота. Разработка и отладка модели — это итеративный процесс, и, возможно, потребуется некоторое время для нахождения идеального решения.