Мережа штучних нейронів (ANN) з довільною кількістю входів і виходів


10

Я хотів би використовувати ANNs для своєї проблеми, але проблема полягає в тому, що мої входи та виходи не визначаються.

Я здійснив пошук в Google, перш ніж ставити запитання, і виявив, що RNN може допомогти мені в моїй проблемі. Але всі приклади, які я знайшов, якимось чином визначають кількість вхідних та вихідних вузлів.

Отже, я шукаю стратегію, як зробити її реальною або хоча б деякими прикладами, кращими в Keras або PyTorch.

Детальніше про мою проблему:

У мене є два списки входів, де довжина першого фіксована і дорівнює двом, fe:

in_1 = [2,2] 

але довжина другого списку гнучка, довжина може бути від трьох до inf, fe:

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 , fi:

якщо вхідні списки:

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 Див дивним-rnn для деяких посилань, наприклад, char-rnn - це дуже цікаво.
Артур Такка

2

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

Таким чином , _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)

На першому кроці ви визначаєте конфігурацію (тобто створюєте dict), а потім відповідно тренуєте / подаєте спеціалізовані мережі.


насправді це гарна ідея, але кількість форм досить велика ... все одно, дякую за вклад!
Падді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.