JacobLinCool's picture
Upload folder using huggingface_hub
707cbac unverified
import torch
import torch.nn as nn
from huggingface_hub import PyTorchModelHubMixin
class ODCNN(nn.Module, PyTorchModelHubMixin):
def __init__(self, dropout_rate=0.5):
super().__init__()
# Input 3 channels, 80 bands
# Conv 1: 7x3 filters -> 10 maps
self.conv1 = nn.Conv2d(3, 10, kernel_size=(3, 7))
self.relu1 = nn.ReLU() # ReLU improvement
self.pool1 = nn.MaxPool2d(kernel_size=(3, 1), stride=(3, 1))
# Conv 2: 3x3 filters -> 20 maps
self.conv2 = nn.Conv2d(10, 20, kernel_size=(3, 3))
self.relu2 = nn.ReLU()
self.pool2 = nn.MaxPool2d(kernel_size=(3, 1), stride=(3, 1))
# Flatten size calculation based on architecture
# (20 feature maps * 8 freq bands * 7 time frames)
self.flatten_size = 20 * 8 * 7
# Dropout on FC inputs
self.dropout = nn.Dropout(p=dropout_rate)
# 256 Hidden Units
self.fc1 = nn.Linear(self.flatten_size, 256)
self.relu_fc = nn.ReLU()
# Output Unit
self.fc2 = nn.Linear(256, 1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
x = self.conv1(x)
x = self.relu1(x)
x = self.pool1(x)
x = self.conv2(x)
x = self.relu2(x)
x = self.pool2(x)
x = x.view(x.size(0), -1)
x = self.dropout(x)
x = self.fc1(x)
x = self.relu_fc(x)
x = self.dropout(x)
x = self.fc2(x)
x = self.sigmoid(x)
return x
if __name__ == "__main__":
from torchinfo import summary
model = ODCNN()
summary(model, (1, 3, 80, 15))