Published on

Using pretrained networks with Pytorch

Authors

Using Pretrained Networks

List of Models Available in PyTorch
import torchvision
from torchvision import models

# List pre-trained models from PyTorch (Only first ten models)
models.list_models()[:10]

['alexnet', 'convnext_base', 'convnext_large', 'convnext_small', 'convnext_tiny', 'deeplabv3_mobilenet_v3_large', 'deeplabv3_resnet101', 'deeplabv3_resnet50', 'densenet121', 'densenet161']

AlexNet

Arquitecture of AlexNet:

blog-image
#Download AlexNet without weigths
alexnet = models.AlexNet()
#alexnet #See the model arquitecture

Using ResNet 101

Arquitecture:

blog-image
#Download ResNet 101 with their default weights
resnet = models.resnet101(weights=models.ResNet101_Weights.DEFAULT)
#resnet #See the model arquitecture

In this case, we define a preprocess function that will scale the input image to 256 × 256, crop the image to 224 × 224 around the center, transform it into a tensor (a multidimensional PyTorch matrix : in this case, a 3D matrix with color, height and width) and normalize its RGB components (red, green, blue) to have defined means and standard deviations. These must match what was presented to the network during training, if the network is to produce meaningful responses.

#Creating a simple preprocess function to fit the images for the model
from torchvision import transforms
preprocess = transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize(
            mean=[0.485, 0.456, 0.406],
            std=[0.229, 0.224, 0.225]
        )])

We load a test image to test what the model infers based on its training weights.

#Load an image for test the model inference
from PIL import Image
#Path with the image
img = Image.open("/content/perro.jpg")
#Print the image
img
blog-image

We pass the image through pre-processing to adapt it to the network.

#Fit the image to the model
img_t = preprocess(img)
import torch
batch_t = torch.unsqueeze(img_t, 0)

In the field of deep learning, the term used to run a model trained on new data is called inference. To perform inference, we must put the network in 'eval' mode.

If we forget to do that, some sections of the model, such as batch normalization, are discarded.

#resnet.eval()
We make an inference
#Make an inference
out = resnet(batch_t)
#Pronbabilities for each class
#out

We load the classes to know what the model is observing.

with open('/content/imagenet-classes.txt') as f:
    labels = [line.strip() for line in f.readlines()]

We obtain the class with the highest predicted probability and show it in porcetaje linked to the class that corresponds to it

_, index = torch.max(out, 1)

percentage = torch.nn.functional.softmax(out, dim=1)[0] * 100
labels[index.item()], percentage[index.item()].item()

('golden retriever', 84.03208923339844)

The model predicts that it is a golden retriever with 84% probability.

Now we test which are the 5 classes with the highest probabilities:

_, indices = torch.sort(out, descending=True)
[(labels[idx], percentage[idx].item()) for idx in indices[0][:5]]

[('golden retriever', 84.03208923339844), ('tennis ball', 0.5128268599510193), ('kuvasz', 0.40810760855674744), ('Brittany spaniel', 0.3570861220359802), ('Gordon setter', 0.33980631828308105)]

We can observe that in second place the model predicts a tennis ball, this may be due to the training data, where in the images of dogs, tennis balls are observed nearby.

Extra - Difference between AlexNet and ResNet

AlexNet y ResNet son dos arquitecturas clave en el campo de las redes neuronales convolucionales (CNN), cada una de las cuales ha tenido un gran impacto en la clasificación de imágenes. Sin embargo, tienen diferencias importantes tanto en diseño como en rendimiento:

1. AlexNet (2012)
  • Profundidad: AlexNet es una red relativamente superficial en comparación con ResNet, con 8 capas (5 convolucionales y 3 completamente conectadas).
  • Innovación clave: Introdujo el uso de ReLU como función de activación, lo que aceleró significativamente el entrenamiento en comparación con las funciones de activación tradicionales como sigmoide o tangente hiperbólica. Además, popularizó el uso de Dropout para prevenir el sobreajuste.
  • Tamaño de red: Contiene aproximadamente 60 millones de parámetros, lo que en su momento fue bastante grande, pero no tan profundo como redes más modernas.
  • Ventaja: Fue pionera en la utilización de GPU para entrenar redes profundas, lo que permitió mejorar el rendimiento en tareas de visión por computadora.
  • Limitación: Aunque AlexNet mejoró sobre las redes anteriores, la cantidad de capas no fue suficiente para capturar características más complejas en imágenes.
2. ResNet (2015)
  • Profundidad: ResNet (Redes Residuales) introdujo redes mucho más profundas, con versiones de hasta 152 capas (ResNet-152). Esta profundidad es posible gracias a su arquitectura de bloques residuales.
  • Innovación clave: La principal innovación de ResNet es el bloque residual, que permite a la red "saltar" capas al aprender una función de identidad residual. Esto soluciona el problema de la "degradación" en redes muy profundas, donde añadir más capas no mejora necesariamente el rendimiento y, de hecho, puede hacerlo peor.
  • Tamaño de red: ResNet tiene una mayor cantidad de capas y parámetros (dependiendo de la variante, puede tener entre 25 y 60 millones de parámetros), pero sus bloques residuales permiten entrenar redes más profundas sin perder precisión.
  • Ventaja: Gracias a los bloques residuales, ResNet mejoró significativamente en tareas como la clasificación de imágenes en ImageNet, alcanzando un error mucho menor que AlexNet.
  • Escalabilidad: ResNet puede ampliarse fácilmente a redes más profundas, como ResNet-50, ResNet-101 o ResNet-152.
Diferencias principales
CaracterísticaAlexNetResNet
Año20122015
Profundidad8 capas50-152 capas
Innovación claveReLU, Dropout, uso de GPUBloques residuales para entrenar redes profundas
RendimientoMejoró las técnicas de la época, pero con limitaciones de profundidadResolución del problema de la degradación y redes profundas altamente eficientes
Tamaño de red~60 millones de parámetros~25-60 millones de parámetros (variante dependiente)

En resumen, AlexNet fue revolucionaria en su momento, pero ResNet resolvió problemas clave asociados con el entrenamiento de redes más profundas, lo que permitió avances significativos en el rendimiento de las CNN.

Source- ChatGPT