Entradas

Mi viaje hacia el Deep Learning

Autor: Favio Vázquez

mi viaje 1

Un poco sobre mí y Deep Learning

Vengo de la física y la ingeniería en computación. Estudié en Venezuela, y luego hice una Maestría en Física en México. Pero me considero un Científico de Datos. ¿Interesante no? Así que, aunque tengo una amplia experiencia en matemáticas, cálculo y estadísticas, no fue fácil comenzar con el machine learning y el deep learning .

Estas asignaturas no son nuevas, pero la forma en que las estudiamos, cómo construimos el software y las soluciones que las usan, y también la forma en que las programamos o interactuamos con ellas, han cambiado dramáticamente.

Hice un artículo antes donde cubro parte de la teoría del deep learning y por qué es tan importante en este momento, pero algo que decir de nuevo es que los factores que hicieron que el deep learning fuera el “boom” del momento fue el desarrollo de varias simples pero importantes mejoras algorítmicas, los avances en hardware (principalmente GPU) y la generación y acumulación exponencial de datos en la última década.

 

mi viaje 2

¿Dónde comencé?

Cuando estudiaba Ingeniería en Computación, tuve una clase sobre Inteligencia Artificial (ese era el nombre del curso) alrededor del 2012. En ese momento, estaba realmente confundido con el tema. Quiero decir, sabía que era importante (en ese momento “por razones”), pero era extraño.

Estudié sistemas expertos, redes neuronales, algoritmos genéticos, y leí algunos artículos, dos que encontré realmente interesantes fueron:

Cuando leí esos artículos (no sabía sobre los avances en el machine learning, o incluso si existían), pensé que realmente estábamos muy lejos de alcanzar la Inteligencia Artificial “real”. Sigo pensando que no estamos tan cercanos como pensamos, y hay algunas cosas que tenemos que resolver, pero más sobre eso más adelante.

Entonces, porque para mí en ese momento (22 años) la IA era una esperanza perdida, comencé a estudiar computación cuántica, para mí era lo que venía antes de la IA, por supuesto que estaba equivocado:

 

mi viaje 3

Pero bueno, fue realmente interesante para mí porque mezcló mucha ciencia e ingeniería.

Mi interés en la IA

Entonces, volviendo a IA y todo eso, ¿qué pasó? ¿Por qué ahora soy tan apasionado de la IA, el machine learning, el deep learning cuando estaba seguro de que estábamos lejos de todo eso?

 

 

mi viaje 4

 

Lo que me sucedió fue Apache Spark y Andrew Ng . ¿Qué?

En 2014 (24 años), acababa de graduarme en Física, haciendo mi tesis sobre simulaciones de agujeros negro en Ingeniería, y luego, ¡boom! Descubrí Coursera, Machine Learning, Andrew Ng y Apache Spark.

 

Estaba tan asombrado con el aprendizaje serio en línea, algo que no probé antes (todavía no sé por qué), y comencé a hacer cursos sobre todo, desde genómica a astronomía, desde Scala a Python, desde el machine learning hasta las teorías filosóficas de Søren Kierkegaard (él es increíble por cierto).

No tenía un camino o un mentor, así que solo estaba explorando el mundo, tratando de descubrir qué quería hacer con mi vida .

Y luego, al mismo tiempo (finales de 2014), descubrí el curso de Andrew Ng sobre Machine Learning y el proyecto Apache Spark . Hice el curso en 2 semanas, no podía creer lo increíble que era este campo. Luego comencé a codificar lo que aprendí en Scala y Apache Spark, así que aprendí sobre computación distribuida, Hadoop, HDFS y todas esas cosas geniales.

Algunos de mis proyectos iniciales (no tan buenos) sobre machine learning y Spark pueden encontrarlos en mi GitHub. ¡Ve a mi primer repositorio!

Mi primer trabajo de Data Science

 

 

 

 

mi viaje 5

 

Conseguí mi primer trabajo como un trabajo de Data Science que finaliza en 2014, fui el único científico de datos en la empresa que intentaba averiguar qué puede hacer con los datos. Estaba muy confundido, ¡las cosas no estaban como en los cursos! Ya no estaba importando el conjunto de datos de Iris en R, estaba lidiando con datos extraños y no tenía idea de que los datos estaban “sucios” en la vida real.

Pero seguí aprendiendo todo el tiempo. De hecho, no estaba seguro (¡en absoluto!) De qué era la ciencia de datos en aquel entonces.

Construí algunos modelos simples, y los más complejos, principalmente en Scala y Python. Scala fue mi vida en 2015.

 

Las aventuras cosmológicas

mi viaje 6

Teoría de Roger Penrose de la Cosmología Cíclica Conformada

La ciencia de los datos fue mi segunda pasión después de la Física y la Cosmología (creo que ahora están en el mismo lugar), así que vine a México para hacer una Maestría en Física. Fue una experiencia increíble, pero aún faltaba algo. ¡Necesitaba codificar! ¡Me encantaba la programación!

Tomé cursos de Física fundamental, como Mecánica clásica, Mecánica cuántica, pero también Métodos numéricos, Computación de alto rendimiento y luego Razonamiento Bayesiano y Machine learning.

 

Así que al final mi maestría se dividió en mis dos pasiones. Y codifiqué mucho en mi tesis en Python, así que estaba muy feliz.

Convertirse en un científico de datos

Cuando terminé mi maestría (2017) decidí que lo que quería hacer era ayudar a la sociedad a ser un Científico de Datos. Sí, me tomó un tiempo.

Si deseas conocer mi viaje sobre cómo obtuve un trabajo increíble en el campo, echa un vistazo a esta publicación en el blog que hice hace tiempo: ¿Cómo conseguir un trabajo como Científico de Datos?

También comencé a compartir mi experiencia, pensamientos y conocimiento en mi LinkedIn , algo que era muy importante. Conocí gente increíble, eso me ayudó mucho, y ahora estoy ayudando a la gente, devolviendo :).

Todos los días estudio, código, contribuyo en proyectos de código abierto y también ayudo a la gente, así que estoy muy contento con lo que estoy haciendo.

¿Qué hay del deep learning?

 

mi viaje 7

 

¿No era esta una publicación sobre Deep Learning?

Sí, pero tenía que decirte por qué el deep learning es importante para mí ahora. Todos esos pasos que tomé me permitieron llegar a este punto.

Como Científico de Datos, así como en la mayoría de las carreras, necesitas estar al día con las teorías, tecnologías y frameworks; así que el año pasado vimos la explosión en Deep Learning, justo cuando me sentía cómodo con Machine Learning, algo completamente nuevo de aprender. Increíble pero estresante.

 

 

 

 

Entonces, ¿sabías dónde comencé? Adivina…

¡SÍ! ¡Con Andrew Ng de nuevo!

 

 

 

mi viaje 8

 

https://www.deeplearning.ai

