Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

CNN regression

CNN regression

GPU is available, using GPU Tesla T4

Dataset: UTK Face

See here: https://susanqq.github.io/UTKFace/

<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=564x676>
<Figure size 960x720 with 4 Axes>
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
<Figure size 960x720 with 4 Axes>
14464 4821 4821

CNN implementation

Model makes prediction which is tensor([[0.]], device='cuda:0', grad_fn=<ReluBackward0>)
CNN has 11155073 trainable parameters
CNN_Regression( (stages): ModuleList( (0): Sequential( (0): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=same) (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (2): ReLU() ) (1): Sequential( (0): ResBlock( (conv1): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Conv2d(32, 64, kernel_size=(1, 1), stride=(1, 1)) ) (1): ResBlock( (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) ) (2): Sequential( (0): ResBlock( (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Conv2d(64, 128, kernel_size=(1, 1), stride=(1, 1)) ) (1): ResBlock( (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) ) (3): Sequential( (0): ResBlock( (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1)) ) (1): ResBlock( (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) ) (4): Sequential( (0): ResBlock( (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1)) ) (1): ResBlock( (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) ) ) (dropout): Dropout(p=0.5, inplace=False) (fc): Linear(in_features=512, out_features=1, bias=True) )

Model training

Loading...
Loading...
Epoch 1 | Train loss 376.672 | Train MAD 14.937 years | Val loss 364.785 | Val MAD 14.750 years 

Let’s run this script in the background while we move onto the next part

<Figure size 750x375 with 2 Axes>

Evaluate on testing dataset

Test dataset has length 4821
Loading...
(4821,) (4821,)
Mean absolute difference: 7.9 yrs
<Figure size 750x750 with 1 Axes>
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
<Figure size 1200x600 with 8 Axes>

Another version

Model makes prediction which is tensor([[0.]], device='cuda:0', grad_fn=<ReluBackward0>)
CNN has 2781793 trainable parameters
CNN_Regression_v2( (stages): ModuleList( (0): Sequential( (0): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=same) (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (2): ReLU() ) (1): Sequential( (0): ResBlock_v2( (conv1): Conv2d(32, 16, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(16, 64, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Conv2d(32, 64, kernel_size=(1, 1), stride=(1, 1)) ) (1): ResBlock_v2( (conv1): Conv2d(64, 32, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(32, 64, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) (2): ResBlock_v2( (conv1): Conv2d(64, 32, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(32, 64, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) ) (2): Sequential( (0): ResBlock_v2( (conv1): Conv2d(64, 32, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(32, 128, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Conv2d(64, 128, kernel_size=(1, 1), stride=(1, 1)) ) (1): ResBlock_v2( (conv1): Conv2d(128, 64, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(64, 128, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) (2): ResBlock_v2( (conv1): Conv2d(128, 64, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(64, 128, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) ) (3): Sequential( (0): ResBlock_v2( (conv1): Conv2d(128, 64, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1)) ) (1): ResBlock_v2( (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) (2): ResBlock_v2( (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) ) (4): Sequential( (0): ResBlock_v2( (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1)) ) (1): ResBlock_v2( (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) (2): ResBlock_v2( (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same) (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv3): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), padding=same) (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (proj): Identity() ) ) ) (dropout): Dropout(p=0.5, inplace=False) (fc): Linear(in_features=512, out_features=1, bias=True) )
<Figure size 750x375 with 2 Axes>

Evaluate on testing dataset

Test dataset has length 4821
Loading...
(4821,) (4821,)
Mean absolute difference: 8.6 yrs
<Figure size 750x750 with 1 Axes>