Source code for fastbnns.models.cnn
"""Simple CNN PyTorch models."""
from typing import Union
import torch
[docs]
class CNN(torch.nn.Module):
"""Basic multi-layer CNN."""
def __init__(
self,
in_channels: int,
out_channels: int,
hidden_features: int = 8,
n_hidden_layers: int = 3,
kernel_size: int = 3,
stride: int = 1,
padding: Union[int, str] = "same",
activation: type = torch.nn.LeakyReLU,
):
super().__init__()
modules = [
torch.nn.Conv2d(
in_channels=in_channels,
out_channels=hidden_features,
kernel_size=kernel_size,
stride=stride,
padding=padding,
),
]
if activation is not None:
modules.append(activation())
for _ in range(n_hidden_layers):
modules.append(
torch.nn.Conv2d(
in_channels=hidden_features,
out_channels=hidden_features,
kernel_size=kernel_size,
stride=stride,
padding=padding,
)
)
if activation is not None:
modules.append(activation())
modules.append(
torch.nn.Conv2d(
in_channels=hidden_features,
out_channels=out_channels,
kernel_size=kernel_size,
stride=stride,
padding=padding,
)
)
self.module_list = torch.nn.ModuleList(modules)
[docs]
def forward(self, x: torch.Tensor) -> torch.Tensor:
for layer in self.module_list:
x = layer(x)
return x
if __name__ == "__main__":
# Basic CNN usage example.
in_channels = 1
out_channels = 1
network = CNN(in_channels=in_channels, out_channels=out_channels)
batch_size = 8
out = network(torch.ones((batch_size, in_channels, 128, 128)))