WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

PyTorch · Expert · question 71 of 100

How can you use PyTorch to implement and train deep learning models for video data, such as 3D CNNs or recurrent models with convolutional features?

📕 Buy this interview preparation book: 100 PyTorch questions & answers — PDF + EPUB for $5

PyTorch is a powerful tool for developing and training deep learning models for video data. In this answer, I will explain how you can use PyTorch to implement and train two popular types of deep learning models for video data: 3D CNNs and recurrent models with convolutional features.

First, let us start with 3D CNNs. These models are commonly used for tasks such as action recognition or video classification. Like regular 2D CNNs, 3D CNNs use convolutional layers to learn spatial features from the input data. However, in addition to spatial information, 3D CNNs also take into account the temporal dimension of the video data. PyTorch provides handy classes in torchvision.models.video module to easily build and fine-tune 3D CNNs.

To implement a 3D CNN in PyTorch, you can use the ‘torch.nn.Conv3d‘ class. This class behaves similarly to the ‘torch.nn.Conv2d‘ class for 2D convolutional layers, but with an additional time dimension.

Here is an example implementation of a simple 3D CNN for video classification in PyTorch:

import torch
import torch.nn as nn

class Classifier(nn.Module):
    def __init__(self, num_classes):
        super(Classifier, self).__init__()
        
        # Convolutional layers
        self.conv1 = nn.Conv3d(3, 16, kernel_size=(3, 3, 3), padding=(1, 1, 1))
        self.bn1 = nn.BatchNorm3d(16)
        self.relu1 = nn.ReLU(inplace=True)
        
        self.conv2 = nn.Conv3d(16, 32, kernel_size=(3, 3, 3), padding=(1, 1, 1))
        self.bn2 = nn.BatchNorm3d(32)
        self.relu2 = nn.ReLU(inplace=True)
        
        self.conv3 = nn.Conv3d(32, 64, kernel_size=(3, 3, 3), padding=(1, 1, 1))
        self.bn3 = nn.BatchNorm3d(64)
        self.relu3 = nn.ReLU(inplace=True)
        
        # Max pooling and fully-connected layers
        self.pool = nn.MaxPool3d(kernel_size=(2, 2, 2), stride=(2, 2, 2))
        self.fc1 = nn.Linear(64 * 4 * 4 * 4, 512)
        self.fc2 = nn.Linear(512, num_classes)
        
    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu1(x)
        
        x = self.conv2(x)
        x = self.bn2(x)
        x = self.relu2(x)
        
        x = self.conv3(x)
        x = self.bn3(x)
        x = self.relu3(x)
        
        x = self.pool(x)
        x = x.view(-1, 64 * 4 * 4 * 4)
        x = self.fc1(x)
        x = self.fc2(x)
        
        return x

In this example, we define a ‘Classifier‘ model that has three 3D convolutional layers followed by max pooling and two fully-connected layers. Note that we use batch normalization and ReLU activation after each convolutional layer. Also, we use a 3D max pooling layer with a kernel size of 2 and stride of 2.

To train this model, you can use the standard PyTorch training loop with a suitable loss function and optimizer. For example, you can use the cross-entropy loss and stochastic gradient descent optimizer:

model = Classifier(num_classes=5)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

for epoch in range(num_epochs):
    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()

        # print statistics
        if i % 100 == 99:    # print every 100 mini-batches
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

Now let’s move on to recurrent models with convolutional features. These models are commonly used for tasks such as action detection or motion segmentation. In these models, the input video data is first passed through convolutional layers to extract spatial features, and then through recurrent layers to capture temporal dependencies.

To implement a recurrent model with convolutional features in PyTorch, you can use the ‘torch.nn.Conv2d‘ and ‘torch.nn.LSTM‘ classes. The ‘Conv2d‘ class is used for the convolutional layers, and the ‘LSTM‘ class is used for the recurrent layers.

Here is an example implementation of a simple recurrent model with convolutional features in PyTorch:

import torch
import torch.nn as nn

class ConvLSTM2d(nn.Module):
    def __init__(self, input_channels, hidden_channels, kernel_size, bias=True):
        super(ConvLSTM2d, self).__init__()

        self.input_channels = input_channels
        self.hidden_channels = hidden_channels
        self.kernel_size = kernel_size
        self.bias = bias
        self.padding = kernel_size // 2

        self.conv = nn.Conv2d(in_channels=self.input_channels + self.hidden_channels,
                              out_channels=4 * self.hidden_channels,
                              kernel_size=self.kernel_size,
                              padding=self.padding,
                              bias=self.bias)

    def forward(self, input_tensor, cur_state):
        h_cur, c_cur = cur_state

        combined = torch.cat([input_tensor, h_cur], dim=1)
        combined_conv = self.conv(combined)
        cc_i, cc_f, cc_o, cc_g = torch.split(combined_conv,
                                              self.hidden_channels,
                                              dim=1)

        i = torch.sigmoid(cc_i)
        f = torch.sigmoid(cc_f)
        o = torch.sigmoid(cc_o)
        g = torch.tanh(cc_g)

        c_next = f * c_cur + i * g
        h_next = o * torch.tanh(c_next)

        return h_next, c_next


class Classifier(nn.Module):
    def __init__(self, num_classes):
        super(Classifier, self).__init__()

        # Convolutional layers
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)
        self.bn1 = nn.BatchNorm2d(16)
        self.relu1 = nn.ReLU(inplace=True)

        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)
        self.bn2 = nn.BatchNorm2d(32)
        self.relu2 = nn.ReLU(inplace=True)

        # Recurrent layers
        self.lstm1 = ConvLSTM2d(input_channels=32,
                                hidden_channels=64,
                                kernel_size=3,
                                bias=True)

        # Max pooling and fully-connected layers
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(64 * 8 * 8, 512)
        self.fc2 = nn.Linear(512, num_classes)

    def forward(self, x):
        n, t, c, h, w = x.size()
        x = x.view(n * t, c, h, w)

        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu1(x)

        x = self.conv2(x)
        x = self.bn2(x)
        x = self.relu2(x)

        x = x.view(n, t, 32, h // 2, w // 2)
        h, c = self.lstm1(x[:, 0, :, :, :], (torch.zeros(1, n, 64, h // 2, w // 2).cuda(),
                                               torch.zeros(1, n, 64, h // 2, w // 2).cuda()))

        for i in range(1, t):
            h, c = self.lstm1(x[:, i, :, :, :], (h, c))

        x = self.pool(h)
        x = x.view(-1, 64 * 8 * 8)
        x = self.fc1(x)
        x = self.fc2(x)

        return x

In this example, we define a ‘Classifier‘ model that has two convolutional layers followed by a single ConvLSTM2d layer and two fully-connected layers. Note that we use batch normalization and ReLU activation after each convolutional layer. Also, we use a 2D max pooling layer with a kernel size of 2 and stride of 2.

To train this model, you can use the same PyTorch training loop with a suitable loss function and optimizer as shown earlier.

To summarize, PyTorch provides a handy interface and building blocks for developing and training deep learning models for video data, be it through 3D CNNs or recurrent models with convolutional features. By using these models, you can extract features and learn temporal relationships in video data, and ultimately use the predictions to drive real-world decisions.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic PyTorch interview — then scores it.
📞 Practice PyTorch — free 15 min
📕 Buy this interview preparation book: 100 PyTorch questions & answers — PDF + EPUB for $5

All 100 PyTorch questions · All topics