El aprendizaje profundo es un tema candente en este momento. Desde que las redes neuronales artificiales volvieron a tener relevancia, han nacido nuevas arquitecturas, herramientas, metodologías y aplicaciones.

Uno de los mayores desafíos cuando se trabaja con redes neuronales es la capacitación y el alto costo computacional asociado con ella. Para tener una idea, AlexNet tenía 55x55x96 neuronas en la salida de la primera capa convolucional. Cada neurona está conectada a una región de entrada de 11x11x3.
Esa es una gran cantidad de conexiones y neuronas, y estamos hablando de una de las primeras redes profundas famosas. Las arquitecturas han estado creciendo desde entonces.

Entrenar redes de este tamaño es costoso, e incluso con una GPU reciente puede llevar días entrenar una red. ¡Afortunadamente, el aprendizaje de transferencia viene al rescate!

Las redes convolucionales normalmente se componen de una capa de entrada, una pila de capas convolucionales y capas de grupo máximo (submuestreo), una capa totalmente conectada y la capa de salida.

Aphex34 [CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0)], de Wikimedia Commons

Las capas convolucionales son filtros que se aplican a las imágenes, y son básicamente las encargadas de la extracción de características. Cuanto más profunda sea en la red, más específica es la función extraída.
La última capa es básicamente una red clásica y, como sabemos, puede ser menos costosa de entrenar. Se encarga de tomar la salida de la primera parte y clasificarla.

El aprendizaje de transferencia es una técnica en la que tomamos una red pre-entrenada, eliminamos la última parte de la red (el clasificador) y la reemplazamos con la nuestra. Luego entrenamos a nuestro clasificador. Esto nos permite usar arquitecturas probadas en batalla a una fracción del costo.

LEER
Cómo implementar un chatbot básico de Facebook Messenger

Un ejemplo con VGG16 en pytorch es bastante simple. VGG16 es la versión de 16 capas de una arquitectura popular. Primero importamos la red pre-entrenada:

from torchvision import models
vgg16 = models.vgg16(pretrained=True)

Después de eso, deshabilitamos los gradientes para la red:

for param in vgg16.features.parameters():
    param.requires_grad = False

Con eso hecho, reemplazamos el clasificador. En el caso de VGG16, eso está en el índice 6:

from torch import nn
last_layer = nn.Linear(n_inputs, num_labels)
vgg16.classifier[6] = last_layer

En el ejemplo usamos una sola capa, pero puede usar cualquier estructura que considere necesaria. No necesita parecerse al clasificador original.

Después de que se haya reemplazado la última capa, puede proceder a volver a entrenar la red. Como los gradientes no se calcularán para la parte convolucional de la red, la capacitación será mucho más rápida y puede centrarse en el clasificador.

El proceso de capacitación se deja fuera de la publicación, ya que esto es solo una pequeña muestra de lo que es el aprendizaje de transferencia. Si desea obtener más detalles, simplemente explore pytorch. Es un marco potente y flexible para el aprendizaje profundo. Se tarda un poco más en aprender en comparación con los keras, pero le encantará una vez que su primera red funcione.


Comentarios