Uma rede de neurônios artificiais (RNA) com um número arbitrário de entradas e saídas

10

Gostaria de usar ANNs para o meu problema, mas o problema é que minhas entradas e saídas não são corrigidas.

Eu fiz algumas pesquisas no google antes de fazer minha pergunta e descobri que a RNN pode me ajudar com o meu problema. Mas todos os exemplos que encontrei de alguma forma definiram o número de nós de entrada e saída.

Então, estou procurando uma estratégia, como torná-la real ou, pelo menos, alguns exemplos, preferível em Keras ou PyTorch.

Mais detalhes sobre o meu problema:

Eu tenho duas listas de entradas, onde o comprimento do primeiro é fixo e é igual a dois, fe:

in_1 = [2,2] 

mas o comprimento da segunda lista é flexível, o comprimento pode ser de três a inf, fe:

in_2 = [1,1,2,2]

ou

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

Além disso, as listas de entrada dependem uma da outra. A primeira lista mostra a dimensão da lista de saída. Portanto, se in_1 = [2,2], significa que a saída deve ter a possibilidade de ser remodelada para a forma [2,2].

Atualmente, estou pensando em combinar duas listas de entrada em uma:

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

Além disso, a saída tem o mesmo comprimento que a lista in_2 , fi:

se as listas de entrada são:

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

A saída deve ser:

out = [1, 2, 1, 2]

Todas as idéias são bem-vindas!

Paddy
fonte

Respostas:

6

A resposta pode depender da significância do comprimento do vetor de entrada ou de como ele se origina.

No entanto, a solução mais simples é conhecer o maior tamanho de entrada e usá-lo como número de vetores. Se a entrada fornecida tiver um tamanho menor, você poderá fazer o preenchimento com zeros ou símbolos apropriados. Portanto, em vez de ter um vetor [1, 2, 3] e [1, 2, 2, 3], você pode ter os vetores [1, 2, 3, 0] e [1, 2, 2, 3].

O mesmo pode ser aplicado à saída. Se a saída esperada for [1, 2, 1] e [1, 3, 4, 1], você poderá tratar a primeira saída como [1, 2, 1, 0]

Isso não é apenas um truque?

Normalmente, as redes neurais funcionam com aproximação. Idealmente, representa vetores (matrizes) como entrada e vetores (matrizes) como saída. É por isso que é sempre desejável que o tamanho do seu vetor de entrada seja corrigido.

Dipan Mehta
fonte
Ok, isso está claro, eu posso fazer preenchimento para a entrada. Mas, como definir o tamanho dos nós de saída?
Paddy
3

Eu acho que você pode ter entendido mal o número fixo de entradas para a RNN. Este é o número de entradas por timestep . Todos os seus exemplos têm um número fixo de entradas por timestep: 1! Você os alimenta um de cada vez à sua rede neural, finalizando com um token "final" especial (você sempre pode ter uma segunda entrada para isso). Ensine a não dar saída até que veja o token final e, em seguida, a saída dos componentes do resultado, um de cada vez, terminando com um token final de saída especial.

Arthur Tacca
fonte
uau, obrigado! Você conhece algum tutorial / exemplo decente para entender melhor?
Paddy
11
@Paddy Veja awesome-rnn para alguns links, por exemplo, char-rnn é bastante divertido.
Arthur Tacca
2

Sabendo que a primeira lista é praticamente invariável (apenas descrevendo uma determinada geometria), você também pode tentar criar muitos NN especializados e diferentes para cada configuração in_1 distinta e usar apenas in_2 para alimentar a rede.

Assim, in_1 poderia gerar redes diferentes.ie

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)

Em uma primeira etapa, você determina a configuração (isto é, cria um ditado) e treina / alimenta as redes especializadas de acordo.

Jürgen Schwietering
fonte
na verdade, é uma boa ideia, mas o número de formas é bastante grande ... de qualquer forma, obrigado pela contribuição!
Paddy