ResNet
The most commonly used architecture for classification problems
ResNet is the most popular architecture for classifiers with over 20,000 citations. The authors were able to build a very deep, powerful network without running into the problem of vanishing gradients.
It is also often used as a backbone network for detection and segmentation models.
ResNet is often noted together with a number (e.g., ResNet18, ResNet50, ...). The number depicts the depth of the network, meaning how many layers it contains.

# Intuition

One would assume that stacking additional layers to a deep neural network would improve its performance because it could learn more features.
However, the original ResNet paper authors showed that this is not the case, but that just adding more layers to a network will actually lead to a performance decrease at a certain amount of layers because they simply pass over the same features again and again.
Classification error with Cifar-10 data. Graphic taken from the orignal paper.

## Residual Blocks

As a solution, the authors proposed residual blocks, an “identity shortcut connection” that skips one or more layers, as shown in the following figure:
Graphic from the original paper
Due to this skip connection, the output of the layer is not the same now. Without using this skip connection, the input ‘x’ gets multiplied by the layer's weights, followed by adding a bias term. Next, this term goes through the activation function f(), and we get our output as H(x).
$H(x)=f(wx + b)$
Now with the introduction of the skip connection, the output is changed to
$H(x)=f(wx + b)+x$
The skip connections in ResNet solve the problem of vanishing gradient in deep neural networks by allowing this alternate shortcut path for the gradient to flow through.
Graphic from the original paper
Using ResNet has significantly enhanced the performance of neural networks with more layers, as shown above.

# Parameters

## Depth of the resnet model

It is the number of layers in the ResNet model. In model playground, it can be chosen from:

## Weights

It's the weights to use for model initialization, and in Model Playground ResNet18 ImageNet weights are used.

# Code implementation

PyTorch
1
# Deep residual networks pre-trained on ImageNet
2
3
import torch
4
5
6
# or any of these variants
7
# model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet34', pretrained=True)
8
# model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet50', pretrained=True)
9
# model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet101', pretrained=True)
10
# model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet152', pretrained=True)
11
model.eval()
12
13
# Sample Execution
14
15
import urllib
16
url, filename = ("https://github.com/pytorch/hub/raw/master/images/dog.jpg", "dog.jpg")
17
try: urllib.URLopener().retrieve(url, filename)
18
except: urllib.request.urlretrieve(url, filename)
19
20
rom PIL import Image
21
from torchvision import transforms
22
input_image = Image.open(filename)
23
preprocess = transforms.Compose([
24
transforms.Resize(256),
25
transforms.CenterCrop(224),
26
transforms.ToTensor(),
27
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
28
])
29
input_tensor = preprocess(input_image)
30
input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model
31
32
# move the input and model to GPU for speed if available
33
if torch.cuda.is_available():
34
input_batch = input_batch.to('cuda')
35
model.to('cuda')
36
37
38
output = model(input_batch)
39
# Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
40
print(output[0])
41
# The output has unnormalized scores. To get probabilities, you can run a softmax on it.
42
probabilities = torch.nn.functional.softmax(output[0], dim=0)
43
print(probabilities)
44
45
46
!wget https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt
47
48
49
with open("imagenet_classes.txt", "r") as f:
50
categories = [s.strip() for s in f.readlines()]
51
# Show top categories per image
52
top5_prob, top5_catid = torch.topk(probabilities, 5)
53
for i in range(top5_prob.size(0)):
54
print(categories[top5_catid[i]], top5_prob[i].item())
55
56
#Model structure Top-1 error Top-5 error
57
#resnet18 30.24 10.92
58
#resnet34 26.70 8.58
59
#resnet50 23.85 7.13
60
#resnet101 22.63 6.44
61
#resnet152 21.69 5.94
Copied!