from torch import nn, rand from torch.autograd import Variable class CNN(nn.Sequential): def __init__( self, filters: list[int], kernels: list[int], max_sequence_length: int, in_channels: int, out_channels: int ): super().__init__() num_layer = len(filters) channels = [in_channels] + filters self.conv = nn.ModuleList([nn.Conv1d(in_channels=channels[i], out_channels=channels[i+1], kernel_size=kernels[i]) for i in range(num_layer)]) n_size = self._get_conv_output((in_channels, max_sequence_length)) self.fc1 = nn.Linear(n_size, out_channels) def _forward_features(self, x): for layer in self.conv: x = nn.functional.relu(layer(x)) x = nn.functional.adaptive_max_pool1d(x, output_size=1) return x def _get_conv_output(self, shape): bs = 1 input_feat = Variable(rand(bs, *shape)) output_feat = self._forward_features(input_feat) n_size = output_feat.data.view(bs, -1).size(1) return n_size def forward(self, v): v = self._forward_features(v.float()) v = v.view(v.size(0), -1) v = self.fc1(v) return v