Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

Нейросеть для векторов размером 360(радар). Подскажите базовую архитектуру для доработок

#нейронные_сети #keras


Всем хелоу.

Прилетела сферическая задача научить "робота" с радаром определять где же он. Если
опустить все подробности то в сухом остатке мы имеем следующее:


есть набор векторов размером в 360 и значениями от 0. до 0.4500 (примерно, погрешность
радара плавает).
имеющее достаточно уникальный в оси Х рельеф помещение разбито на 10 условных секторов
и в каждом из них были сняты показания радара по 10000 раз (если надо больше то легко)
на каждый вектор снятых данных(это массив размером 360 где значением является расстояние
до приграды) "варится" еще по по 3, где этот вектор поворачивается по 90 градусов(т.е.
90,180,270 возможна реализация других трансформаций данных, например, масштаб или сдвиг)
т.к. помещение было разбито на 10 секторов то задача определить к какому из 10 секторов
относится "слепок" с радара (т.е. вектор размером 360).


Что было сделано:


ну да, разбил помещение на 10 "образных" секторов
и конечно, сделал замеры по 10к раз с каждого из них
козалось бы, но написал "подготовку данных" где мы крутим каждый снятый вектор на
90 градусов
и что не мало важно, смог за пару дней "раскурить" keras и извоять там  простую сеть
LSTM в 4 слоя




т.к. никто не разбирается в "нейросетевой" архитектуре был взят один из примеров
кластирезации из гугл-источника

model = Sequential()
model.add(LSTM(32, return_sequences=True,
           input_shape=(1, 360)))
model.add(LSTM(32, return_sequences=True))
model.add(LSTM(32))
model.add(Dense(10, activation='softmax'))


Сетке были скормлены более 200000 замеренных с 10 секторов векторов + их обработка
с поворотом по 90 градусов, в качестве "учителя" были даны варианты правильного определения(
[0 1 0 0 0 0 0 0 0 0] например для определения 2го сектора и [0 0 0 0 0 0 0 0 0 1]
для определения последнего, остальные включительно)

После 10-20 эпох резултат впечатлил, 99% val_acc и любой пердикшен выдает как буддто
знает к какому сектору относится вектор, и на 90, 180,270 тоже и на +/- 2 градуса но...

стоит повернуть практически любой вектор через np.roll более чем на 3-4 грудса от
векторов на которых обучалась сеть то сразу получаем ошибку определения класса.

Вопрос: Подскажите примерную, базовую архитектуру сети которая бы принимала фигуру(n,
1, 360) и при обучении "крепчала" не от того что ей показывают тысячи вариантов векторов
повернутых по 1 градусу с каждого сектора, а была бы способна выявлять признаки "не
особо" зависящие от поворота
    


Ответы

Ответ 1



Я бы первым делом исключил вращение, насколько получится, чтобы не кормить НС лишними данными. Нужна какая-то функция, которая для каждой картины радара будет более-менее однозначно определять нулевую точку. В данной задаче, как для меня выглядит ее специфика, это более реально, чем, например, компенсация вращения символа в капче. Немного дополняю ответ. Компенсация вращения это подготовка входных данных (не обучающих). Этим исключается необходимость для нейросети научиться вращать входной вектор самостоятельно. Даже если функция, определяющая точку отсчета входного вектора дает сбои, то это проявляется лишь в нескольких сдвинутых вариантах входного вектора при одних и тех же координатах робота. Это все равно намного экономней 360 вариантов на каждый по сути один и тот же входной вектор за вычетом сдвига. Похожий подход следует применить и для выходных данных. А именно, выход - это два блока сигналов. Например, вы хотите чтобы определялись коородинаты робота по x и y. Все пространство делится на сетку, например, 1000x1000. У НС будет 2000 выходов. Таким образом исключается необходимость для нейросети учиться формировать двоичные числа.

Комментариев нет:

Отправить комментарий