@@ -10,7 +10,7 @@ Create a Densenet bottleneck layer
10
10
- `outplanes`: number of output feature maps on bottleneck branch
11
11
(and scaling factor for inner feature maps; see ref)
12
12
"""
13
- function dense_bottleneck (inplanes, outplanes)
13
+ function dense_bottleneck (inplanes:: Integer , outplanes:: Integer )
14
14
inner_channels = 4 * outplanes
15
15
return SkipConnection (Chain (conv_norm ((1 , 1 ), inplanes, inner_channels; bias = false ,
16
16
revnorm = true )... ,
@@ -30,7 +30,7 @@ Create a DenseNet transition sequence
30
30
- `inplanes`: number of input feature maps
31
31
- `outplanes`: number of output feature maps
32
32
"""
33
- function transition (inplanes, outplanes)
33
+ function transition (inplanes:: Integer , outplanes:: Integer )
34
34
return Chain (conv_norm ((1 , 1 ), inplanes, outplanes; bias = false , revnorm = true )... ,
35
35
MeanPool ((2 , 2 )))
36
36
end
@@ -48,14 +48,14 @@ the number of output feature maps by `growth_rates` with each block
48
48
- `growth_rates`: the growth (additive) rates of output feature maps
49
49
after each block (a vector of `k`s from the ref)
50
50
"""
51
- function dense_block (inplanes, growth_rates)
51
+ function dense_block (inplanes:: Integer , growth_rates)
52
52
return [dense_bottleneck (i, o)
53
53
for (i, o) in zip (inplanes .+ cumsum ([0 , growth_rates[1 : (end - 1 )]. .. ]),
54
54
growth_rates)]
55
55
end
56
56
57
57
"""
58
- densenet(inplanes, growth_rates; reduction = 0.5, nclasses = 1000)
58
+ densenet(inplanes, growth_rates; reduction = 0.5, nclasses::Integer = 1000)
59
59
60
60
Create a DenseNet model
61
61
([reference](https://arxiv.org/abs/1608.06993)).
@@ -68,9 +68,11 @@ Create a DenseNet model
68
68
- `reduction`: the factor by which the number of feature maps is scaled across each transition
69
69
- `nclasses`: the number of output classes
70
70
"""
71
- function densenet (inplanes, growth_rates; reduction = 0.5 , nclasses = 1000 )
71
+ function densenet (inplanes:: Integer , growth_rates; reduction = 0.5 , inchannels:: Integer = 3 ,
72
+ nclasses:: Integer = 1000 )
72
73
layers = []
73
- append! (layers, conv_norm ((7 , 7 ), 3 , inplanes; stride = 2 , pad = (3 , 3 ), bias = false ))
74
+ append! (layers,
75
+ conv_norm ((7 , 7 ), inchannels, inplanes; stride = 2 , pad = (3 , 3 ), bias = false ))
74
76
push! (layers, MaxPool ((3 , 3 ); stride = 2 , pad = (1 , 1 )))
75
77
outplanes = 0
76
78
for (i, rates) in enumerate (growth_rates)
@@ -88,7 +90,7 @@ function densenet(inplanes, growth_rates; reduction = 0.5, nclasses = 1000)
88
90
end
89
91
90
92
"""
91
- densenet(nblocks; growth_rate = 32, reduction = 0.5, nclasses = 1000)
93
+ densenet(nblocks; growth_rate = 32, reduction = 0.5, nclasses::Integer = 1000)
92
94
93
95
Create a DenseNet model
94
96
([reference](https://arxiv.org/abs/1608.06993)).
@@ -100,15 +102,15 @@ Create a DenseNet model
100
102
- `reduction`: the factor by which the number of feature maps is scaled across each transition
101
103
- `nclasses`: the number of output classes
102
104
"""
103
- function densenet (nblocks:: NTuple{N, <:Integer} ; growth_rate = 32 , reduction = 0.5 ,
104
- nclasses = 1000 ) where {N}
105
+ function densenet (nblocks:: Vector{ <:Integer} ; growth_rate:: Integer = 32 , reduction = 0.5 ,
106
+ inchannels :: Integer = 3 , nclasses:: Integer = 1000 )
105
107
return densenet (2 * growth_rate, [fill (growth_rate, n) for n in nblocks];
106
- reduction = reduction, nclasses = nclasses)
108
+ reduction, inchannels, nclasses)
107
109
end
108
110
109
111
"""
110
- DenseNet(nblocks::NTuple{N, <:Integer};
111
- growth_rate = 32, reduction = 0.5, nclasses = 1000)
112
+ DenseNet(nblocks::Vector{ <:Integer}; growth_rate::Integer = 32, reduction = 0.5,
113
+ inchannels = 3, nclasses::Integer = 1000)
112
114
113
115
Create a DenseNet model
114
116
([reference](https://arxiv.org/abs/1608.06993)).
@@ -124,29 +126,26 @@ See also [`densenet`](#).
124
126
struct DenseNet
125
127
layers:: Any
126
128
end
129
+ @functor DenseNet
127
130
128
- function DenseNet (nblocks:: NTuple{N, <:Integer} ;
129
- growth_rate = 32 , reduction = 0.5 , nclasses = 1000 ) where {N}
130
- layers = densenet (nblocks; growth_rate = growth_rate,
131
- reduction = reduction,
132
- nclasses = nclasses)
131
+ function DenseNet (nblocks:: Vector{<:Integer} ; growth_rate:: Integer = 32 , reduction = 0.5 ,
132
+ inchannels = 3 , nclasses:: Integer = 1000 )
133
+ layers = densenet (nblocks; growth_rate, reduction, inchannels, nclasses)
133
134
return DenseNet (layers)
134
135
end
135
136
136
- @functor DenseNet
137
-
138
137
(m:: DenseNet )(x) = m. layers (x)
139
138
140
139
backbone (m:: DenseNet ) = m. layers[1 ]
141
140
classifier (m:: DenseNet ) = m. layers[2 ]
142
141
143
- const DENSENET_CONFIGS = Dict (121 => ( 6 , 12 , 24 , 16 ) ,
144
- 161 => ( 6 , 12 , 36 , 24 ) ,
145
- 169 => ( 6 , 12 , 32 , 32 ) ,
146
- 201 => ( 6 , 12 , 48 , 32 ) )
142
+ const DENSENET_CONFIGS = Dict (121 => [ 6 , 12 , 24 , 16 ] ,
143
+ 161 => [ 6 , 12 , 36 , 24 ] ,
144
+ 169 => [ 6 , 12 , 32 , 32 ] ,
145
+ 201 => [ 6 , 12 , 48 , 32 ] )
147
146
148
147
"""
149
- DenseNet(config::Integer = 121; pretrain = false, nclasses = 1000)
148
+ DenseNet(config::Integer = 121; pretrain::Bool = false, nclasses::Integer = 1000)
150
149
DenseNet(transition_configs::NTuple{N,Integer})
151
150
152
151
Create a DenseNet model with specified configuration. Currently supported values are (121, 161, 169, 201)
@@ -159,7 +158,7 @@ Set `pretrain = true` to load the model with pre-trained weights for ImageNet.
159
158
160
159
See also [`Metalhead.densenet`](#).
161
160
"""
162
- function DenseNet (config:: Integer = 121 ; pretrain = false , nclasses = 1000 )
161
+ function DenseNet (config:: Integer = 121 ; pretrain:: Bool = false , nclasses:: Integer = 1000 )
163
162
_checkconfig (config, keys (DENSENET_CONFIGS))
164
163
model = DenseNet (DENSENET_CONFIGS[config]; nclasses = nclasses)
165
164
if pretrain
0 commit comments