Estoy realmente asombrado con él. Cuando estoy empezando en un campo, él ya lo está enseñando.

Pero bueno, todavía estoy haciendo estos cursos. Pero no me detuve allí. Necesitaba más información práctica también. Entonces comencé a aprender TensorFlow y luego Keras .

Para aquellos que no saben, Keras es una API de redes neuronales de alto nivel, escrita en Python y capaz de ejecutarse sobre TensorFlow , CNTKoTheano . Fue desarrollado por François Chollet con el objetivo de permitir la experimentación rápida. Poder pasar de la idea al resultado con la menor demora posible es la clave para hacer una buena investigación.

Existen excelentes recursos para el aprendizaje práctico de deep learning, como repositorios y libros en GitHub. En este momento estoy leyendo este libro, y ha sido una adición increíble a mi biblioteca:

 

https://www.manning.com/books/deep-learning-with-python

Programación funcional para el aprendizaje profundo

Autor: Joyce Xu

Traductor:  Paula Vidal

Hasta hace poco tiempo atras, el concepto de “programación funcional” y “aprendizaje automático” se atribuía a dos mundos claramente separados. El primero es un paradigma de programación que ha ganado popularidad, cuando el mundo ha recurrido a la simplicidad y la modularidad para producir aplicaciones escalables complejas; el segundo es una herramienta utilizada para instruir una computadora como un autocomplementado de garabatos y el otro para componer música. Por lo tanto, no existia diálogo entre estos dos elementos.

Pero al estudiarlos y profundizarlos con cuidado, uno se da cuenta de que su superposición es práctica y teórica. En primer lugar, el aprendizaje automático no es un elemento en sí mismo, sino que, para que se aproveche mejor, debe incorporarse en aplicaciones escalables complejas. En segundo lugar, el aprendizaje automático, y en particular el aprendizaje profundo, es funcional en su diseño:

  • Los modelos de aprendizaje profundo estan compuestos en series: la programación funcional implica la composición de cadenas de funciones de orden superior para operar en estructuras de datos simples. Las redes neuronales están diseñadas de la misma manera, unidas las funciones de transformación de una capa a otra, para operar en una matriz simple de datos de entrada. De hecho, todo el proceso de aprendizaje profundo puede verse como la optimización de un conjunto de funciones compuestas. Esto significa que los modelos en sí mismos son intrínsecamente funcionales

 

  • Los componentes del aprendizaje profundo son inmutables: cuando aplicamos las funciones a los datos de entrada, nuestros datos no cambian, sino que se produce un nuevo conjunto de valores. Además, cuando los pesos están actualizados, no necesitan ser “cambiados” sino reemplazados por un nuevo valor. En teoría, la actualización de ponderación se puede aplicar en cualquier orden (es decir, no dependen uno del otro) y, por lo tanto, no es necesario realizar un seguimiento secuencial del cambio relativo.

 

  • La programación funcional ayuda y facilita a la paralelización. Algo más importante, es que las funciones que son totalmente compuestos en serie y son fáciles de paralelizar. Esto implica una mayor velocidad y poder computacional. La programación funcional proporciona concurrencia y paralelismo a casi cero costos, lo que hace que sea más fácil trabajar en aprendizaje profundo con modelos grandes y distribuidos.

 

Existen diferentes teorías y perspectivas sobre la combinación de programación funcional y aprendizaje profundo, tanto desde un punto de vista matemático como práctico, pero a veces es más fácil verlo de una manera práctica. En este artículo vamos a presentar las ideas que subyacen a la programación funcional y cómo aplicarlas en un modelo de aprendizaje profundo Cortex para la clasificación de valores anómalos.

 

Las bases de Clojure

Antes de continuar con el tutorial de Cortex, vamos a presentar algunas nociones básicas sobre Clojure. Clojure es un lenguaje de programación funcional que es excelente para la concurrencia y el procesamiento de datos. Afortunadamente para nosotros, estos son extremadamente útiles en el aprendizaje automático. De hecho, la razón principal por la que utilizamos Clojure para el aprendizaje automático es que el trabajo de preparación de conjuntos de datos de practica (manipulación de datos, procesamiento, etc.) puede compensar fácilmente la implementación de los algoritmos, especialmente cuando existen bibliotecas sólidas como Cortex. Usar Clojure y .edn (en lugar de C ++ y protobuf) nos da una ventaja en términos de velocidad en los proyectos de aprendizaje automático.

Puede encontrar una introducción más detallada sobre este lenguaje lo puedes encontrar aquí.

Comencemos con lo básico: el código de Clojure se compone de un conjunto de términos . Estos están encerrados entre paréntesis y generalmente se tratan como funciones de llamada. (+ 2 3)          ; => 5
(if false 1 0)   ; => 0

Hay 4 estructuras de datos básicas: vectores, listas, hash-maps y sets. Las comas se consideran espacios en blanco, por lo que generalmente se omiten.

[1 2 3]            ; vector (ordered)
‘(1 2 3)           ; lists (ordered)
{:a 1 :b 2 :c 3}   ; hashmap or map (unrdered)
#{1 2 3}           ; set (unordered, unique values)

La comilla simple, que precede a la lista, es solo un instrumento para garantizar que no se detecte como un concepto.

Clojure también tiene muchas funciones integradas para trabajar en estas estructuras de datos. Parte del atractivo de Clojure radica en su diseño rico en características para muy pocos tipos de datos, lo que contrasta con la práctica común de tener pocas funciones especializadas para la mayor cantidad posible de estructuras de datos. Clojure, al ser un lenguaje de programación funcional, admite funciones de alto nivel, lo que significa que las funciones se pueden importar como argumentos en otras funciones.

 

(count [a b c])              ; => 3

(range 5)                    ; => (0 1 2 3 4)

(take 2 (drop 5 (range 10))) ; => (5 6)

(:b {:a 1 :b 2 :c 3})        ; use keyword as function => 2

(map inc [1 2 3])            ; map and increment => (2 3 4)

(filter even? (range 5))     ; filter collection based off predicate => (0 2 4)

(reduce + [1 2 3 4])         ; apply + to first two elements, then apply + to that result and the 3rd element, and so forth => 10

Por supuesto, podríamos escribir nuestras funciones en Clojure usando defn. La definición de las funciones de Clojure sigue la forma (defn fn-name [params*] expressions )y también devuelve el valor de la última expresión en el cuerpo.

(defn add2
[x]
(+ x 2))(add2 5)     ; => 7

Las expresiones “let” crean y asocian las variables dentro de los ámbitos léxicos, llamados ámbito léxico, de “let”. Esto se hace en la expresión (let [a 4] (…)), donde la variable “a” tiene un valor de 4 solo en los parentesis internos. Estas variables se llaman “locales”.

(defn square-and-add
[a b]
(let [a-squared (* a a)
b-squared (* b b)]
(+ a-squared b-squared)))

(square-and-add 3 4)       ; => 225

