Impresiones sobre el curso de Stanford de visión computarizada CS231n

Iván de Prado
Iván’s blog
Published in
7 min readMay 7, 2018

Acabo de finalizar el curso de Stanford CS231n: Convolutional Neural Networks for Visual Recognition en su edición de primavera de 2017 (la de 2018 no está publicada aún) y voy a compartir mis impresiones al respecto. Pero puedo adelantar la conclusión principal: es un curso que merece la pena.

Para quien sea impaciente, que salte directamente a la sección de por qué recomiendo el curso.

De qué va

Aunque seguro que muchos ya lo sabéis, en los últimos años asistimos a una revolución en la capacidad de “ver” de los ordenadores. Ésto se ha producido por el redescubrimiento de las redes neuronales en la forma de redes convolucionales, el aumento de la capacidad de cálculo que proporcionan las GPUs y la existencia de conjuntos de datos para entrenar de gran tamaño (como ImageNet o COCO). Como una imagen vale más que mil palabras, echa un vistazo al siguiente gráfico:

Se representa la evolución en el error en los algoritmos al enfrentarse al problema de clasificar las imágenes de ImageNet (1 millón de imágenes, 1000 categorías a clasificar). En 2012 llegaron las redes convolucionales para quedarse con la corona (menor ratio de error) y año tras años las mejoras en esta técnica han sido impresionantes hasta el punto que en 2015 los algoritmos superaron la capacidad humana en la clasificación de esas imágenes.

El curso de Stanford introduce las bases necesarias para manejarse con las redes neuronales y su herramienta más potente para visión: las redes neuronales convolucionales.

Los contenidos del curso son públicos y accesibles para cualquiera. Un aplauso para Stanford, ¡bravo! Es increíble que podamos tener acceso a clases y materiales de tanta calidad de forma gratuita. Si se es disciplinado, podría uno hacerse una carrera simplemente contando con un ordenador e Internet.

Contenido

El curso consta de tres tipos de materiales:

  • 16 clases en vídeo de una hora aproximada de duración. Bien montadas, de forma que se puede oír bien al profesor, ver las slides presentadas, entender las preguntas de los alumnos, etc.
  • Notas del curso escritas por Andrej Karpathy, director de IA en Tesla. Muy buenas, pero no cubren todo el material explicado en las clases.
  • Ejercicios (assignments 1, 2, y 3) . Desde mi punto de vista, lo mejor del curso.

El itinerario del curso consta de tres partes.

En la primera parte se hace una introducción a la problemática y técnicas básicas de la visión por computador (CV) para posteriormente pasar a lo básico de las redes neuronales: clasificación, backpropagation y optimización.

Las redes convolucionales se atacan en la segunda parte. Aquí entran cuestiones importantes como batch normalization, arquitecturas avanzadas y regularización.

En la tercera parte se cubren temas avanzados y variados, sin profundizar tanto como en las secciones anteriores. Me estoy refiriendo a temas como detección de objetos, segmentación, redes neuronales recurrentes, GANs, transferencia de estilo, visualización y entendimiento de redes convolucionales, reinforce learning, ejemplos adversos, eficiencia.

Pero como realmente se aprende es haciendo los ejercicios. Hay varios de ellos en Jupyter Notebooks. Para la mayor parte no es necesario contar con una GPU, pero en ciertas partes sí hace falta. Vienen instrucciones para poder arrancar una instancia con GPU tanto en Amazon como en Google, así que no hay problema si no contamos con una GPU en nuestro equipo.

Por qué recomiendo el curso

Conocer los entresijos

La razón principal por la que me gusta el curso es porque te obliga a implementar una red convolucional de arriba a abajo. Lo hace de manera ordenada, paso a paso, para que no te atragantes. Primero una red neuronal básica. Se implementa la pasada hacia adelante. Luego la pasada hacia atrás. Y poco a poco se va incrementando la complejidad. Cuando te quieras dar cuenta habrás implementado un mini-framework basado en Numpy para redes neuronales. Es importante porque es realmente básico entender cuáles son los cimientos aunque luego en el trabajo del día a día estas cuestiones de implementación suelen estar gestionadas por el framework de turno (Tensorflow, etc).

