Как построить нейронную сеть с перестановочной инвариантностью в керасе? - PullRequest
0 голосов
/ 17 декабря 2018

Мой вопрос касается структуры сети, необходимой для решения моей проблемы с меньшим количеством данных.

У меня есть сенсорное устройство, которое просто сообщает цвет того, что видит перед ним.Один датчик сообщает мне 4 числа: красный, зеленый, синий и альфа.Интенсивность изменения цвета зависит от расстояния и предмета, который он видит.У меня есть 6 таких датчиков, прикрепленных на каждой стороне маленького кубика.Куб можно перемещать и вращать, используя руку.

Я хочу предсказать положение куба в пространстве в режиме реального времени.

Моя проблема:

Ввод:6 одинаковых датчиков, каждый из которых дает 4 номера.Итого = 6 * 4 = 24 числа.

Вывод: 3 числа, X, Y, Z, (позиция куба)

Мои данные готовы с меткой XYZ.

Теперь обучаем простой многослойный персептрон, который принимает 24 числа и выводит 3 числа.Это работает довольно хорошо, но для точного прогнозирования требуется огромное количество данных в кубическом метре.

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

Но я знаю, что каждый датчик идентичен, поэтому я хочу разделить вес каждого датчика.Я знаю, что когда вы поворачиваете куб на 90 градусов, это не должно влиять на выходную позицию.Так что это должно означать, что порядок датчиков не важен.Это означает, что я должен каким-то образом использовать add или average, чтобы объединить слой моих датчиков.Если я использую concatenate, он сохранит порядок, в котором меняются выходные позиции.

Я делаю это так, что я передаю 4 числа в модель датчика , которые являются общимисреди всех датчиков получите кодировку, сложите их, затем подключите к плотным слоям.Ниже приведен прототип модели:

from keras.layers import Input, Dense
from keras.models import Model, Sequential

sensor1 = Input(shape=(4,))
sensor2 = Input(shape=(4,))
sensor3 = Input(shape=(4,))
sensor4 = Input(shape=(4,))
sensor5 = Input(shape=(4,))
sensor6 = Input(shape=(4,))
sensor_model = Sequential([
    Dense(64, activation='relu'),
    Dense(64, activation='relu'),
])
sensor1_encoding = sensor_model(sensor1)
sensor2_encoding = sensor_model(sensor2)
sensor3_encoding = sensor_model(sensor3)
sensor4_encoding = sensor_model(sensor4)
sensor5_encoding = sensor_model(sensor5)
sensor6_encoding = sensor_model(sensor6)
sensor_encoding = average([
    sensor1_encoding,
    sensor2_encoding,
    sensor3_encoding,
    sensor4_encoding,
    sensor5_encoding,
    sensor6_encoding,
])
h = sensor_encoding
h = Dense(128, activation='relu')(h)
h = Dense(128, activation='relu')(h)
h = Dense(3, activation='linear')
model = Model(inputs=[sensor1, sensor2, sensor3, sensor4, sensor5, sensor6], outputs=[h])

Прямо сейчас, когда я изменяю функцию average на concatenate, потеря модели ниже как при обучении, так и при проверке, что противоречит моей интуиции.Что не так с моим мышлением?Как вы думаете?Как настроить эту модель для того, чтобы она предсказывала ту же позицию, если я поверну на 90 градусов, но также не буду страдать от поворота на 45 градусов.А также сделайте это таким образом, чтобы не удалять полезные отношения между входами.

1 Ответ

0 голосов
/ 19 декабря 2018

Я нашел решение.И я написал код для этого, для всех, кто заинтересован, пожалуйста, проверьте: https://github.com/off99555/keras_helpers/blob/master/permutational_layer.py

...