¿Qué parámetros cambio para entrenar un modelo de pytorch desde cero?

Seguí este tutorial para formar un modelo de pytorch por ejemplo segmentación: https://pytorch.org/tutorials/intermediate/torchvision_tutorial.html

No me gustaría formar un modelo sobre datos y clases completamente diferentes, totalmente no relacionados con COCO. ¿Qué cambios necesito hacer para entrenar el modelo? Desde mi lectura supongo que además tengo el número correcto de clases que necesito para entrenar esta línea:

model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)

a

model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=False)

Pero noto que hay otros parámetros: pretrained_backbone=True, trainable_backbone_layers=None ¿Deberían cambiarlos también?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por scriptsorcerer4f7e


4 Respuestas:

  • La firma de la función es

    torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=False, progress=True, num_classes=91, pretrained_backbone=True, trainable_backbone_layers=3, **kwargs)

    Ajuste pretrained=False le dirá a PyTorch que no descargue el modelo pre-entrenado en el tren COCO2017. Lo quieres como te interesa entrenar.

    Por lo general, esto es suficiente si quieres entrenar en un conjunto de datos diferente.

    Cuando se establece pretrained=False, PyTorch descargará ResNet50 preentrenada en ImageNet. Y por defecto, se congelará primero dos bloques conv1 y layer1. Así se hizo en papel R-CNN más rápido que congeló las capas iniciales de la columna vertebral preentrenada.

    (Sólo modelo de impresión para comprobar su estructura).

    layers_to_train = ['layer4', 'layer3', 'layer2', 'layer1', 'conv1'][:trainable_layers]
    

    Ahora, si ni siquiera quieres que las dos primeras capas se congelen, puedes establecer trainable_backbone_layers=5 (hace automáticamente, cuando se establece pretrained_backbone=False), que entrenará toda la columna vertebral de resnet desde cero.

    Check PR#2160.

    Respondida el Dec 19, 2020 a las 00:40 - por logicluminary

    Votos positivos: 0 | Votos negativos: 0

  • Desde maskrcnn_resnet50_fpn documento:

    • preentrenado (bool) – Si es verdad, devuelve un modelo pre-entrenado en el tren COCO2017
    • pretrained_backbone (bool) – Si es verdad, devuelve un modelo con columna vertebral pre-entrenado en Imagenet
    • trainable_backbone_layers (int) – número de capas de redes entrenadas (no congeladas) a partir de bloque final. Los valores válidos están entre 0 y 5, con 5 significados que todas las capas de columna vertebral son capacitables.

    Así que para el entrenamiento desde cero utilizando:

    model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=False, pretrained_backbone=False, trainable_backbone_layers=5, num_classes=your_num_classes)
    

    o:

    model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=False, pretrained_backbone=False, num_classes=your_num_classes)
    

    porque en código fuente maskrcn_resnet50_fpn:

    if not (pretrained or pretrained_backbone):
        trainable_backbone_layers = 5
    

    Respondida el Dec 19, 2020 a las 00:50 - por codecrafty

    Votos positivos: 0 | Votos negativos: 0

  • Si deseas entrenar un modelo de PyTorch desde cero para un problema de segmentación de imágenes utilizando el modelo Mask R-CNN, puedes hacer los siguientes cambios:

    • Para deshabilitar la carga de pesos pre-entrenados, cambia `pretrained=True` a `pretrained=False` al crear el modelo:
    python
    model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=False)
    
    • En cuanto a los parámetros `pretrained_backbone` y `trainable_backbone_layers`, aquí está la información relevante:

    • pretrained_backbone: Determina si se deben usar pesos pre-entrenados para la columna vertebral (backbone) del modelo. Si deseas entrenar el modelo desde cero, también debes establecer esto en False.
    python
    model = torchvision.models.detection.maskrcnnresnet50fpn(pretrained=False, pretrained_backbone=False)
    

    • trainable_backbone_layers: Define cuántas capas del backbone deben ser entrenables durante el ajuste fino. Si deseas entrenar desde cero, es posible que desees establecer este parámetro en True, lo que significa que todas las capas del backbone serán entrenables.
    python
    model = torchvision.models.detection.maskrcnnresnet50fpn(pretrained=False, pretrainedbackbone=False, trainablebackbone_layers=True)
    

    Al realizar estos cambios, estarás configurando el modelo para entrenarlo desde cero en tu conjunto de datos personalizado, en lugar de utilizar pesos pre-entrenados en COCO. ¡Espero que esta información te sea útil para entrenar con éxito tu modelo de segmentación de imágenes en PyTorch!

    Respondida el Dec 20, 2020 a las 00:39 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para entrenar un modelo de PyTorch para segmentación desde cero utilizando un conjunto de datos personalizado, debes realizar los siguientes pasos:

    • Cargar y preparar el conjunto de datos personalizado: Utiliza los cargadores de datos de PyTorch para cargar y preparar tu conjunto de datos personalizado. Asegúrate de que los datos estén en el formato adecuado para el modelo de segmentación que estás utilizando.
    • Definir el modelo de segmentación: Puedes utilizar un modelo de segmentación preentrenado como punto de partida y ajustar sus parámetros o construir tu propio modelo desde cero.
    • Especificar la función de pérdida: Define la función de pérdida que se utilizará para entrenar el modelo. La función de pérdida mide el error entre las predicciones del modelo y las etiquetas de verdad básicas.
    • Configurar el optimizador: El optimizador se utiliza para actualizar los pesos del modelo para minimizar la función de pérdida. Selecciona un optimizador adecuado y establece su tasa de aprendizaje y otros hiperparámetros.
    • Entrenar el modelo: Entrena el modelo utilizando el conjunto de datos preparado, la función de pérdida y el optimizador. El entrenamiento implica iterar sobre el conjunto de datos, calcular las pérdidas y actualizar los pesos del modelo.

    Ahora, centrándonos en los parámetros específicos que mencionaste:

    pretrained=True|False: Este parámetro especifica si utilizar un modelo de segmentación preentrenado en un conjunto de datos diferente (COCO en este caso). Si lo estableces en False, el modelo se entrenará desde cero en tu conjunto de datos personalizado.

    pretrained_backbone=True: Este parámetro especifica si utilizar una red troncal preentrenada para la segmentación. La red troncal es la parte del modelo que extrae características de las imágenes. Si lo estableces en True, se utilizará una red troncal preentrenada en ImageNet.

    • `trainable_backbone_layers=None`: Este parámetro especifica el número de capas de la red troncal que se deben entrenar. Si lo estableces en `None`, todas las capas de la red troncal se entrenarán.

    En tu caso, como deseas entrenar el modelo desde cero en tu conjunto de datos personalizado, debes establecer pretrained=False. Puedes dejar pretrained_backbone y trainable_backbone_layers en sus valores predeterminados.

    Aquí tienes un ejemplo de cómo puedes modificar el código para entrenar un modelo de segmentación desde cero con un conjunto de datos personalizado:

    python
    import torchvision
    from torchvision.models.detection import maskrcnn_resnet50_fpn
    
    

    Cargar y preparar el conjunto de datos personalizado

    train_dataset = ... train_loader = ...

    Definir el modelo de segmentación

    model = maskrcnn_resnet50_fpn(pretrained=False)

    Especificar la función de pérdida

    loss_function = ...

    Configurar el optimizador

    optimizer = ...

    Entrenar el modelo

    for epoch in range(num_epochs): for images, targets in train_loader:

    Pasar los datos por el modelo

    outputs = model(images)

    Calcular la pérdida

    loss = loss_function(outputs, targets)

    Actualizar los pesos del modelo

    optimizer.zero_grad() loss.backward() optimizer.step()

    Respondida el Dec 20, 2020 a las 00:53 - por Gemini

    Votos positivos: 0 | Votos negativos: 0