Aprendizaje por transferencia con capas congeladas
馃摎 Esta gu铆a explica c贸mo congelar YOLOv5 馃殌 capas cuando aprendizaje por transferencia. El aprendizaje por transferencia es una forma 煤til de volver a entrenar r谩pidamente un modelo con nuevos datos sin tener que volver a entrenar toda la red. En su lugar, parte de los pesos iniciales se congelan en su lugar, y el resto de los pesos se utilizan para calcular la p茅rdida y son actualizados por el optimizador. Esto requiere menos recursos que el entrenamiento normal y permite tiempos de entrenamiento m谩s r谩pidos, aunque tambi茅n puede dar lugar a reducciones en la precisi贸n final entrenada.
Antes de empezar
Clonar repo e instalar requirements.txt en a 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 train.py freeze
en train.py se congelar谩n poniendo sus gradientes a cero antes de que comience 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}")
v.requires_grad = False
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
# YOLOv5 v6.0 head
head:
- [-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 'model.0.' - 'model.9.' en sus nombres:
Congelar todas las capas
Para congelar el modelo completo excepto las capas de convoluci贸n de salida final en Detect(), configuramos la lista de congelaci贸n para que contenga todos los m贸dulos con 'model.0.' 'model.23.' en sus nombres. - model.23.' en sus nombres:
Resultados
Entrenamos YOLOv5m en VOC en los dos escenarios anteriores, junto con un modelo por defecto (sin congelaci贸n), partiendo del preentrenamiento oficial COCO --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谩pido.
Entornos compatibles
Ultralytics proporciona una serie de entornos listos para usar, cada uno de ellos preinstalado con dependencias esenciales como CUDACUDNN, Pythony PyTorchpara poner en marcha sus proyectos.
- Cuadernos gratuitos GPU:
- Google Nube: Gu铆a de inicio r谩pido de GCP
- Amazon: Gu铆a de inicio r谩pido de AWS
- Azure: Gu铆a de inicio r谩pido de AzureML
- Docker: Gu铆a de inicio r谩pido de Docker
Estado del proyecto
Este distintivo indica que todas las pruebas de integraci贸n continua (IC) deYOLOv5 GitHub Actions se han superado con 茅xito. Estas pruebas de IC comprueban rigurosamente la funcionalidad y el rendimiento de YOLOv5 en varios aspectos clave: formaci贸n, validaci贸n, inferencia, exportaci贸n y puntos de referencia. Garantizan un funcionamiento coherente y fiable en macOS, Windows y Ubuntu, con pruebas realizadas cada 24 horas y en cada nueva confirmaci贸n.