Saltar al contenido

Como hacer redes neuronales complejas

    portada

    Seguramente cuando veis el código fuente de muchas páginas por internet os preguntareis porque hay veces que las redes funcionales las hacen con un código y otras veces otro completamente distinto. Podríais pensar ¿Son distintas versiones de Keras y por eso se ven así? Pero no, la realidad es que hay dos formas de hacer las redes neuronales, de forma secuencial y de forma funcional, y en estas últimas es donde se encuentran las redes neuronales complejas.

    ¿Qué son las redes neuronales complejas?

    Cuando empezamos a estudiar las redes neuronales siempre tienen la forma de una o varias entradas, una o varias capas ocultas y una varias salidas, pero esto no siempre tiene que ser así.

    redes neuronales complejas

    En la imagen anterior podemos ver la estructura de GoogleNet. Un modelo de red convolucional que ha diseñado Google para la clasificación de imágenes, en la que se puede observar la complejidad que puede llegar a tener una red neuronal.

    No es tan complicado realizar redes neuronales complejas, solo hay que tener en mente que las redes no tienen porque ser un único bloque que tenga una entrada una red neuronal y una salida. Aquí os mostramos como realizar algunas de ellas, y al final del artículo seréis capaces de crear vuestras propias redes complejas.

    Modelo secuencial

    Un modelo secuencial es cuando al crear una red neuronal vamos poniendo capas unas detrás de otras. Esta es la forma más sencilla de hacer las redes neuronales y la que hasta ahora hemos utilizado, como por ejemplo cuando hicimos LSTM.

    Vamos a ver un ejemplo rápido de como sería la programación de un modelo de forma secuencial:

    model = models.Sequential()
    model.add(Dense(100, input_shape(10,), activation='relu')
    model.add(Dense(100, activation='relu')
    model.add(Dense(100, activation='relu')
    model.add(Dense(100, activation='relu')
    model.add(Dense(1,  activation='relu')

    Si lo vemos gráficamente la red neuronal sería así:

    secuencial 1

    Como veis esta red neuronal es muy sencilla. Son simplemente capas puestas de forma secuencial, es decir una detrás de otra.

    Modelo funcional

    Ahora la pregunta sería ¿pero si quiero que la salida de una capa se salte la siguiente como lo hago? Pues para eso nos sirve el nivel funcional. En esta red hay que indicar cual es la capa de entrada una capa dada.

    Vamos a ver como se hace esto con un ejemplo:

    input1 = Input(shape=(10,2))
    lay1 = Dense(32, input_shape=(10,2))(input1)
    lay2 = Dense(8)(lay1)
    out1 = Dense(1)(lay2)
    out2 = Dense(1)(lay2)
    out3 = Dense(1)(lay2)
    merged1 = concatenate([out1, out2])
    merged2 = concatenate([merged1, out3])
    output = Dense(30, activation='relu')(merged1)
    func_model = Model(inputs=input1, outputs=[output, merged2])

    Hay varios detalles en los que fijarse en esta red neuronal. El primero es que se puede observar que para pone la capa de salida de una red neuronal como la entrada de la siguiente hay que indicarlo. Para indicarlos se hace poniendo la capa de entrada entre paréntesis, justo cuando terminamos de declarar la nueva capa.

    También podemos ver la forma de juntar dos capas mediante “concatenate”, donde señalamos las redes que vamos a unir para crear una nueva capa. Esto puede ser muy útil cuando tenemos unas capas que sabemos que van a dar una salida determinada y esas salidas juntas nos pueden ayudar a crear un nuevo algoritmo.

    También podemos ver como esta red neuronal tiene dos salidas, no solo una como estamos acostumbrados. Esto puede suceder cuando, por ejemplo, tratamos de predecir el valor que van a tomar dos variables distintas.

    Esto que hemos explicado gráficamente se vería así:

    funcional 1

    Vamos como vamos avanzando un poco más en la complejidad de las redes neuronales, y esta ya se ve mucho más compleja que la anterior.

    Modelos con más entradas

    Ahora nos queda el último supuesto: cuando necesitamos más de una entrada. Un ejemplo típico de este tipo de red es cuando vamos a meter dos imágenes distintas.

    Veamos como se hace esto:

    visible1 = Input(shape=(64,64,1))
    conv11 = Conv2D(32, kernel_size=4, activation='relu')(visible1)
    pool11 = MaxPooling2D(pool_size=(2, 2))(conv11)
    flat1 = Flatten()(pool11)
    visible2 = Input(shape=(32,32,3))
    conv21 = Conv2D(32, kernel_size=4, activation='relu')(visible2)
    pool21 = MaxPooling2D(pool_size=(2, 2))(conv21)
    flat2 = Flatten()(pool21)
    merge = concatenate([flat1, flat2])
    output = Dense(1, activation='sigmoid')(merge)
    model = Model(inputs=[visible1, visible2], outputs=output)

    Hemos querido seguir con el ejemplo de las imágenes, así que lo hacemos con capas convolucionales. La entrada de cada imagen entraría directamente a una capa convolucional que haría operaciones con ellas y los resultados de estas dos operaciones acabarían en una capa densa que nos mostraría el resultado deseado.

    dos entradas

    Conclusiones

    Como hemos visto las redes neuronales pueden ser todo lo complejas que nosotros queramos, y seguro que no somos capaces de ver todo el provecho que les podemos sacar. Pero como nota me gustaría que dejaros una imagen que he visto por internet, y que después de leer este artículo espero que ya no veáis tan complicada.

    complex neuralNetwork

    Espero que viendo esto también se os ocurra como aplicar esto al trading, que seguro que algo se os viene a la cabeza.

    Si tenéis cualquier duda o mejora del artículo no dudéis en poneros en contacto conmigo y os contestaré lo antes posible.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *