# Aprendizaje por transferencia con capas congeladas

## Antes de empezar

Clonar repo e instalar requirements.txt en un Python>=3.8.0 incluyendo PyTorch>=1.8. Los modelos y conjuntos de datos se descargan autom谩ticamente de la 煤ltimaversi贸n de YOLOv5 .

``````git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install
``````

## Congelar columna vertebral

Todas las capas que coinciden con el tren.py `freeze` en train.py se congelar谩n poniendo sus gradientes a cero antes de iniciar el entrenamiento.

``````# Freeze
freeze = [f"model.{x}." for x in range(freeze)]  # layers to freeze
for k, v in model.named_parameters():
v.requires_grad = True  # train all layers
if any(x in k for x in freeze):
print(f"freezing {k}")
``````

Para ver una lista de nombres de m贸dulos:

``````for k, v in model.named_parameters():
print(k)

"""Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
model.23.m.0.cv2.bn.weight
model.23.m.0.cv2.bn.bias
model.24.m.0.weight
model.24.m.0.bias
model.24.m.1.weight
model.24.m.1.bias
model.24.m.2.weight
model.24.m.2.bias
"""
``````

Si observamos la arquitectura del modelo, podemos ver que la columna vertebral del modelo son las capas 0-9:

``````# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
- [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C3, [128]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C3, [256]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 9, C3, [512]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C3, [1024]]
- [-1, 1, SPPF, [1024, 5]] # 9

- [-1, 1, Conv, [512, 1, 1]]
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C3, [512, False]] # 13

- [-1, 1, Conv, [256, 1, 1]]
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C3, [256, False]] # 17 (P3/8-small)

- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 14], 1, Concat, [1]] # cat head P4
- [-1, 3, C3, [512, False]] # 20 (P4/16-medium)

- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 10], 1, Concat, [1]] # cat head P5
- [-1, 3, C3, [1024, False]] # 23 (P5/32-large)

- [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)
``````

por lo que podemos definir la lista de congelaci贸n para que contenga todos los m贸dulos con 'modelo.0.' - 'model.9.' en sus nombres:

``````python train.py --freeze 10
``````

## Congelar todas las capas

Para congelar el modelo completo excepto las capas de convoluci贸n de salida finales en Detect(), establecemos que la lista de congelaci贸n contenga todos los m贸dulos con 'model.0.' - 'modelo.23.' en sus nombres:

``````python train.py --freeze 24
``````

Entrenamos YOLOv5m en COCO en los dos escenarios anteriores, junto con un modelo por defecto (sin congelaci贸n), partiendo del COCO oficial preentrenado `--weights yolov5m.pt`:

``````train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml
``````

### Comparaci贸n de la precisi贸n

Los resultados muestran que la congelaci贸n acelera el entrenamiento, pero reduce ligeramente la precisi贸n final.

### GPU Comparaci贸n de la utilizaci贸n

Curiosamente, cuantos m谩s m贸dulos se congelan, menos memoria GPU se necesita para entrenar, y menor es la utilizaci贸n de GPU . Esto indica que los modelos m谩s grandes, o los modelos entrenados con un --tama帽o de imagen mayor, pueden beneficiarse de la congelaci贸n para entrenarse m谩s r谩pidamente.

## Entornos compatibles

Ultralytics proporciona una serie de entornos listos para usar, cada uno de ellos preinstalado con dependencias esenciales como CUDA, CUDNNPythony PyTorchpara poner en marcha tus proyectos.