|
import torch.nn as nn |
|
import torch.nn.functional as F |
|
|
|
|
|
class CNN(nn.Module): |
|
""" |
|
Convolutional Neural Network (CNN) for classifying 'normal' and 'red' eye images. |
|
|
|
The network consists of four convolutional layers followed by two fully connected layers. |
|
Each convolutional layer is followed by batch normalization and a LeakyReLU activation function. |
|
A dropout layer is added before the final fully connected layer to prevent overfitting. |
|
|
|
Attributes: |
|
conv1 (nn.Sequential): First convolutional layer block. |
|
conv2 (nn.Sequential): Second convolutional layer block. |
|
conv3 (nn.Sequential): Third convolutional layer block. |
|
conv4 (nn.Sequential): Fourth convolutional layer block. |
|
fc1 (nn.Linear): First fully connected layer. |
|
fc2 (nn.Linear): Second fully connected layer (output layer). |
|
dropout (nn.Dropout): Dropout layer with a probability of 0.5. |
|
""" |
|
def __init__(self): |
|
super(CNN, self).__init__() |
|
self.conv1 = nn.Sequential( |
|
nn.Conv2d(3, 8, 4, stride=2, padding=1), |
|
nn.BatchNorm2d(8), |
|
nn.LeakyReLU(0.2, inplace=True) |
|
) |
|
self.conv2 = nn.Sequential( |
|
nn.Conv2d(8, 16, 4, stride=2, padding=1), |
|
nn.BatchNorm2d(16), |
|
nn.LeakyReLU(0.2, inplace=True) |
|
) |
|
self.conv3 = nn.Sequential( |
|
nn.Conv2d(16, 32, 4, stride=2, padding=1), |
|
nn.BatchNorm2d(32), |
|
nn.LeakyReLU(0.2, inplace=True) |
|
) |
|
self.conv4 = nn.Sequential( |
|
nn.Conv2d(32, 64, 4, stride=2, padding=1), |
|
nn.BatchNorm2d(64), |
|
nn.LeakyReLU(0.2, inplace=True) |
|
) |
|
self.fc1 = nn.Linear(64 * 2 * 2, 32) |
|
self.fc2 = nn.Linear(32, 2) |
|
self.dropout = nn.Dropout(0.5) |
|
|
|
def forward(self, x): |
|
""" |
|
Defines the forward pass of the CNN. |
|
|
|
Args: |
|
x (torch.Tensor): Input tensor of shape (batch_size, 3, 32, 32). |
|
|
|
Returns: |
|
torch.Tensor: Output tensor of shape (batch_size, 2). |
|
""" |
|
|
|
x = self.conv1(x) |
|
|
|
x = self.conv2(x) |
|
|
|
x = self.conv3(x) |
|
|
|
x = self.conv4(x) |
|
|
|
|
|
x = x.view(x.size(0), -1) |
|
|
|
x = F.leaky_relu(self.fc1(x)) |
|
x = self.dropout(x) |
|
x = self.fc2(x) |
|
|
|
return F.log_softmax(x, dim=1) |
|
|
|
|