Nota: Keras es una API de deep-Learning escrita en Python, que se ejecuta sobre la plataforma de Machine-Learning TensorFlow de hecho se ha convertido en la API oficial de TensorFlow.
. La arquitectura central de Keras son capas y modelos, por otra parte tenemos dos formas de generar arquitectura de un modelo.
API o Modo-Secuencial: Se crea una instancia un objeto del tipo Model y continuación a este Model, se le van añadiendo las capas que conforman la arquitectura una detrás de la otra. Este es el modelo que utilizare.
API o Modo-Funcional: Este Modelo de Keras en Deep-Learning se define una determinada entrada, a partir de la misma, se vaya definiendo la arquitectura. Este Modelo indica cuál es la entrada a cada capa usada. Cuando tengamos definida la arquitectura se crea el objeto; modelo que va pasando las entradas y las salidas de la última capa definida.
Modelos-Sequential-(API-Keras)
Nota: para evitar digamos “Cosas-Raras” con nuestro Google-Colaboratory, como buenas-practicas ejecutar un reseteo tensorflow-Keras.
Reseteo para evitar problemas:
- In: import tensorflow as tf
- In: tf.keras.backend.clear_session()
Nota: Cargamos las librerías. necesarias para generar nuestro modelo a utilizar “Modelo-Sequential”.
Cargamos las Librerías:
- In: import tensorflow as tf
- In: from tensorflow import keras
- In: from keras import layers
Nota: El Modelo-Sequential es una pila de capas donde cada capa tiene exactamente un tensor de entrada y un tensor de salida. Consideremos un modelo simple de tes capas-dense un nodo de Input y un Output.
Nota: Estos dos ejemplos son equivalentes, son iguales, es lo mismo, esto surge para conocer las dos formas que tenemos de afrontar el Modelo-Sequential y como ya hemos dicho son equivalentes.
-. Para que no sirve el Modelo-Sequential o por lo menos no es el mas apropiado.
- Si nuestro proyecto de Modelo tiene múltiples-entradas o múltiples-salidas.
- Si nuestro proyecto de Modelo tiene cualquiera de sus capas tiene múltiples-entradas o múltiples-salidas.
- Si se necesitamos compartir-capas.
- Si nuestro proyecto de Modelo necesitamos una topología no lineal .
Constructor-Modelo-Sequential
Reseteamos-Cargamos las Librerías:
Creamos un Modelo–Sequential basado una lista de capas al Constructor–Sequential:
- In: model = keras.Sequential(
- In: [
- In: layers.Dense(2, activation=«relu»),
- In: layers.Dense(3, activation=«relu»),
- In: layers.Dense(4),
- In: ]
- In: )
Esta capas son accesibles a través .layers:
Creamos un Modelo–Sequential de forma incremental a través del .add().
- In: model = keras.Sequential()
- In: model.add(layers.Dense(2, activation=«relu»))
- In: model.add(layers.Dense(3, activation=«relu»))
- In: model.add(layers.Dense(4))
Tenemos un método para eliminar capas .pop()
- In: model.pop()
- In: print(len(model.layers)) # 2
Constructor-Secuencial acepta un name para capa o Modelo:
- model = keras.Sequential(name=«my_sequential»)
- model.add(layers.Dense(2, activation=«relu», name=«layer1»))
- model.add(layers.Dense(3, activation=«relu», name=«layer2»))
- model.add(layers.Dense(4, name=«layer3»))
Entradas & Pesos
-. En principio en Keras se necesita conocer “la forma de las entradas” para crear sus pesos. Por lo tanto cuando se llama por primera ver a una entrada se crean los pesos. Esto se aplica al Modelo-Sequential. Cuando generamos una instancia de un Modelo-Sequential sin forma de entrada no tiene pesos. “Se llama model.weights da un error que indica esto” En conclusión los pesos se crean cuando el modelo ve por primera vez algunos datos de entrada.
Generemos Modelo–Sequential en lista de capas:
-. Cuando generamos Modelo-Sequential y llamamos al Resumen del Modelo .summary() tenemos el error “Pesos-weights” esto es por no tener algunos datos de entrada y por lo tanto no tenemos Pesos la forma de solucionarlo es llamar al Modelo una entrada de prueba.
Iniciamos una Entrada de Prueba:
- In: x = tf.ones((1, 4))
- In: y = model(x)
Resumen del Modelo:
- In: model.summary()
-. Si llamanos al constructor para generar un Modelo-Secuencial en versión Incremental para poder mostrar el resumen del modelo hasta el momento, comenzaremos en agregar al Modelo un .Input para que conocer su forma de entrada desde el principio por lo tanto se genera sus Pesos.
- In: model.add(keras.Input(shape=(4,)))
Nota: El objeto .Input no se muestra por no ser model.layers, “ por no ser una capa”.
Las capas son accesibles:
- In: model.layers
- Out: [<keras.layers.core.dense.Dense at 0x7f94e6af8f10>]
Nota: Para simplificar uniendo .Input ala primera capa “uniendo la linea dos y tres .
Quedaría así:
- In: model = keras.Sequential()
- In: model.add(layers.Dense(2, activation=«relu», input_shape=(4,)))
-. Los Modelo-Secuencial en versión Incremental creados con una forma de Entrada-Predefinida como esta siempre tienen pesos, por lo que hemos explicado anteriormente, siempre tienen una forma de salida definida. Es recomendable especificar siempre la forma de entrada de un Modelo-Secuencial por adelantado
Depuración-Flujo-Trabajo “.add() – .summary()”
-. Si creamos una Arquitectura-Secuencial, es aconsejable apilar capas de forma Incremental .add() pasar con frecuencia resúmenes de modelos “.summary()”. Permite monitorear cómo una pila Conv2D y MaxPooling2D capas reducen la resolución de mapas de características de imágenes.
-. Este interesante ejemplo que nos ofrecen Docs.Keras de una Red-Neuronal-Convolucional como Modelo-Secuencial en versión Incremental comenzaremos en agregar al Modelo un .Input para que genere sus Pesos desde el principio “Input(shape=(250, 250, 3)” dos capas Conv2D “Convolucional sobre imágenes” y una capa MaxPooling2D “Agrupación-Redución”.
Generemos Modelo–Secuencial–Incremental:
- In: model = keras.Sequential()
- In: model.add(keras.Input(shape=(250, 250, 3)))
- In: model.add(layers.Conv2D(32, 5, strides=2, activation=«relu»))
- In: model.add(layers.Conv2D(32, 3, activation=«relu»))
- In: model.add(layers.MaxPooling2D(3))
Resumen del Modelo:
- In: model.summary()
Nota: La respuesta capa MaxPooling2D “Agrupación-Redución” es “40,40,32” continuamos reduciendo la resolución.
Aumentamos el Modelo:
- In: model.add(layers.Conv2D(32, 3, activation=«relu»))
- In: model.add(layers.Conv2D(32, 3, activation=«relu»))
- In: model.add(layers.MaxPooling2D(3))
- In: model.add(layers.Conv2D(32, 3, activation=«relu»))
- In: model.add(layers.Conv2D(32, 3, activation=«relu»))
- In: model.add(layers.MaxPooling2D(2))
Resumen del Modelo:
- In: model.summary()
Nota: La respuesta tres capas MaxPooling2D “Agrupación-Redución” tenemos la primera “40,40” la segunda “12,12” y por ultimo tenemos el mapa de características “4,4” reduciendo la resolución. A continuación pasaremos GlobalMaxPooling2D.
- In: model.add(layers.GlobalMaxPooling2D())
Para finalizar una capa de clasificación:
- In: model.add(layers.Dense(10))
Nota: ?Ya tenemos el Modelo¿ la arquitectura de Modelo-Secuencial-Incremental esté lista.
Extracción de características desde un Modelo-Secuencial:
-. Un Modelo-Secuencial tiene los atributos “.input y .uotput”. Extrayendo estas características del Modelo con ellos podemos crear un modelo nuevos, que extraiga los resultados de todas las capas-intermedia del Modelo-Secuencia.
Función de Extracción:
- In: feature_extractor = keras.Model(
- In: inputs=initial_model.inputs,
- In: outputs=[layer.output for layer in initial_model.layers],
- In: )
Invoquemos extractor de funciones en Input–test:
- In: x = tf.ones((1, 250, 250, 3))
- In: features = feature_extractor(x)
Nota: Tenemos la opción solo extraer las características de una sola capa.
Función de Extracción:
Invoquemos extractor de funciones en Input–test:
Nota: El tema de transferir el aprendizaje que acabamos de extraer de un Modelo-Secuencial a otro Modelo el que de seamos utilizar como receptor de esta extracción lo veremos en otro Post.
Recopilando:
Tenemos una exposición amplia del Modelo-Secuencial, todo lo necesaria para poder usarlo y que mejo forma para llevarlo a cabo que usar la herramienta Google Collaboratory “Colab” , es un servicio gratuito en la nube alojado por el propio Google para fomentar la investigación en Machine Learning.
- Referencias: (Entorno-Moreluz)
- Referencias: (Keras)