Сеть искусственных нейронов (ANN) с произвольным числом входов и выходов

10

Я хотел бы использовать ANNs для моей проблемы, но проблема заключается в том, что номера входов и выходов не являются фиксированными.

Я сделал поиск в Google, прежде чем задавать вопрос, и обнаружил, что RNN может помочь мне с моей проблемой. Но все примеры, которые я нашел, так или иначе определили количество входных и выходных узлов.

Итак, я ищу стратегию, как сделать ее реальной или хотя бы несколько примеров, предпочтительнее в Keras или PyTorch.

Подробнее о моей проблеме:

У меня есть два списка входов, где длина первого фиксирована и равна двум, например:

in_1 = [2,2] 

но длина второго списка гибкая, длина может быть от трех до inf, например:

in_2 = [1,1,2,2]

или

in_2 = [1,1,1,2,2,2,3,3,3]

Кроме того, списки ввода зависят друг от друга. Первый список показывает размерность выходного списка. Таким образом, если in_1 = [2,2], значит, выход должен иметь возможность изменить форму [2,2].

В настоящее время я думаю объединить два списка ввода в один:

in = in_1 + in_2 = [2, 2, 1, 1, 2, 2]

Кроме того, выходные данные имеют ту же длину, что и список in_2 , например:

если входные списки:

in_1 = [2, 2]
in_2 = [1, 1, 2, 2]

Вывод должен быть:

out = [1, 2, 1, 2]

Любые идеи приветствуются!

Пэдди
источник

Ответы:

6

Ответ может зависеть от значения длины входного вектора или его происхождения.

Однако самое простое решение обычно состоит в том, чтобы узнать входные данные наибольшего размера и использовать их в качестве числа векторов. Если заданный ввод имеет меньшую длину, вы можете выполнить заполнение нулями или соответствующими символами. Таким образом, вместо вектора [1, 2, 3] и [1, 2, 2, 3] вы можете иметь векторы [1, 2, 3, 0] и [1, 2, 2, 3].

То же самое может применяться для вывода. Если ожидаемый выходной сигнал равен [1, 2, 1] и [1, 3, 4, 1], вы можете рассматривать первый выход как [1, 2, 1, 0]

Разве это не хак?

Как правило, нейронные сети функционируют приближенно. В идеале он представляет векторы (матрицы) в качестве входных данных и векторы (матрицы) в качестве выходных данных. Вот почему всегда желательно, чтобы размер вашего входного вектора был фиксированным.

Дипан Мехта
источник
Хорошо, это понятно, я могу сделать отступы для ввода. Но как определить размер выходных узлов?
Пэдди
3

Я думаю, что вы, возможно, неправильно поняли фиксированное количество входов для RNN. Это количество входов за такт . Все ваши примеры имеют фиксированное количество входов за такт: 1! Вы подаете их по одному в свою нейронную сеть, заканчивая специальным токеном «конца» (у вас всегда может быть второй вход для этого). Научите его не выводить до тех пор, пока он не увидит конечный токен, а затем выводить компоненты результата по одному, заканчивая специальным конечным выходным токеном.

Артур Такка
источник
Вау, спасибо! Знаете ли вы какой-нибудь достойный учебник / пример, чтобы понять его лучше?
Пэдди
1
@Paddy Посмотрите awesome-rnn для некоторых ссылок, например char-rnn - это довольно весело.
Артур Такка
2

Зная, что первый список в значительной степени инвариантен (просто описывает определенную геометрию), вы также можете попробовать создать много разных специализированных NN для каждой отдельной конфигурации in_1 и использовать только in_2 для подачи в сеть.

Таким образом, in_1 может управлять различными сетями.

in_1=[1,1]? --> NN #1 (n1) --> (o1)
in_1=[2,1]? --> NN #2 (n1,n2) --> (o1,o2)
in_1=[2,2]? --> NN #3 (n1,n2,n3,n4) -> (o1,o2,o3,o4)

На первом этапе вы определяете конфигурацию (т.е. создаете диктат), а затем соответственно обучаете / кормите специализированные сети.

Юрген Швитеринг
источник
на самом деле, это хорошая идея, но количество фигур довольно большое ... в любом случае, спасибо за вклад!
Пэдди