├── effnet.py └── readme.md /effnet.py: -------------------------------------------------------------------------------- 1 | ''' 2 | EffNet: AN EFFICIENT STRUCTURE FOR CONVOLUTIONAL NEURAL NETWORKS 3 | Implementation in Pytorch of Effnet. 4 | https://arxiv.org/abs/1801.06434 5 | 6 | ''' 7 | import torch.nn as nn 8 | 9 | class Flatten(nn.Module): 10 | def forward(self, x): 11 | x = x.view(x.size()[0], -1) 12 | return x 13 | 14 | class EffNet(nn.Module): 15 | 16 | def __init__(self, nb_classes=10, include_top=True, weights=None): 17 | super(EffNet, self).__init__() 18 | 19 | self.block1 = self.make_layers(32, 64) 20 | self.block2 = self.make_layers(64, 128) 21 | self.block3 = self.make_layers(128, 256) 22 | self.flatten = Flatten() 23 | self.linear = nn.Linear(4096, nb_classes) 24 | self.include_top = include_top 25 | self.weights = weights 26 | 27 | def make_layers(self, ch_in, ch_out): 28 | layers = [ 29 | nn.Conv2d(3, ch_in, kernel_size=(1,1), stride=(1,1), bias=False, padding=0, dilation=(1,1)) if ch_in ==32 else nn.Conv2d(ch_in, ch_in, kernel_size=(1,1),stride=(1,1), bias=False, padding=0, dilation=(1,1)) , 30 | self.make_post(ch_in), 31 | # DepthWiseConvolution2D 32 | nn.Conv2d(ch_in, 1 * ch_in, groups=ch_in, kernel_size=(1, 3),stride=(1,1), padding=(0,1), bias=False, dilation=(1,1)), 33 | self.make_post(ch_in), 34 | nn.MaxPool2d(kernel_size=(2,1), stride=(2,1)), 35 | # DepthWiseConvolution2D 36 | nn.Conv2d(ch_in, 1 * ch_in, groups=ch_in, kernel_size=(3, 1), stride=(1,1), padding=(1,0), bias=False, dilation=(1,1)), 37 | self.make_post(ch_in), 38 | nn.Conv2d(ch_in, ch_out, kernel_size=(1, 2), stride=(1, 2), bias=False, padding=(0,0), dilation=(1,1)), 39 | self.make_post(ch_out), 40 | ] 41 | return nn.Sequential(*layers) 42 | 43 | def make_post(self, ch_in): 44 | layers = [ 45 | nn.LeakyReLU(0.3), 46 | nn.BatchNorm2d(ch_in, momentum=0.99) 47 | ] 48 | return nn.Sequential(*layers) 49 | 50 | def forward(self, x): 51 | x = self.block1(x) 52 | x = self.block2(x) 53 | x = self.block3(x) 54 | if self.include_top: 55 | x = self.flatten(x) 56 | x = self.linear(x) 57 | return x -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # EffNet: AN EFFICIENT STRUCTURE FOR CONVOLUTIONAL NEURAL NETWORKS 2 | 3 | Implementation in Pytorch of Effnet. 4 | 5 | https://arxiv.org/abs/1801.06434 --------------------------------------------------------------------------------