¿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, 5 meses, 4 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 bloquesconv1
ylayer1
. 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 establecepretrained_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 enFalse
.
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 enTrue
, 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 enFalse
, 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 enTrue
, 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 dejarpretrained_backbone
ytrainable_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