Hola, este será mi primer post para esta comunidad, hablaré acerca de Caffe, y no, no es por querer perpetuar el cliché de que los programadores solo funcionamos en base a cafeína. Caffe es una de las primeras herramientas para Deep Learning, en específico para redes Convolutional Neural Networks(CNN).

Desarrollado en la Universidad de Berkeley, esta plataforma Open Source fué una de las primeras herramientas en popularizar el tema de Deep Learning, la principal razón es que no es necesario saber programar o al menos no de manera avanzada ya que nos provee con bloques (Convolution layers, Fully connected, etc) implementados para crear nuestras arquitecturas de forma declarativa. Caffe está desarrollado en C++ con interfaces en el mismo lenguaje, Python y MATLAB con la diferencia de que la descripción de los modelos se escribe en Protocol Buffers, una herramienta de serialización de mensajes lanzada en Google.

Es importante entender como funciona esta herramienta llamada Protocol Buffers, el cual funje como un lenguaje neutral con mecanismos para serializar y deserializar estructuras de datos de forma que podrán ser almacenados o enviados a través de una red de comunicaciones.

A continuación les muestro un ejemplo de como se declara un mensaje en Protocol Buffers:

message Person {
    required string name = 1;
    required int32 id = 2;
    optional string email = 3;
}

Para crear un modelo en Caffe, no es más complicado que describir cada capa, sus parámetros como nombre, conexiones, y sus hiperparámetros, por ejemplo esto sería una capa convolucional:

layer {
    name: "conv1"
    type: "Convolution"
    param { lr_mult: 1 }
    param { lr_mult: 2 }
    convolution_param {
        num_output: 20
        kernel_size: 5
        stride: 1
        weight_filler {
            type: "xavier"
        }
        bias_filler {
            type: "constant"
        }
    }
    bottom: "data"
    top: "conv1"
}

De esta manera podemos crear nuestro modelo sin usar una sola línea de código C++, Python o MATLAB (igual usando esas interfaces se genera esto) la extensión de nuestro archivo será prototxt, el siguiente paso será crear un archivo que llamaremos solver que básicamente describe nuestros hiperparámetros para el entrenamiento como Optimizador, Learning rate, momentum, entre otras cosas. Además, indicamos si queremos usar el GPU o CPU para el entrenamiento:

net: "models/my_model/train_test.prototxt"
test_iter: 100
test_interval: 500
base_lr: 0.001
momentum: 0.9
momentum2: 0.999
lr_policy: "fixed"
display: 100
max_iter: 10000
snapshot: 5000
snapshot_prefix: "models/my_model/train"
type: "Adam"
solver_mode: GPU

Las CNN son computacionalmente pesadas en su cálculo, por ejemplo Alexnet, requiere más de 60 millones de parámetros a calcular, por lo que usar GPU (pueden realizar una cantidad enorme de operaciones en punto flotante de manera paralela) es necesario su entrenamiento y en algunos casos su ejecución. Caffe además de usar GPU para aceleramiento, tiene una aportación que reduce los menos llamados a memoria, esto a través de manejar la información en “Blobs” con esto se hace cargo de tomar y enviar la información de manera eficiente en memoria, es decir crea bloques de información en memoria a demanda de manera sincronizada con los GPU/CPU.

remotesensing-09-00848-g001 [AlexNet description by http://www.mdpi.com/217036]

Caffe puede tomar muchos tipos de datos para sus modelos por ejemplo en imágenes jpg,png, etc, pero la manera más rápida y eficiente es convertir nuestros dataset a un formato LMDB con todo esto el entrenamiento tendrá un excelente desempeño (aunque sufrirá en almacenamiento nuestro disco duro), al igual que nuestro modelo la extensión es “prototxt”.
Por ultimo con nuestros archivos vía terminal desde el folder de Caffe escribimos la siguiente instrucción:

./build/tools/caffe train --solver=models/my_model/solver.prototxt

Al finalizar tendremos un archivo con la extensión .caffemodel que son los pesos de nuestro modelo entrenado, con esto podemos hacer un “deploy” en C++, Python o MATLAB, lo genial de Caffe no termina en su manera de crear modelos y entrenar, podemos hacer fine-tuning o transfer learning, ¿Qué es esto? Pues básicamente es tomar modelos ya entrenados si usamos un modelo similar pero con diferentes parámetros esto hace que los tiempos de entrenamiento sean cortos y con una mejor precisión o si estamos creando un modelo más extenso pero que tomo como base otro modelo, podemos tomar esos pesos y solo dedicarnos a entrenar el resto de nuestro modelo. Caffe creo algo llamado “Model Zoo” aquí puedes encontrar aplicaciones de Deep Learning con sus modelos y pesos.

Por el momento ha perdido mucho de su momento, la razón muchos de sus características las han adoptado, mejorado y agregado más, otras plataformas como Tensorflow, mxnet, inclusive Pytorch hizo merge con una rama de Caffe, lo que al día de hoy por lo menos por qué para mí sigue siendo relevante, es por sus aplicaciones en sistemas embebidos para la aceleración de inferencia (predicción), la idea es sencilla es ejecutar aplicaciones Deep Learning con poco espacio de almacenamiento, con alto poder computacional y de bajo consumo de energía, claro no es usar lo directamente, es necesario realizar técnicas de “cuantificación” y “pruning” (reducir la representación numérica y eliminar pesos todo esto sin afectar la exactitud del modelo). Caffe es muy amigable para realizar estas técnicas, esto nos permite su implementación en sistemas embebidos con desempeños casi iguales a GPU, pero con un consumo de memoria y energía mucho más pequeño, esto es ideal para aplicaciones de vehículos autónomos, internet de las cosas, dispositivos móviles entre otras.