@@ -15,78 +15,107 @@ def __init__(self, dropout_value = 0.01):
15
15
nn .ReLU (),
16
16
nn .BatchNorm2d (32 ),
17
17
nn .Dropout (dropout_value ),
18
+ # Input: 32x32x3 | Output: 32x32x32 | RF: 3x3
18
19
19
20
nn .Conv2d (in_channels = 32 , out_channels = 64 , kernel_size = (3 , 3 ), padding = 1 , bias = False ),
20
21
nn .ReLU (),
21
22
nn .BatchNorm2d (64 ),
22
23
nn .Dropout (dropout_value ),
24
+ # Input: 32x32x32 | Output: 32x32x64 | RF: 5x5
23
25
) # Input: 32x32x3 | Output: 32x32x64 | RF: 5x5
24
26
25
27
# TRANSITION BLOCK 1
26
28
self .transblock1 = nn .Sequential (
27
- #nn.Conv2d(in_channels=64, out_channels=32, kernel_size=(1, 1), stride=2),
28
- nn .Conv2d (in_channels = 64 , out_channels = 32 , kernel_size = (1 , 1 )),
29
+ # Pointwise Convolution to reduce number of channels
30
+ nn .Conv2d (in_channels = 64 , out_channels = 32 , kernel_size = (1 , 1 )), # Input: 32x32x64 | Output: 32x32x32 | RF: 5x5
31
+
32
+ # Depthwise Convolution with stride=2 to reduce the channel size to half
29
33
nn .Conv2d (in_channels = 32 , out_channels = 32 , kernel_size = (3 , 3 ), padding = 1 , stride = 2 , groups = 32 , bias = False )
30
- ) # Input: 32x32x64 | Output: 16x16x32 | RF: 10x10
34
+ # Input: 32x32x32 | Output: 16x16x32 | RF: 7x7
35
+
36
+ ) # Input: 32x32x64 | Output: 16x16x32 | RF: 7x7
31
37
32
38
# CONVOLUTION BLOCK 2
33
39
self .convblock2 = nn .Sequential (
34
40
nn .Conv2d (in_channels = 32 , out_channels = 32 , kernel_size = (3 , 3 ), padding = 1 , bias = False ),
35
41
nn .ReLU (),
36
42
nn .BatchNorm2d (32 ),
37
- nn .Dropout (dropout_value ), # Input: 8x8x32 | Output: 6x6x64 | RF: 34x34
43
+ nn .Dropout (dropout_value ), # Input: 16x16x32 | Output: 16x16x32 | RF: 11x11
38
44
39
45
#Depthwise Seperable Convolution
46
+
47
+ # Depthwise Convolution
40
48
nn .Conv2d (in_channels = 32 , out_channels = 32 , kernel_size = (3 , 3 ), padding = 1 , groups = 32 , bias = False ),
49
+ # Input: 16x16x32 | Output: 16x16x32 | RF: 15x15
50
+
51
+ # Pointwise Convolution
41
52
nn .Conv2d (32 , 64 , kernel_size = 1 , padding = 1 ),
53
+ # Input: 16x16x32 | Output: 18x18x64 | RF: 15x15
54
+
42
55
nn .ReLU (),
43
56
nn .BatchNorm2d (64 ),
44
- nn .Dropout (dropout_value ), # Input: 16x16x32 | Output: 16x16x64 | RF: 14x14
45
- )
57
+ nn .Dropout (dropout_value ),
58
+ ) # Input: 16x16x32 | Output: 18x18x64 | RF: 15x15
46
59
47
60
# TRANSITION BLOCK 2
48
61
self .transblock2 = nn .Sequential (
49
- nn .Conv2d (in_channels = 64 , out_channels = 32 , kernel_size = (1 , 1 )),
62
+ # Pointwise Convolution to reduce number of channels
63
+ nn .Conv2d (in_channels = 64 , out_channels = 32 , kernel_size = (1 , 1 )), # Input: 18x18x64 | Output: 18x18x32 | RF: 15x15
64
+
65
+ # Depthwise Convolution with stride=2 to reduce the channel size to half
50
66
nn .Conv2d (in_channels = 32 , out_channels = 32 , kernel_size = (3 , 3 ), padding = 1 , stride = 2 , groups = 32 , bias = False )
51
- ) # Input: 16x16x32 | Output: 8x8x32 | RF: 17x17
67
+ # Input: 18x18x32 | Output: 9x9x32 | RF: 19x19
68
+ ) # Input: 18x18x64 | Output: 9x9x32 | RF: 19x19
52
69
53
70
# CONVOLUTION BLOCK 3
54
71
self .convblock3 = nn .Sequential (
55
72
nn .Conv2d (in_channels = 32 , out_channels = 64 , kernel_size = (3 , 3 ), padding = 1 , dilation = 2 , bias = False ),
56
73
nn .ReLU (),
57
74
nn .BatchNorm2d (64 ),
58
- nn .Dropout (dropout_value ), # Input: 8x8x32 | Output: 6x6x64 | RF: 34x34
75
+ nn .Dropout (dropout_value ), # Input: 9x9x32 | Output: 7x7x64 | RF: 35x35
59
76
60
77
nn .Conv2d (in_channels = 64 , out_channels = 64 , kernel_size = (3 , 3 ), padding = 1 , bias = False ),
61
78
nn .ReLU (),
62
79
nn .BatchNorm2d (64 ),
63
- nn .Dropout (dropout_value ), # Input: 16x16x64 | Output: 16x16x64 | RF: 36x36
80
+ nn .Dropout (dropout_value ), # Input: 7x7x64 | Output: 7x7x64 | RF: 43x43
64
81
65
82
#Depthwise Seperable Convolution
83
+
84
+ # Depthwise Convolution
66
85
nn .Conv2d (in_channels = 64 , out_channels = 64 , kernel_size = (3 , 3 ), padding = 1 , groups = 64 , bias = False ),
86
+ # Input: 7x7x64 | Output: 7x7x64 | RF: 51x51
87
+
88
+ # Pointwise Convolution
67
89
nn .Conv2d (64 , 32 , kernel_size = 1 , padding = 1 ),
90
+ # Input: 7x7x64 | Output: 9x9x32 | RF: 51x51
91
+
68
92
nn .ReLU (),
69
- nn .BatchNorm2d (32 ),# Input: 16x16x32 | Output: 16x16x64 | RF: 14x14
70
- )
93
+ nn .BatchNorm2d (32 ),
94
+ ) # Input: 9x9x32 | Output: 9x9x32 | RF: 51x51
71
95
72
96
# TRANSITION BLOCK 3
73
97
self .transblock3 = nn .Sequential (
74
- nn .Conv2d (in_channels = 32 , out_channels = 16 , kernel_size = (1 , 1 )),
98
+ # Pointwise Convolution to reduce number of channels
99
+ nn .Conv2d (in_channels = 32 , out_channels = 16 , kernel_size = (1 , 1 )), # Input: 9x9x32 | Output: 9x9x16 | RF: 51x51
100
+
101
+ # Depthwise Convolution with stride=2 to reduce the channel size to half
75
102
nn .Conv2d (in_channels = 16 , out_channels = 16 , kernel_size = (3 , 3 ), padding = 1 , stride = 2 , groups = 16 , bias = False )
76
- )# Input: 16x16x64 | Output: 8x8x32 | RF: 44x44
103
+ # Input: 9x9x16 | Output: 5x5x16 | RF: 59x59
104
+ )# Input: 9x9x32 | Output: 5x5x16 | RF: 59x59
77
105
78
106
# CONVOLUTION BLOCK 4
79
107
self .convblock4 = nn .Sequential (
80
108
nn .Conv2d (in_channels = 16 , out_channels = 10 , kernel_size = (3 , 3 ), padding = 1 , bias = False ),
81
109
nn .ReLU (),
82
110
nn .BatchNorm2d (10 ),
83
- ) # Input: 8x8x32 | Output: 8x8x64 | RF: 46x46
111
+ ) # Input: 5x5x16 | Output: 5x5x10 | RF: 75x75
84
112
85
113
# OUTPUT BLOCK
114
+ # Average Pooling to obtain 10-output channels of size 1x1
86
115
self .opblock = nn .Sequential (
87
- nn .AvgPool2d (kernel_size = 5 ) # Input: 8x8x64 | Output: 1x1x64 | RF: 46x46
88
- #nn.Conv2d(in_channels=32, out_channels=10, kernel_size=(1, 1), padding=0, bias=False),
89
- ) # Input: 1x1x64 | Output: 1x1x10 | RF: 46x46
116
+ nn .AvgPool2d (kernel_size = 5 )
117
+
118
+ ) # Input: 5x5x10 | Output: 1x1x10 | RF: 107x107
90
119
91
120
92
121
def forward (self , x ):
0 commit comments