Un réseau de neurones artificiels (ANN) avec un nombre arbitraire d'entrées et de sorties

10

Je voudrais utiliser les ANN pour mon problème, mais le problème est que mes numéros de nœuds d'entrées et de sorties ne sont pas fixes.

J'ai fait une recherche Google avant de poser ma question et j'ai découvert que le RNN peut m'aider avec mon problème. Mais, tous les exemples que j'ai trouvés ont en quelque sorte un nombre défini de nœuds d'entrée et de sortie.

Donc, je cherche une stratégie, comment la concrétiser ou au moins quelques exemples, préférables à Keras ou PyTorch.

Plus de détails sur mon problème:

J'ai deux listes d'entrées, où la longueur de la première est fixe et égale deux, par exemple:

in_1 = [2,2] 

mais la longueur de la deuxième liste est flexible, la longueur peut être de trois à inf, fe:

in_2 = [1,1,2,2]

ou

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

De plus, les listes d'entrée dépendent les unes des autres. La première liste montre la dimension de la liste de sortie. Donc, si in_1 = [2,2], cela signifie que la sortie doit avoir la possibilité d'être remodelée sous la forme [2,2].

Actuellement, je pense combiner deux listes d'entrées en une seule:

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

De plus, la sortie a la même longueur que la liste in_2 , fi:

si les listes d'entrée sont:

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

La sortie doit être:

out = [1, 2, 1, 2]

Toutes les idées sont les bienvenues!

Paddy
la source

Réponses:

6

La réponse peut dépendre de l'importance de la longueur du vecteur d'entrée ou de son origine.

Cependant, la solution la plus simple consiste généralement à connaître l'entrée de plus grande taille et à l'utiliser comme nombre de vecteurs. Si l'entrée donnée a une longueur moindre, vous pouvez effectuer le remplissage avec des zéros ou des symboles appropriés. Ainsi, au lieu d'avoir un vecteur [1, 2, 3] et [1, 2, 2, 3], vous pouvez avoir des vecteurs [1, 2, 3, 0] et [1, 2, 2, 3].

La même chose peut s'appliquer à la sortie. Si la sortie attendue est [1, 2, 1] et [1, 3, 4, 1], vous pouvez traiter la première sortie comme [1, 2, 1, 0]

N'est-ce pas juste un hack?

En règle générale, les réseaux de neurones fonctionnent approximativement. Idéalement, il représente des vecteurs (matrices) en entrée et des vecteurs (matrices) en sortie. C'est pourquoi il est toujours souhaitable que la taille de votre vecteur d'entrée soit fixe.

Dipan Mehta
la source
Ok, c'est clair, je peux faire un remplissage pour l'entrée. Mais comment définir la taille des nœuds de sortie?
Paddy
3

Je pense que vous avez peut-être mal compris le nombre fixe d'entrées pour le RNN. Il s'agit du nombre d'entrées par pas de temps . Tous vos exemples ont un nombre fixe d'entrées par pas de temps: 1! Vous les alimentez un par un à votre réseau de neurones, en terminant avec un jeton spécial "fin" (vous pouvez toujours avoir une deuxième entrée pour cela). Apprenez-lui à ne donner aucune sortie jusqu'à ce qu'il voit le jeton de fin, puis à sortir les composants du résultat un par un, en terminant par un jeton de sortie de fin spécial.

Arthur Tacca
la source
Ouah merci! Connaissez-vous un tutoriel / exemple décent pour mieux le comprendre?
Paddy
1
@Paddy Voir awesome-rnn pour certains liens, par exemple char-rnn est assez amusant.
Arthur Tacca
2

Sachant que la première liste est à peu près invariante (décrivant simplement une certaine géométrie), vous pouvez également essayer de créer de nombreux NN spécialisés différents pour chaque configuration in_1 distincte et utiliser uniquement in_2 pour alimenter le réseau.

Donc, in_1 pourrait conduire différents réseaux.

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)

Dans un premier temps, vous déterminez la configuration (c'est-à-dire la création d'un dict), puis formez / alimentez les réseaux spécialisés en conséquence.

Jürgen Schwietering
la source
en fait, c'est une bonne idée, mais le nombre de formes est assez important ... de toute façon, merci pour l'apport!
Paddy