Una red de neuronas artificiales (ANN) con un número arbitrario de entradas y salidas

10

Me gustaría usar ANNs para mi problema, pero el problema es que mis números de nodo de entradas y salidas no son fijos.

Hice una búsqueda en Google antes de hacer mi pregunta y descubrí que el RNN puede ayudarme con mi problema. Pero, todos los ejemplos que he encontrado son de alguna manera tienen un número definido de nodos de entrada y salida.

Entonces, estoy buscando una estrategia, cómo hacerla real o al menos algunos ejemplos, preferibles en Keras o PyTorch.

Más detalles sobre mi problema:

Tengo dos listas de entradas, donde la longitud de la primera es fija e igual a dos, fe:

in_1 = [2,2] 

pero la longitud de la segunda lista es flexible, la longitud puede ser de tres a inf, fe:

in_2 = [1,1,2,2]

o

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

Además, las listas de entrada dependen unas de otras. La primera lista muestra la dimensión de la lista de salida. Entonces, si in_1 = [2,2], significa que la salida debe tener la posibilidad de volver a formarse en forma [2,2].

Actualmente, estoy pensando combinar dos listas de entrada en una:

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

Además, la salida tiene la misma longitud que in_2 lista , fi:

si las listas de entrada son:

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

La salida debe ser:

out = [1, 2, 1, 2]

Cualquier idea es bienvenida!

Arrozal
fuente

Respuestas:

6

La respuesta puede depender de la importancia de la longitud del vector de entrada o de cómo se origina.

Sin embargo, la solución más simple suele ser conocer la entrada de mayor tamaño y usarla como número de vectores. Si la entrada dada tiene una longitud menor, puede rellenar con ceros o símbolos apropiados. Entonces, en lugar de tener un vector [1, 2, 3] y [1, 2, 2, 3], puede tener vectores [1, 2, 3, 0] y [1, 2, 2, 3].

Lo mismo puede aplicarse para la salida. Si la salida esperada es [1, 2, 1] y [1, 3, 4, 1], puede tratar la primera salida como [1, 2, 1, 0]

¿No es esto solo un truco?

Por lo general, las redes neuronales funcionan como aproximación. Idealmente, representa vectores (matrices) como entrada y vectores (matrices) como salida. Es por eso que siempre es deseable que el tamaño de su vector de entrada sea fijo.

Dipan Mehta
fuente
Ok, eso está claro, puedo hacer relleno para la entrada. Pero, ¿cómo definir el tamaño de los nodos de salida?
Paddy
3

Creo que puede haber entendido mal el número fijo de entradas para el RNN. Este es el número de entradas por paso de tiempo . Todos sus ejemplos tienen un número fijo de entradas por paso de tiempo: 1! Los alimenta uno a la vez a su red neuronal, terminando con un token de "fin" especial (siempre puede tener una segunda entrada para esto). Enséñele a no dar salida hasta que vea el token final, y luego a generar los componentes del resultado uno a la vez, terminando con un token de salida final especial.

Arthur Tacca
fuente
¡Wow gracias! ¿Conoces algún tutorial / ejemplo decente para entenderlo mejor?
Paddy
1
@ Paddy Vea awesome-rnn para algunos enlaces, por ejemplo, char-rnn es bastante divertido.
Arthur Tacca
2

Sabiendo que la primera lista es casi invariable (solo describe una cierta geometría), también puede intentar crear muchos NN especializados diferentes para cada configuración in_1 distinta y usar solo in_2 para alimentar la red.

Entonces in_1 podría conducir diferentes redes.

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)

En un primer paso, determina la configuración (es decir, crea un dict) y luego entrena / alimenta las redes especializadas en consecuencia.

Jürgen Schwietering
fuente
en realidad, es una buena idea, pero el número de formas es bastante grande ... de todos modos, ¡gracias por el aporte!
Paddy