Finalmente, tenemos dos formas de crear funciones “anónimas”, que se pueden asignar a una función funcional local o una función de orden superior.

(fn [x] (* 5 x))          ; anonymous function#(* 5 %)                  ; equivalent anonymous function, where the % represents the function’s argument(map #(* 5 %) [1 2 3])    ; => (5 10 15)

Esto es todo con respecto a la información para tener una base. Ahora que hemos aprendido algunas nociones sobre Clojure, volvamos al aprendizaje automático.

 

Cortex

Cortex está escrito en Clojure, y actualmente es una de las bibliotecas de aprendizaje automático más grandes y de más rápido crecimiento, que utiliza un lenguaje de programación funcional. El resto del artículo se centrará en cómo construir un modelo de clasificación en Cortex, junto con los paradigmas de programación funcional y las técnicas de enriquecimiento de datos (aumento de datos) requeridas.

Data preprocessing

Tomamos un conjunto de datos de fraude de tarjetas de crédito proporcionado por este sitio. Estos conjuntos de datos son muy desequilibrados, debido al hecho de que los contenedores solo tienen 492 cajas de frondas positivas de un total de 248,807, en la práctica 0,172%. Esto creará problemas, pero por ahora, veamos los datos y veamos cómo funciona el modelo.

Para garantizar el anonimato de los datos personales, todas las características originales, excepto “time” y “amount”, ya se han transformado en componentes principales, o PCA (donde cada entrada representa una nueva variable que contiene la información más relevante de los datos sin procesar ). Una breve mirada a los datos nos muestra que la primera variable “time” tiene un contenido de información limitado, por lo que la dejamos de lado. A continuación vemos como se ve nuestro grupo de códigos:

 

(ns fraud-detection.core

(:require [clojure.java.io :as io]

[clojure.string :as string] [clojure.data.csv :as csv] [clojure.core.matrix :as mat] [clojure.core.matrix.stats :as matstats]

[cortex.nn.layers :as layers]

[cortex.nn.network :as network]

[cortex.nn.execute :as execute]

[cortex.optimize.adadelta :as adadelta]

[cortex.optimize.adam :as adam]

[cortex.metrics :as metrics]

[cortex.util :as util]

[cortex.experiment.util :as experiment-util]

[cortex.experiment.train :as experiment-train]))

(def orig-data-file “resources/creditcard.csv”)

(def log-file “training.log”)

(def network-file “trained-network.nippy”)

;; Read input csv and create a vector of maps {:data […] :label [..]},

;; where each map represents one training instance in the data

