Saltar para o conteúdo

Aprendizagem por transferência com camadas congeladas

Este guia explica como congelar YOLOv5 🚀 camadas quando aprendizagem por transferência. A aprendizagem por transferência é uma forma útil de treinar rapidamente um modelo em novos dados sem ter de treinar novamente toda a rede. Em vez disso, parte dos pesos iniciais são congelados no lugar, e o resto dos pesos são usados para calcular a perda e são actualizados pelo optimizador. Isso requer menos recursos do que o treinamento normal e permite tempos de treinamento mais rápidos, embora também possa resultar em reduções na precisão final treinada.

Antes de começar

Clonar repo e instalar requirements.txt em um Python>=3.8.0 incluindo PyTorch>=1.8. Os modelos e conjuntos de dados são descarregados automaticamente a partir daversão mais recentede YOLOv5 .

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

Congelar a espinha dorsal

Todas as camadas que correspondem ao train.py freeze em train.py serão congeladas, definindo os seus gradientes para zero antes do início do treino.

# 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 uma lista de nomes 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
"""

Observando a arquitetura do modelo, podemos ver que a espinha dorsal do modelo é constituída pelas camadas 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)

para que possamos definir a lista de congelamento para conter todos os módulos com 'model.0.' - 'model.9.' nos seus nomes:

python train.py --freeze 10

Congelar todas as camadas

Para congelar o modelo completo, exceto as camadas de convolução de saída final em Detect(), definimos a lista de congelamento para conter todos os módulos com 'model.0.' - 'model.23.' nos seus nomes:

python train.py --freeze 24

Resultados

Treinamos o YOLOv5m no COV em ambos os cenários acima referidos, juntamente com um modelo predefinido (sem congelamento), a partir do modelo oficial COCO pré-treinado --weights yolov5m.pt:

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

Comparação da precisão

Os resultados mostram que o congelamento acelera o treino, mas reduz ligeiramente a precisão final.

Resultados do treino de congelação mAP50

Resultados do treino de congelação mAP50-95

Resultados do quadro

GPU Comparação de utilização

Curiosamente, quanto mais módulos são congelados, menos memória GPU é necessária para treinar e menor é a utilização GPU . Isto indica que os modelos maiores ou os modelos treinados com imagens maiores podem beneficiar do congelamento para serem treinados mais rapidamente.

Treino GPU percentagem de memória atribuída

Formação GPU percentagem de utilização da memória

Ambientes suportados

Ultralytics fornece uma gama de ambientes prontos a utilizar, cada um pré-instalado com dependências essenciais, tais como CUDA, CUDNN, Python, e PyTorchpara dar início aos seus projectos.

Estado do projeto

YOLOv5 IC

Este emblema indica que todos os testes de Integração Contínua (CI) do YOLOv5 GitHub Actions foram aprovados com êxito. Esses testes de CI verificam rigorosamente a funcionalidade e o desempenho do YOLOv5 em vários aspectos principais: treinamento, validação, inferência, exportação e benchmarks. Eles garantem uma operação consistente e confiável no macOS, Windows e Ubuntu, com testes realizados a cada 24 horas e a cada novo commit.

📅C riado há 1 ano ✏️ Atualizado há 1 mês

Comentários