Aprender conceptos iniciales de Deep Learning

1

驴Qu茅 es el Deep Learning?

2

驴Qu茅 son las redes neuronales artificiales?

3

驴Por qu茅 el Deep Learning ahora?

4

Pytorch y los diferentes frameworks de Deep Learning

5

Setup en Google Colab

Entender la API de Pytorch

6

驴Qu茅 son los tensores?

7

Tensores y datasets

8

Capas de una red neuronal en Pytorch

9

Crear una red neuronal en Pytorch

10

驴C贸mo cargar datos en Pytorch?

11

驴C贸mo entrenar una red en Pytorch?

12

Loop de entrenamiento de la red neuronal

Entrenar Redes Neuronales Profundas

13

Ciclo de trabajo para el Deep Learning

14

Espacio de modelos

15

Funci贸n de perdida

16

M茅todo de optimizaci贸n: SGD y Backpropagation

17

Autograd y m茅todos de optimizaci贸n

18

驴C贸mo evaluar la performance de la red neuronal?

19

Regularizaci贸n de redes neuronales profundas

20

Implementando la Regularizaci贸n

21

Optimizaci贸n de hiperparametros

22

Transfer learning

Construir nuestro propio modelo

23

Presentaci贸n del problema

24

Definiendo la red generativa que construiremos: CycleGAN

25

Creando la red generadora convolucional

26

Creando el decoder de la red generadora

27

Construyendo las redes discriminativas

28

Preparando el entrenamiento

29

Instanciando redes, perdidas

30

Instanciando optimizadores y schedulers

31

Calculando las p茅rdidas

32

Entrenando

33

C贸mo visualizar y debugear el entrenamiento

34

C贸mo utilizar tu modelo una vez entrenado

35

C贸mo utilizar una GPU personal con Google Cloud

Llegar m谩s lejos

36

驴Por qu茅 el Deep Learning es m谩s poderoso que el Machine Learning Tradicional?

37

Para ir m谩s lejos

38

Cierre del curso

Bonus

39

驴Por qu茅 aprender Deep Learning?

Transfer learning

22/39

Lectura

Transfer Learning

Ya hemos visto que muchas t茅cnicas permiten mejorar el aprendizaje de una red profunda en particular las t茅cnicas de regularizaci贸n.

En lo que sigue veremos otra t茅cnica muy practica, que sin embargo escapa un poco de las t茅cnicas regulares sobre hiperpar谩metros o capacidad del modelo.

Extracci贸n de Features

Una primera forma de ver el transfer learning es considerar los valores de las neuronas de las capas interiores de la red son features. En particular nos interesamos en la pen煤ltima capa de una red profunda ya entrenada:

  • Estas features al haber sido calculadas por el entrenamiento con gradiente en datasets p煤blicos de gran tama帽o como ImageNet contienen mucha informaci贸n.
  • Vamos a utilizar la red neuronal solo como preprocesamiento para obtener las features de la pen煤ltima capa.
  • La idea inteligente es construir por sobre estas features un clasificador tradicional (por ende no profundo) y entrenar este con nuestro dataset.

Recuerden que dijimos que casi siempre la 煤ltima capa de una red neuronal profunda es una capa lineal -a.k.a fully connected- as铆 que para realizar nuestro prop贸sito nos bastar铆a con botar esta capa y a帽adir un clasificador por encima.

Los clasificadores tradicionales pueden ser: regresi贸n log铆stica, clasificaci贸n lineal, SVM, clasificadores basados en 谩rboles, etc.

Las redes profundas pre-entrenadas ya son la mayor铆a muy complejas, y por lo tanto sus features son muy expresivas. Una soluci贸n simple pero eficaz es agregar una capa lineal al final de la red, es decir realizar una clasificaci贸n lineal simple por sobre las features.

Veamos esto en c贸digo.

  1. Cargo el modelo pre-entrenado
from torchvision import models
vgg = models.vgg16(pretrained=True)
vgg = vgg.to(device)
  1. Deshabilito el gradiente de todos los parametros de la red

Esto se hace porque no queremos seguir cambiando los valores de los parametros. La red ya tiene una buena combinaci贸n de valores para calcular features, y el entrenamiento lo realizaremos 煤nicamente en la capa adicional que agregaremos.

for param in vgg.parameters():
  param.requires_grad = False
  1. Extraemos la 煤ltima capa de la red

VGG fue construida usando nn.Sequential. Esto quiere decir que la 鈥渦ltima capa鈥 en realidad son muchas capas juntas. Por esto deberemos llamar dos veces el met贸do children para acceder a la 煤ltima capa lineal.

last_sequential_layer = list(vgg.children())[-1]
*list_of_layers, last_layer = list(last_sequential_layer.children())
in_features = last_layer.in_features