(defonce create-dataset

(memoize

(fn []

(let [credit-data (with-open [infile (io/reader orig-data-file)]

(rest (doall (csv/read-csv infile))))

data (mapv #(mapv read-string %) (map #(drop 1 %) (map drop-last credit-data))) ; drop label and time

labels (mapv #(util/idx->one-hot (read-string %) 2) (map last credit-data))

dataset (mapv (fn [d l] {:data d :label l}) data labels)]

dataset))))

 

Lo encuentran aqui : fraud-detection-data.cjl

Las redes neuronales Cortex utilizan datos de entrada en forma de mapas, donde cada mapa representa un solo dato con una etiqueta asociada (por ejemplo, si tengo una imagen de perro, la etiqueta será “perro”). Una clasificación, por ejemplo, puede aparecer como [{:data [12 10 38] :label “cat”} {:data [20 39 3] :label “dog“} … ]

En nuestra función para crear conjuntos de dataset ad hoc, vemos que en el archivo de formato de comma-separated value, todas las columnas distintas de la última forman nuestros “data” (o características), mientras que la última columna representa el label , o la etiqueta. Mientras tanto, transformamos los label one-hot vector  (por ejemplo [0 1 0 0]) en función de la clase de clasificación. Esto se debe a que la última capa soft max  en nuestra red neuronal produce un vector de probabilidad de clase, no la etiqueta en sí misma. Finalmente, creamos el mapa a partir de estas dos variables y lo guardamos como un dataset.

 

Descripción del modelo

Crear un modelo en Cortex es una operación bastante simple y directa. En primer lugar, debemos definir un mapa de parámetros más altos que se utilizarán más adelante durante el entrenamiento. Más tarde, para definir el modelo, simplemente unimos las capas:

(def params

{:test-ds-size      50000 ;; total = 284807, test-ds ~= 17.5%

:optimizer         (adam/adam)   ;; alternately, (adadelta/adadelta)

:batch-size        100

:epoch-count       50

:epoch-size        200000})

(def network-description

[(layers/input (count (:data (first (create-dataset)))) 1 1 :id :data) ;width, height, channels, args

(layers/linear->relu 20) ; num-output & args

(layers/dropout 0.9)

(layers/linear->relu 10)

(layers/linear 2)

(layers/softmax :id :label)])

Donde network-description es un vector de capas de redes neuronales. Nuestro modelo consiste en:

  • Una capa con input
  • Una capa totalmente conectada (y lineal) con la función de activación  ReLu
  • Un layer drop out
  • Otro extraño completamente conectado con ReLu
  • Una capa con output de 2 dimesiones pasa a través de la función softmax

 

En la primera y la última capa, debemos especificar un : id. esto se refiere a una clave en el mapa de datos en la cual nuestra red deberia observar. Recuerde que el mapa resulta como {: data […]: label […]}). Para nuestra capa de input, pasamos: identificación de datos para que el modelo tome datos de entrenamiento en los próximos pasos. En la capa final, sin embargo, proporcionamos: label como : id, de modo que podamos usar el label real para calcular nuestro error.

Entrenamiento y evaluación

A partir de aquí se vuelve más complejo. La función de entrenamiento no es realmente tan complicada: Cortex da funciones preconstruidas para un entrenamiento de alto nivel, por lo que todo lo que tenemos que hacer es establecer nuestros parámetros (la red, el dataset de entrenamiento y verificación, etc.). La única advertencia que le damos es que el sistema espera un conjunto de dataset “infinitos” para el entrenamiento. sin embargo, Cortex presenta una función llamada infinite-class-balanced-dataset que nos ayuda a transformarla.

(defn train

“Trains network for :epoch-count number of epochs”

[]

(let [network (network/linear-network network-description)

[train-orig test-ds] (get-train-test-dataset)

train-ds (experiment-util/infinite-class-balanced-dataset train-orig

:class-key :label

:epoch-size (:epoch-size params))]

(experiment-train/train-n network train-ds test-ds

:batch-size (:batch-size params)

:epoch-count (:epoch-count params)

:optimizer (:optimizer params)

:test-fn f1-test-fn)))

Entonces llegamos a la parte compleja: f1-test-fn. Durante el entrenamiento, de hecho, la función train-n espera que se le proporcione un: test-fn que verifique su rendimiento y determine si se debe guardar como una “best network” . Existe una función de prueba que llama default que identifica la pérdida cross-entropica (cross-entropy loss)  pero su valor de pérdida no es tan simple de interpretar y, además, no se ajusta perfectamente a nuestro conjunto de dataset desequilibrado. Para resolver este problema, escribiremos una función de prueba personal.

 

Pero ahora surge una pregunta: ¿cómo podemos verificar el rendimiento de nuestro modelo? La métrica estándar en las tareas de clasificación suele ser la precisión, pero, con nuestro conjunto de datos desequilibrado, esta medición es casi inútil. Dado que los ejemplos positivos solo representan el 0,172% del conjunto de datos total, incluso un modelo que se limita a predecir ejemplos negativos, podría alcanzar una precisión del 99.828%. Un porcentaje particularmente alto, pero si este modelo se usara en la realidad, surgirían varios problemas.

Entonces, un mejor grupo de métricas son: precisión, recuperación, y F1 score (o genericamente F-beta).

1 1

 

Precisamente, por lo tanto, nos enfrentamos a una pregunta: “de todos los ejemplos que predije que serían positivos, ¿qué proporción es  positiva?” En cuanto a la recuperación, preguntamos: “de todos los ejemplos positivos, ¿qué proporción es mas exacta y  predice que sea positivo?

El puntaje F-beta (una generalización del puntaje tradicional F1) es un promedio ponderado de precisión y recuperación, medido en una escala de 0 a 1:

2.jpg 2

Cuando beta = 1, obtenemos F1 a partir of2 * (precisión * recuperación) / (precisión + recuperación). Usualmente, beta representa cuántas veces la recuperación debería ser más importante que la precisión. En nuestro modelo, utilizamos el puntaje F1 como nuestro puntaje para estar muy cerca, pero también registramos los puntajes de precisión y recuperación para detectar el saldo. Este es nuestro f1-test-fn

 

(defn f-beta

“F-beta score, default uses F1”

([precision recall] (f-beta precision recall 1))

([precision recall beta]

(let [beta-squared (* beta beta)]

(* (+ 1 beta-squared)

(try                         ;; catch divide by 0 errors

(/ (* precision recall)

(+ (* beta-squared precision) recall))

(catch ArithmeticException e

0))))))

(defn f1-test-fn

“Test function that takes in two map arguments, global info and local epoch info.

Compares F1 score of current network to that of the previous network,

and returns map:

{:best-network? boolean

:network (assoc new-network :evaluation-score-to-compare)}”

[;; global arguments

{:keys [batch-size context]}

;per-epoch arguments

{:keys [new-network old-network test-ds]} ]

(let [batch-size (long batch-size)

test-results (execute/run new-network test-ds

:batch-size batch-size

:loss-outputs? true

:context context)

;;; test metrics

test-actual (mapv #(vec->label [0.0 1.0] %) (map :label test-ds))

test-pred (mapv #(vec->label [0.0 1.0] % [1 0.9]) (map :label test-results))

precision (metrics/precision test-actual test-pred)

recall (metrics/recall test-actual test-pred)

f-beta (f-beta precision recall)

;; if current f-beta higher than the old network’s, current is best network

best-network? (or (nil? (get old-network :cv-score))

(> f-beta (get old-network :cv-score)))

updated-network (assoc new-network :cv-score f-beta)

epoch (get new-network :epoch-count)]

(experiment-train/save-network updated-network network-file)

(log (str “Epoch: ” epoch “\n”

“Precision: ” precision  “\n”

“Recall: ” recall “\n”

“F1: ” f-beta “\n\n”))

{:best-network? best-network?

:network updated-network}))

La función ejecuta la red en el conjunto de prueba, calcula la puntuación F1 y, finalmente, actualiza y guarda la red como resultado. Además, imprime cada una de nuestras métricas de evaluación en cada punto. Si ahora ejecutamos el REPL, obtendríamos una puntuación que sería más o menos la misma:

 

Epoch: 30
Precision: 0.2515923566878981
Recall: 0.9186046511627907
F1: 0.395

Un resultado bastante pobre.

Enriquecimiento de datos (Data Augmentation)

Aquí nos encontramos con el problema del que hablamos al principio de este artículo, debido al desequilibrio del dataset. El modelo ahora no tiene suficientes ejemplos positivos de los que aprender. Cuando llamamos experiment-util/infinite-class-balanced-dataset en nuestra función de entrenamiento, de hecho estamos creando cientos de copias de cada instancia de entrenamiento positivo para equilibrar nuestro dataset. Como resultado, el modelo almacena esos valores de características, en lugar de aprender la distinción entre clases.

Una forma de resolver este problema es utilizar el enriquecimiento de datos, con el cual genero datos adicionales y artificiales basados en los ejemplos que ya tenemos disponibles. Para crear ejemplos de entrenamiento que sean positivos, debemos agregar cualquier cantidad de ruido a los features vectors  (vectores que contienen las características) para cada ejemplo positivo existente. La cantidad de ruido que agreguemos dependerá de la varianza de cada característica en las clases positivas, de modo que las características con amplia diferencia están enriquecidas con una gran cantidad de ruido, y lo opuesto para aquellas con baja diferencia.

A continuación se muestra el código para el enriquecimiento de datos:

(defonce get-scaled-variances

(memoize

(fn []

(let [{positives true negatives false} (group-by #(= (:label %) [0.0 1.0]) (create-dataset))

pos-data (mat/matrix (map #(:data %) positives))

variances (mat/matrix (map #(matstats/variance %) (mat/columns pos-data)))

scaled-vars (mat/mul (/ 5000 (mat/length variances)) variances)]

scaled-vars))))

(defn add-rand-variance

“Given vector v, add random vector based off the variance of each feature”

[v scaled-vars]

(let [randv (map #(- (* 2 (rand %)) %) scaled-vars)]

(mapv + v randv)))

(defn augment-train-ds

“Takes train dataset and augments positive examples to reach 50/50 balance”

[orig-train]

(let [{train-pos true train-neg false} (group-by #(= (:label %) [0.0 1.0]) orig-train)

pos-data (map #(:data %) train-pos)

num-augments (- (count train-neg) (count train-pos))

augments-per-sample (int (/ num-augments (count train-pos)))

augmented-data (apply concat (repeatedly augments-per-sample

#(mapv (fn [p] (add-rand-variance p (get-scaled-variances))) pos-data)))

augmented-ds (mapv (fn [d] {:data d :label [0 1]}) augmented-data)]

(shuffle (concat orig-train augmented-ds))))

augment-train-ds  tome nuestro dataset de entrenamiento original, calcule el número de enriquecimientos necesarios para lograr un equilibrio de clase de 50/50, y luego aplica estos enriquecimientos a nuestros ejemplos existentes a través de cualquier vector de ruido (add-rand-variance) según la diferebcua permitida (get-scaled-variances ). Finalmente, unimos los ejemplos enriquecidos con el conjunto dataset original y obtenga un dataset equilibrado.

Durante el entrenamiento, el modelo detecta una cantidad irrealmente grande de ejemplos positivos, mientras que el conjunto de verificación se mantendrá positivo al 0.172%. como resultado, aunque el modelo pueda aprender mejor la diferencia entre las dos clases, abrumaremos a nuestra clase con ejemplos positivos. Para resolver este problema, podemos cambiar los umbrales relevantes para forzar la predicción positiva durante la prueba. En otras palabras, en lugar de exigir al modelo al menos el 50% de certeza de la positividad de los ejemplos para clasificarlos como tales, podemos aumentar la demanda al menos al 70%. Después de algunas pruebas, notamos que el umbral mínimo debe establecerse en 90%. El código se puede encontrar en vec-> labelfunction en el código fuente, y se hace referencia a la línea 31 de f1-test-fn.

Usando el nuevo y enriquecido dataset de entrenamiento, nuestros puntajes se ven así:

Epoch: 25
Precision: 0.8658536585365854
Recall: 0.8255813953488372
F1: 0.8452380952380953

Resultados significativamente mejores que los anteriores.

Conclusiones

Este modelo obviamente aún puede mejorarse. Aquí les damos algunos consejos:

  • ¿Todas las características de PCA feature son informativas? Observe la distribución de valores para ejemplos positivos y negativos a través de las características y descarte cualquier característica que no ayude a distinguir entre las dos categorias.
  • ¿Hay otras arquitecturas de redes neuronales, funciones de activación, etc. que funcionan mejor?
  • ¿Existen diferentes técnicas de enriquecimiento de datos que podrían funcionar mejor?
  • ¿Cómo se compara el rendimiento del modelo en Cortex con Keras/Tensorflow/Theano/Caffe?

El código completo de fuente  para este proyecto se puede encontrar aquí. Le recomendamos que experimente con los siguientes pasos para explorar diferentes arquitecturas de red ( aquí hay un buen ejemplo de clasificación de imágenes en CNN que puede tomar como referencia).

Deep Learning Italia – Roma – Luglio 2018

1) Francesco Pugliese – Co-Founder Deep Learning Italia | Ricercato ISTAT
“Introduzione divulgativa alle Reti Neurali e al Deep Learning”.
Abstract: Descrizione introduttiva del modello del neurone artificiale e confronto con il neurone biologico, la storia delle reti neurali e come si è arrivati oggi al Deep Learning, detrattori vs sostenitori delle reti neurali e vittoria dei sostenitori (Hinton, LeCunn, Benjo). I successi del Deep Learning e la disfatta del Machine Learning tradizionale di oggi in settori come Computer Vision, Natural Language Processing e Giochi (GO, Chess, ecc.).

2) Matteo Testi- Founder Deep Learning Italia
“Introduzione alla piattaforma Deep Learning Italia”
Abstract: Illustrazione della community Deep Learning Italia e degli strumenti oggi sviluppati e a disposizione della community. Introduzione alle features del sito www.deeplearningitalia.com: i tutorials, il question & answer, le references, gli sviluppi futuri.

3) Ayadi Ala Eddine – Data Scientist at InstaDeep UK – AI researcher intern at Università degli Studi di Padova on deep reinforcement learning and a kaggle expert with more than 3 years of experience in data science, machine learning and statistics by working on real-life problems, a passion holder for deploying predictive models and deep learning techniques.
“Generative Adversarial Networks – Tensorflow to build GAN’s”
Abstract: GANs has been one of the most interesting developments in deep learning and machine learning recently. Through an innovative combination of computational graphs and game theory, we are going to show you how two models fighting against each other would be
able to co-train and generate new samples. Finally, we will end up with a demo where I will show you some cool stuff people have done using GAN and give you links to some of the important resources for getting deeper into these techniques.

 

https://www.eventbrite.it/e/biglietti-meetup-aperitech-di-deep-learning-italia-46881039451

Uso del aprendizaje profundo para el reconocimiento de objetos

Autor: Joyce Xu

Traductor: Paula Vidal

 

1

1

Con la aparición de los vehículos autónomos, sistemas inteligentes de videovigilancia y diversas aplicaciones, como el conteo de personas, la demanda de sistemas de reconocimiento facial está creciendo. Estos sistemas se refieren no solo al reconocimiento y la clasificación de los objetos en las imágenes, sino también a la ubicación de cada uno de ellos, trazando a su alrededor un cuadro delimitador apropiado. Esto hizo que el sistema de reconocimiento de objetos fuera una tarea cada vez más compleja en comparación con su predecesora en el campo de la visión artificial: clasificación de imágenes.

Afortunadamente, los enfoques más apropiados para el reconocimiento de objetos son, actualmente, extensiones modelo para la clasificación de imágenes. Hace unos meses, Google lanzó una nueva API de reconocimiento de objetos (interfaz de programación de aplicaciones) en Tensorflow. En este lanzamiento, encontramos modelos pre-entrenados con pesos relativos:

En el articulo anterior, hablamos sobre las tres arquitecturas de redes neuronales mencionadas anteriormente (MobileNets, Inception y ResNet), pero hoy veremos los modelos de reconocimiento de objetos para Tensorflow: Faster R-CNN, R-FCN y SSD. A través de este artículo, entenderemos cómo se aplica el aprendizaje profundo a estos modelos para el reconocimiento de objetos, cómo son diferentes unos de otros y qué puntos son comunes.

Faster R-CNN

El R-CNN más rápido es ahora un modelo de referencia para la detección de objetos basado en el aprendizaje profundo, que ha inspirado muchos modelos posteriores de detección y segmentación, incluidos los dos que examinaremos. Desafortunadamente, no podemos entender completamente el R-CNN más rápido sin analizar R-CNN y Fast R-CNN, sus predecesores.

R-CNN

Podemos decir que el R-CNN, Region-based Convolutional Neural Network, es la red que dio vida los juegos. Consiste en tres fases:

  1. Escaneando la imagen de entrada para detectar objetos posibles, usando un algoritmo llamado Selective Search, que extrae aproximadamente 2000 regiones de esta imagen (Region Proposal).
  2. Implementación de la red neuronal convolucional (CNN) en la parte superior de cada región.
  3. Extrapolación de la salida de cada CNN para ingresarla en:
    1. una SVM (Support Vector Machine) para clasificar la región
    2. Realice una regresión lineal para restringir el cuadro delimitador del objeto, si existe.

Las fases estan ilustradas (de abajo hacia arriba) en la figura siguiente:

 

2

2

En otras palabras, primero generamos las regiones posibles, luego extraemos las características y luego clasificamos esas regiones en función de las características extraídas. Básicamente, hemos convertido la detección de objetos en un problema de clasificación. El R-CNN es muy intuitivo pero, lamentablemente,  muy lento.

 

Fast R-CNN

La version creado sucesiva es el Fast R-CNN. Este se parece al original en muchas de sus características, pero es mejor en términos de velocidad de detección para dos aspectos:

  1. La extracción de características se lleva a cabo antes de extraer las regiones de interés, pero usando solo una CNN para toda la imagen en lugar de 2000 CNN en las 2000 regiones sobrepuestas .
  2. SVM se reemplaza por una función softmax , además, la red neuronal también se usa para realizar pronósticos en lugar de crear un nuevo modelo

 

El modelo se ve más o menos así:

 

3 1

3 1

Como podemos ver en la imagen, ahora estamos generando propuestas regionales basadas no en la imagen original, sino en el último mapa de las características extrapoladas de la red. Esto nos permite entrenar solo una CNN para toda la imagen.

Además, en lugar de entrenar diferentes SVM para clasificar cada objeto, hay una sola capa de softmax que genera directamente la probabilidad para la categoria de referencia. Entonces, ahora tenemos una sola red para entrenar, con la diferencia de lo que sucedió anteriormente donde en cambio había una red neuronal flanqueada por múltiples SVM.

El Fast R-CNN se desempeña, por lo tanto, mejor en términos de velocidad. Sin embargo, queda un defecto importante: el algoritmo de selective search que propone posibles regiones.

Faster R-CNN

Ahora hemos alcanzado el objetivo inicial de nuestro artículo: Faster R-CNN. La intuición fue aquella de reemplazar el lento algoritmo de  selective search con una red neuronal rápida. Específicamente, se introdujo la region proposal network  (RPN), una red de propuesta regional.

Cómo funciona el RPN:

  • En la última capa de una CNN inicial, una ventana deslizante de 3×3 se mueve a través del mapa de características para asignarle un tamaño más pequeño (por ejemplo, 256-d).
  • Para cada posición de ventana deslizante, el RPN genera múltiples regiones posibles basadas en uniones espaciales de dimensiones fijas llamadas cajas de anclaje. (anchor boxes).
  • Cada propuesta regional consiste en:
  • un puntaje (score) para la presencia del objeto en esa región en particular
  • 4 coordenadas que representan el cuadro delimitador de la región.

En otras palabras, veamos nuestra región en el último mapa de características, teniendo en cuenta los diferentes k caudros de anclaje que lo rodean. Para cada cuadro, se muestra si esta tiene un objeto y  caules son las coordenadas del cuadro. En la imagen, se representa como aparece desde la posición de una ventana deslizante:

 

4 1

4 1

La puntuación de 2k representa la probabilidad dada por softmax para cada caja k debido a la presencia de un objeto. Cabe señalar que, aunque el RPN procesa las coordenadas de los cuadros delimitadores, no clasifica los posibles objetos de todos modos: tiene el único propósito de identificar regiones en las que hay objetos presentes , por lo tanto, comunicar las coordenadas con los cuadros relacionados. Si un cuadro de anclaje tiene una puntuación, relativa a la presencia de un objeto, por encima de un cierto umbral, entonces esa casilla dada se seleccionará como una posible región.

Teniendo ahora nuestras posibles regiones, las presentamos directamente en el Fast R-CNN. Agregamos una capa de Pooling, algunas capas completamente conectadas, finalmente una capa de clasificación softmax y un regresor de  cuadros delimitadores (cuadro delimitador regresivo). Podemos decir que Faster R-CNN = RPN + Fast R-CNN.

 

5 1

5 1

El Faster R-CNN logra asi una  mejor velocidad y precisión. Aunque ha habido múltiples intentos de aumentar la velocidad de reconocimiento de los objetos, solo unos pocos modelos han sido capaces de superar esta red. En otras palabras, el Faster R-CNN ciertamente no es el método más fácil y rápido para la  object detection, pero aún presenta uno de los mejores rendimientos. Por lo tanto, el  Faster R-CNN en Tensorflow con  la Inception ResNet es el modelo más lento pero también el más preciso.

Aunque el la Faster R-CNN puede parecer complejo, es posible observar que en el corazón de su estructura es el mismo su original el R-CNN: identifica las posibles regiones de objetos y las clasifica. Este es el enfoque dominante de la mayoría de los modelos actuales de detección de objetos, incluido el que vamos a analizar ahora.

R-FCN

Regresemos  atras por un momento. Hemos dicho que Fast R-CNN ha mejorado mucho su velocidad de detección al compartir una sola CNN para todas las regiones. Este mecanismo básico es el mismo que el de la R-FCN: aumente la velocidad maximizando el numero de parámetros compartidos.

La Region-based FullyConvolutional Net (R-FCN) comparte la totalidad del cálculo para cada salida individual.

Por un lado, cuando clasificamos un objeto queremos que el modelo sea invariante con las traducciones, para identificarlo donde sea que aparezca. Por otro lado, sin embargo, necesitamos saber también una posible variación de las traducciones: si nuestro objeto está en la esquina superior izquierda, el modelo debe dibujar un cuadro delimitador en ese punto. Entonces, ¿cómo encontrar un compromiso entre los dos extremos, la varianza y la invarianza?

La solución dada por R-FCN es representada por la position-sentitive score maps: mapas de puntuación (relativo a los features, extraer a través de convoluciones, a las que se les asigna un puntaje basado en la presencia una determinada clase dada) sensibles a la posición de los objetos que intentemos clasificar.

Cada uno de estos mapas representa una posición relativa a una clase de objetos. Por ejemplo, un cuadro mapa de puntos podría activarse si identifica el lado superior derecho de un gato, mientras que otro podría activarse cuando detecta el lado inferior izquierdo de una máquina. Esencialmente, estos mapas de puntuación son mapas de características convolucionales que han sido entrenados para reconocer ciertas partes de cada objeto.

La R-FCN funciona de la siguiente manera:

Ejecuta una CNN (en este caso un ResNet) en la imagen de entrada.

Agregue una capa convolucional que incluya todos los mapas generados a partir del paso anterior para obtener un conjunto de puntuaciones de las imágenes generales  . Obtenemos k²(C+1) puntuación de mapas, donde k² representa el número de posiciones relativas para dividir un objeto (por ejemplo 3²  para una cuadrícula 3×3), donde C+1

  1. Ejecute una RPN para generar regiones de interés (RoI)
  2. Divide cada una RoI en el mismo k² subregiones el cual está compuesto por mapas de puntuaciones
  3. Ahora debemos verificar si en la suma de los puntajes generales, de cada subregión coincide con la posición relativa correspondiente de un objeto. Por ejemplo, si queremos considerar la subregión en la esquina superior izquierda, debemos tomar el mapa de puntuación que corresponde a la esquina superior izquierda de un objeto y convertirlo en un promedio dentro del ROl. Este proceso se repite para cada catergoria.
  4. Despues que cada k² subregión tiene un valor de “object match” por cada categoria, se obtiene un promedio de las subregiones para obtener un puntaje para cada categoria.

5.Clasifique los RoI con una función softmax en los restantes C + 1 vectores dimensionales

 

Un R-FCN, que tiene un RPN que genera los RoI, aparecerá más o menos así:

6 1

6 1

Comprender cómo funciona este modelo es más fácil si realmente puede visualizar concretamente lo que hace. A continuación tenemos un ejemplo de cómo funciona mientras busca de dectectar un recién nacido.

 

7

7

Figura 4: podemos observar una RoI que no se superpone correctamente con el objeto
Figura 3: Observamos una R-FCN (k x k = 3 x 3) por la categoria persona

En términos simples: el R-FCN considera cada región, subdividiéndolas en subregiones y preguntando a cada una de ellas si corresponden a la porción relativa de la imagen de entrada. Por ejemplo, “¿Se parece a la parte centro derecha de un niño?”. Esto se repite en cada categoria. Si la mayoría de las partes de las subregiones resultan correspondientes, entonces el RoI lo clasifica como recién nacido, después que la función softmax lo ha realizado en en todas las categorias.

De esta forma, el R-FCN puede identificar simultáneamente la varianza de las traducciones, proponiendo diferentes regiones de objetos y la invariabilidad de las traducciones a través de la referencia de cada región a los mismos mapas de puntuación. Estos mapas de puntuación deberian aprender a clasificar un gato como tal, donde sea que aparezca. Además, es completamente convolucional: esto significa que el cálculo se comparte en toda la red.

Esto permite que el R-FCN sea s más rápido que el FasterR-CNN , logrando el mismo grado de precisión.

SSD

El último modelo que vamos a analizar es el Single-Shot Detector (SDD) . Como el R-FCN alcanzó una velocidad mucho más alta que el Faster R-CNN pero de una forma diferente.

Los primeros dos modelos realizan una  region proposal y region classification en dos fases distintas. En primer lugar, utilizan una RPN (region proposal network) para generar las regiones de interés, luego clasifican estas regiones a través de sus capas totalmente conectadas o las capas convolucionales sensibles a la posición de los objetos que se van a clasificar. El SSD combina estos dos procesos en un solo paso, al tiempo que proporciona los cuadros de delimitación y las categoria, en el momento que examina la imagen.

 

 

Dada una imagen de entrada y un conjunto de etiquetas para al dataset, la SSD actúa de esta manera:

1) Pasa la imagen a través de una serie de capas convolucionales, produciendo mapas de las características a diferentes escalas (por ejemplo, 10×10, luego 6×6 y nuevamente 3×3, etc.)

2) Por cada posición en cada uno de estos mapas de características, se usa un filtro convolucional de 3×3 para evaluar un pequeño conjunto de requadros delimitadores predefinidos. Estos últimos son el equivalente a cuadros de anclaje(anchor boxes) del Faster R-CNN

3)Por cada requadro establece al mismo tiempo:

  1. El recuadro del bounding box
  2. La probabilidad para cada categoria.

Durante el entrenamiento se hace coincidir el requadro real con el predicho sobre Intersection over Union (IoU), que es el índice de Jaccard. Los recuadros mejores pr se etiquetarán como “positivos”, así como todos los demás recuadros con un valor de IoU> 0.5.

Durante el entrenamiento de la SSD, sin embargo, existe una dificultad peculiar en comparación con los modelos anteriores. En los primeros dos modelos, el RPN permitió considerar solo lo que tenía la más mínima posibilidad de ser un objeto. Con la SSD, sin embargo, se elimina el primer filtro: clasifica y rastrea cuadros delimitadores en cada posición de la imagen, usando recuadros de diferentes formas y escalas múltiples. Esto da como resultado  un número mucho mayor de recuadros  donde la mayoría de estos son negativos (ya que no detecta objetos).

El SSD corrige este problema de dos maneras. Primero, utiliza la no-maximum suppression  (NMS) para agrupar varias requadros superpuestos en una unico recuadro. Entonces, por ejemplo, cuatro recuadros de forma y tamaño similares contienen el mismo objeto, el NMS le permite mantener el mejor rquadro, el más preciso, y descartar los restantes. En segundo lugar, utiliza una técnica llamada  para hard negative mining para equilibrar las categorias durante el entrenamiento. Con esta técnica, solo se utiliza un subconjunto de ejemplos negativos con la mayorloss in fase di training  (los denominados falsos positivos)  que se  usa para cada iteración durante el entrenamiento. El SSD mantiene una relación de 3: 1 entre negativos y positivos.

 

 

 

Su arquitectura se ve así:

8

Como se mencionó anteriormente, vemos que hay “extra feature layers. Estos mapas de características de tamaño variable ayudan a identificar objetos de diferentes tamaños. Aquí hay un ejemplo:

9

En mapas de funciones más pequeñas (4×4), cada cuadro cubre una región más amplia de la imagen, lo que le permite identificar objetos más grandes. La region proposal y la clasificación se ejecutan al mismo tiempo: teniendo categorias p de objetos, cada cuadro delimitador se asocia con un vector dimensional (4 + p) que produce 4 recuadros de coordenadas y probabilidad de categorias p. En última instancia, una función sotmax también se usa para clasificar objetos.

Por lo tanto, podemos decir que el SSD no es tan diferente de los dos modelos anteriores. Sin embargo, omite el paso de la identificación de la región, considerando cada cuadro en cada posición de la imagen junto con su clasificación. Al realizar todos estos procesos simultáneamente, el SSD es sin duda el más rápido de los tres modelos considerados.

 

 

 

 

Conclusión

El  Faster R-CNN , el R-FCN y el SSD son tres de los mejores y más usados modelos para la detección de objetos. Todos ellos confían en las redes neuronales convolucionales para las primeras etapas del proceso y siguen, más o menos, el mismo método de proponer regiones y clasificación.

Redes neuronales capsulares

Autor: Matteo Alberti

Traductor: Paula Vidal

 

Las redes neuronales convolucionales obtienen grandes resultados cuando los datos que estan en fase de prueba, resultan ser muy similares a los utilizados en la fase de aprendizaje, pero, en caso de rotaciones, traducciones o transformaciones, estos resultan sujetos a una falta de capacidad para generalizar. Por lo tanto, es una práctica común proporcionarle a nuestro training set un aumento de datos y de los ejemplos de estas posibles variantes, sin embargo, obtenemos un aprendizaje mnemotécnico en nuestra red (con el crecimiento computacional vinculado a la mayor cantidad de datos) en lugar de tener un modelo capaz de generalizar bien y que distinga cada tipo de situacion.

En los últimos años, las investigaciones en el campo de computer vison (en lo que se refiere al aprendizaje profundo) se centró en cómo aumentar la profundidad de una red, agregando más capas (capas) para lograr un mayor grado de abstracción (comenzando desde las primeras capas convolucionales capaces de extraer formas pequeñas, ángulos o intensidad de color, vamos paso a paso combinando características simples en diseños cada vez más complejos)

Para hacer esto, tenemos que mantener bajo control el número de parámetros (y los tiempos computacionales) usamos un operador, común en todas las redes profundas, osea un pooling (para ser precisos, la versión llamada max-pooling) que nos permite que reduzca el número de parámetros reduciendo progresivamente el componente espacial seleccionando los valores más altos pero perdiendo la información espacial relacionada con las características extraídas.

 

1

 

Por lo tanto, la investigación sobre la arquitectura de las redes neuronales se centra progresivamente en el objetivo de aprender a generalizar mejor en lugar de proporcionar datos cada vez más procesados. Se realizó un primer paso con las redes neuronales capsulares, donde nuestro objetivo es obtener una Equivariancia (invarianza de las rototraslaciones) que reemplace al operador de pooling con una nueva estructura denominada: Dynamic Routing

  

Introduccion

Una cápsula es un grupo de neuronas. La actividad de un vector de una cápsula representa los parámetros de instanciación cuando un objeto (o parte de él) viene detectado por la red. La longitud de este vector representa la probabilidad de existencia de la clase dada, mientras que la orientación del vector codifica información espacial (por ejemplo, rotaciones y traducciones) dentro de una matriz de posa.

Matriz de Posa: es una herramienta utilizada en la representación gráfica donde la construcción de una imagen parte de una representación jerárquica de formas geométricas. En nuestro caso, el objetivo resulta ser un objetivo un tanto opuesto; deconstruir una imagen en sus componentes básicos de la cual vamos a guardar la posición relativa en referencia a las otras características

 

2.jpg

Cuando una cápsula que está en un nivel inferior se activa produce una predicción aproximada a su nodo de afiliación de las cápsulas en su nivel superior a través de una matriz de transformación. Si una cápsula de alto nivel recibe suficientes predicciones de pertenencia, se activa. Este proceso, denominado dynamic routing, permite sustituir el pooling máximo a través de una selección “inteligente” de características que se mantienen durante la fase de formación.

 

3

Clasificado la cara solo la figura de la izquierda

 

Arquitectura

 

La principal diferencia en las redes capsulares, por lo tanto, consiste en una arquitectura no profunda.

4

 Vamos Analizar las capas principales:

  • La primera capa convolucional (256 kernels, 9×9, stride igual a uno, activación ReLu)

En la primera capa convolucional vamos a convertir la intensidad de los píxeles en características de bajo nivel, no nos importa mantener la posición espacial relativa; de hecho, queremos utilizar todas esas propiedades importantes par acompartir parámetros útiles para reducir los tiempos computacionales.

Il secondo strato dunque riceve in input le features estratte tramite convoluzione:

  • PrimaryCaps consiste en dos capas ocultas

La primera capa corresponde al proceso de rendering el cual lo hemos descrito antes.

La segunda capa, por el contrario, es convolucional (32 cápsulas 8 dimensionales) donde cada cápsula representa una característica extraída, por lo tanto, a través de una convolución de 9×9 kernels y un ritmo igual a dos.

El output de PrimaryCaps consiste por lo tanto, en cápsulas de 32x6x6 8 dimensiones.

  • DigitCaps

 

La última capa por reproducir en forma vectorial h FC-Layer, es decir, vamos a reducir el número de neuronas (en este caso de cápsulas) para obtener una para cada clase del objetivo

 

Resumiendo las principales innovaciones:

  • Reemplazar las neuronas con las cápsulas
  • Reemplazo de max-pooling con dynamic routing
  • Nueva función de activación
  • Arquitectura no profunda

 

Función de activación

Como se introdujo anteriormente, queremos que la actividad vectorial producida por una cápsula represente la probabilidad de existencia de la data feature . Entonces, necesitamos una nueva función de activación que ya no funcione con escalares sino con vectores:

.

La siguiente función, llamada“squashing” no hace nada más que normalizar en nuestro vector entre cero y uno sin modificar la orientación del mismo vector.

Esto nos permite no solo Equivariance sino, en el caso de la detección de rostros, por ejemplo, podemos saber si y cuántos grados gira la cara.

5

Dynamic Routing

Dynamic Routing no es solo un max-pooling que seleziona el número de conexiones de una manera más inteligente, nos permite preservar, como se describió anteriormente, la “jerarquía entre las partes”El Dynamic Routing quindi es un proceso iterativo, en la fase directa, que conecta cápsulas con actividades  similares.

 

2.jpg 1

En cada iteración cada cápsula produce una matriz de multiplicación con la salida de las cápsulas anteriores seleccionando solo aquellos con mayor producto escalar y orientación similar, analizando:

 

5 1

 

1)  Cápsulas en el nivel l y su salida  , r número de iteraciones de routing

2)  coeficiente temporal necesario para la iteración inicializada a cero

4)   Es pesado para cápsulas de “bajo nivel”, el uso del softmax para obtener un escalar no negativo con suma a uno. La primera iteración     la misma para todas las cápsulas que inician con

5) Para cada cápsula de “alto nivel”, calculamos una combinación lineal de los datos de entrada pesados con los coeficientes  , es decir, vamos a sumarlos y redimensionarlos

6) Aplicamos la función squash para “normalizar” a 1 y preservar la orientación del vector

 

 

Entrenamiento de una red capsular

Una vez fijado el forward pass a través del dynamic routing, vamos a entrenar nuestra red a través de una función de doble pérdida.

  • La primera parte se entrena a traves de una backpropagation como en las clasicas CNN , entonces entrenemos los siguientes pesos  para maximizar la norma de la cápsula  relativa a la de clase objetivo  ()
  • Otra versión de la red usa un MLP (como Autoencoding) para reconstruir la imagen de entrad

Nuestra función de pérdida será dada por Loss Funcion =  + p

Donde el término p no es más que un término de penalización para no afectar excesivamente a la segunda parte

 

2.jpg 2

 

Esta función de autocodificación es posible porque dentro de cada capsula final (una por cada clase del objetivo) toda la información está codificada para reconstruir la imagen. Entonces podemos crear una especie de función discriminativa que compare los datos de entrada con el target reconstruido usando la información de la matriz de posa.

 

Accuratezze raggiunte

1 1

 

Además de la precisión clásica, es interesante evaluar las propiedades intrínsecas de este modelo

Parametros CNN: 35.4 M (Deep)

Parametros Capsnet (8.2 M)

El número de parametros resulta significativamente más bajo debido a la menor cantidad de datos. Pero difiere mucho del large-dataset de gran tamaño en cuanto, el mecanismo aún no está optimizado

 

Resistencia a las transformaciones relacionadas:

CNN 66%

CapsuleNet 79%

 

Alta capacidad discriminatoria en objetos superpuestos:

 

2.jpg 3

Gracias a su capacidad de reconstrucción, no solo podemos clasificar sino segmentar objetos superpuestos (uno de los grandes límites de las redes neuronales convolucionales)

 

Google TPU

Andrew Ng 175M