La parte más complicada de esta parte es el backpropagation (que implica revisar los conceptos de derivadas y la regla de la cadena), y la programación vectorial, es decir, cómo manejarse con matrices e implementar todo en base a sus operaciones. Como he dicho se implementa todo usando Numpy, del que se ofrece un tutorial que es muy interesante porque se aprenden cuestiones de mucha relevancia como son el broadcasting y el indexing.

Los ejercicios contienen tests para comprobar si tu implementación es correcta, lo cual es importante cuando careces de compañeros o de profesores que te puedan resolver dudas (aunque hay infinidad de soluciones de los ejercicios publicadas en Internet, ¡¡¡pero no caigas en la tentación!!!).

Explicación visual

Más cosas que me gustan son que las clases optan por lo visual frente a lo formal. Es fácil perderse con las formulas, sobre todo si tu perfil es más de programador que de matemático. Y muchas veces estas formulas no son más que tres o cuatro bucles for anidados. En las clases se pone más peso en la presentación visual, con diagramas, que en la explicación por la vía de la formula. Por poner un ejemplo, me gustó mucho como se explicaron las LSTM en esta slide:

Captura de una slide en de la clase 10

Donde se puede ver que al final una LSTM es una multiplicación de una matriz w por otras dos matrices que se juntan (x, h), de donde te sale al final una matriz que haces 4 cachos para conseguir i, f, o, g, a las cuales finalmente aplicas ciertas transformaciones sencillas para obtener c_t y h_t. Por comparar, aquí tengo la definición de una LSTM de la Wikipedia:

Extraído de la Wikipedia

No hay color. Realmente a mí me resulta muy aclarador el poder ver el diagrama para luego entender las fórmulas.

Buena elección de los frameworks

En los ejercicios en los que se empieza a usar frameworks se permite optar por dos posibilidades: PyTorch y Tensorflow.

Desde mi punto de vista un acierto los dos. Una razón es la popularidad. Véase el siguiente gráfico compartido por Karpathy:

En él se puede ver la evolución en el número de menciones de cada framework en los papers de ArXiv. Como se puede ver, Tensorflow es el claro ganador, pero PyTorch tiene una evolución explosiva desde su aparición.

En segundo lugar, ambos frameworks tienen enfoques muy distintos que los hacen más útiles según el caso.

PyTorch es más sencillo, más intuitivo y mejor para experimentar. Pero no está listo para ser usado en producción (aunque habrá avances en esta dirección).

Por otro lado, Tensorflow está listo para ser usado en producción, e incluso en diferentes dispositivos, móviles, etc. Pero como contrapartida es bastante más complejo de usar. Aunque también hay avances en su simplificación, como podrían ser Keras o Eager Execution.

En definitiva, yo recomiendo hacer todos los ejercicios en ambos frameworks (aunque reconozco que yo sólo lo hice para algunos ;-) )

Qué he echado en falta

El mayor defecto que le veo es que no profundiza casi nada en algoritmos de detección de objetos (DO) y segmentación de imágenes (SI). Detección de objetos es la posibilidad de detectar qué objetos hay en una imagen dada y donde están colocados. Segmentación de imágenes es la capacidad de conocer a qué clase pertenece cada pixel de una imagen (este pixel forma parte de un coche, de una persona o simplemente es “fondo”).

Para mí tanto la DO como la SI son las dos aplicaciones más importantes. Son necesarias en multitud de casos. Sólo se dedica una sesión a este tema y además no hay ningún ejercicio asociado. El curso pone el foco en todo momento en la clasificación, a pesar de que simplemente clasificar una imagen de manera global tiene un uso más limitado.

Imagino que la razón es una cuestión de tiempo, ya que no es un tema sencillo y el curso es corto. Supongo que no había tiempo para más.

Conclusión

Si buscas tener una buena base en CV el curso es muy recomendable. No me extraña que sea tan famoso.

También he de decir que no es un curso fácil. Yo lo he hecho con conocimiento previo sobre el asunto y es probable que para alguien sin cierta experiencia en machine learning o en redes neuronales sea demasiado de entrada. Si alguien quiere algo más básico sobre redes neuronales y deep learning, recomiendo empezar por este curso.

Por finalizar, dejo unas preguntas en el aire: ¿Alguna otra recomendación para formación en estos temas? ¿Qué otros cursos avanzados recomendaríais? ¿Alguno que complementase a éste en temas de detección de objectos y segmentación?

--

--