Para mantener orden dejo en el mismo atributo classifier todas las 煤ltimas capas que iban en nn.Sequential, menos evidentemente la 煤ltima, m谩s la capa nueva lineal que si quiero entrenar y que por lo tanto le habilito el gradiente.

vgg.fc = nn.Linear(in_features,6)
vgg.fc.requires_grad = True
vgg.classifier = nn.Sequential(*(list_of_layers+[vgg.fc]))

El transfer learning consiste basicamente en inicializar los parametros de una red con buenos valores iniciales, extraidos del entrenamiento de la red sobre un dataset publico.

Existen 4 formas de hacer transfer learning y estas dependen directamente del dominio y el tamano del dataset de imagenes.

  1. Lanzo el entrenamiento

Un peque帽o consejo. En general las redes pre-entrenadas fueron entrenadas con datasets que ten铆an cierta media y desviaci贸n est谩ndar. Es recomendable usar esa media y varianza en el pipeline de preprocesamiento.

transform = transforms.Compose(
  [transforms.RandomHorizontalFlip(), #data augmentation
   transforms.ToTensor(),
   transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])    
  ]
)

trainset = SIGNSDataset('/gdrive/My Drive/dl-pytorch/datasets/64x64_SIGNS', split="train", transform = transform)
trainloader = DataLoader(trainset,batch_size=32)

valset = SIGNSDataset('/gdrive/My Drive/dl-pytorch/datasets/64x64_SIGNS', split="val", transform = transform)
valloader = DataLoader(trainset,batch_size=32)

testset = SIGNSDataset('/gdrive/My Drive/dl-pytorch/datasets/64x64_SIGNS', split="test", transform = transform)
testloader = DataLoader(trainset,batch_size=32)

dataloaders = {'train':trainloader,
              'val':valloader,
              'test':testloader}

Ocupamos la funci贸n train_and_evaluate que ya construimos y que nos facilita la vida:

loss_fn = nn.NLLLoss()
optimizer = optim.SGD(net.parameters(), lr=1e-3, momentum = 0.9)

train_and_evaluate(vgg, optimizer, loss_fn, dataloaders, device, num_epochs = 100)

Inicializaci贸n de par谩metros

Una forma m谩s general de ver el Transfer Learning es entenderlo c贸mo una forma de inicializar los par谩metros de manera inteligente (weight initialization).

Existen m谩s formas de inicializar estos par谩metros, como una inicializaci贸n random, o la Xavier initialization. Sin embargo el transfer learning es por lejos la inicializaci贸n m谩s potente ya que los par谩metros de una red profunda contienen informaci贸n muy valiosa. En el paper siguiente podemos entender m谩s de esto y ver que:

  • En una red convolucional los par谩metros vistos en su conjunto (par谩metros de un mismo canal) pueden ser entendidos como un filtro. As铆 es c贸mo los filtros que conoces y transforman el look de una imagen.
  • Los filtros de las primeras capas en una red profunda realizan acciones muy generales: pueden extraer colores, texturas y bordes.
  • Los filtros de las capas m谩s profundas est谩n muy ligados al dominio del cual provienen las fotos y ya son m谩s espec铆fico y por lo tanto menos abstractos que los primeros filtros. Por ejemplo en el caso de un dataset de caras, los filtros van a reconocer conceptos ligados a una cara como narices, ojos, orejas, etc. Estos filtros se dice que son espec铆ficos al dominio de caras, que claramente ser铆a menos 煤til para reconocer autos por ejemplo.

La t茅cnica que utilizamos anteriormente (extracci贸n de features) corresponde a un caso particular de Transfer Learning. Este se ocupa por ejemplo cuando el dataset que tienes es peque帽o (el nuestro tiene algunos miles de imagenes), o cuando el dominio de tu dataset es muy distinto al que se utiliz贸 para entrenar la red.

En total hay 4 casos a considerar para el Transfer Learning:

Tama帽o del dataset Dominio Transferencia
Peque帽o Similar Remplazar capa final. S贸lo entrenar 煤ltima capa.
Grande Similar Remplazar capa final. Entrenar toda la red.
Peque帽o Diferente Botar m煤ltiples capas finales y poner capa adicional 煤nicamente sobre una capa que tenga features no esp茅cificas al dominio. S贸lo entrenar 煤ltima capa.
Grande Diferente Remplazar capa final. Entrenar toda la red.

Les dejo tambi茅n este excelente link: Transfer Learning CS231n

Aportes 3

Preguntas 1

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Una pregunta:

驴No deberiamos de usar los parametros de la red vgg en la siguiente linea, en lugar de la red que estamos creando net?

optimizer = optim.SGD(net.parameters(), lr=1e-3, momentum = 0.9)

El curso referenciado de Stanford es espectacular. Muy bueno para complementar con este.

excelente