Skip to content

Commit 522dd59

Browse files
committed
Add the code of InceptionV4
1 parent f8f3756 commit 522dd59

File tree

5 files changed

+413
-0
lines changed

5 files changed

+413
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,5 @@ Run **evaluate.py** to evaluate the model's performance on the test dataset.
9494
4. EfficientNet: [EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks](https://arxiv.org/abs/1905.11946)
9595
5. The official code of EfficientNet: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet
9696
6. ResNeXt: [Aggregated Residual Transformations for Deep Neural Networks](https://arxiv.org/abs/1611.05431)
97+
7. Inception_V4/Inception_ResNet_V1/Inception_ResNet_V2: [Inception-v4, Inception-ResNet and the Impact of Residual Connectionson Learning](https://arxiv.org/abs/1602.07261)
98+
8. The official implementation of Inception_V4: https://github.com/tensorflow/models/blob/master/research/slim/nets/inception_v4.py

models/inception_modules.py

Lines changed: 356 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,356 @@
1+
import tensorflow as tf
2+
3+
4+
class BasicConv2D(tf.keras.layers.Layer):
5+
def __init__(self, filters, kernel_size, strides, padding):
6+
super(BasicConv2D, self).__init__()
7+
self.conv = tf.keras.layers.Conv2D(filters=filters,
8+
kernel_size=kernel_size,
9+
strides=strides,
10+
padding=padding)
11+
self.bn = tf.keras.layers.BatchNormalization()
12+
13+
def call(self, inputs, training=None, **kwargs):
14+
x = self.conv(inputs)
15+
x = self.bn(x, training=training)
16+
x = tf.nn.relu(x)
17+
18+
return x
19+
20+
21+
class Stem(tf.keras.layers.Layer):
22+
def __init__(self):
23+
super(Stem, self).__init__()
24+
self.conv1 = BasicConv2D(filters=32,
25+
kernel_size=(3, 3),
26+
strides=2,
27+
padding="valid")
28+
self.conv2 = BasicConv2D(filters=32,
29+
kernel_size=(3, 3),
30+
strides=1,
31+
padding="valid")
32+
self.conv3 = BasicConv2D(filters=64,
33+
kernel_size=(3, 3),
34+
strides=1,
35+
padding="same")
36+
self.b1_maxpool = tf.keras.layers.MaxPool2D(pool_size=(3, 3),
37+
strides=2,
38+
padding="valid")
39+
self.b2_conv = BasicConv2D(filters=96,
40+
kernel_size=(3, 3),
41+
strides=2,
42+
padding="valid")
43+
self.b3_conv1 = BasicConv2D(filters=64,
44+
kernel_size=(1, 1),
45+
strides=1,
46+
padding="same")
47+
self.b3_conv2 = BasicConv2D(filters=96,
48+
kernel_size=(3, 3),
49+
strides=1,
50+
padding="valid")
51+
self.b4_conv1 = BasicConv2D(filters=64,
52+
kernel_size=(1, 1),
53+
strides=1,
54+
padding="same")
55+
self.b4_conv2 = BasicConv2D(filters=64,
56+
kernel_size=(7, 1),
57+
strides=1,
58+
padding="same")
59+
self.b4_conv3 = BasicConv2D(filters=64,
60+
kernel_size=(1, 7),
61+
strides=1,
62+
padding="same")
63+
self.b4_conv4 = BasicConv2D(filters=96,
64+
kernel_size=(3, 3),
65+
strides=1,
66+
padding="valid")
67+
self.b5_conv = BasicConv2D(filters=192,
68+
kernel_size=(3, 3),
69+
strides=2,
70+
padding="valid")
71+
self.b6_maxpool = tf.keras.layers.MaxPool2D(pool_size=(3, 3),
72+
strides=2,
73+
padding="valid")
74+
75+
def call(self, inputs, training=None, **kwargs):
76+
x = self.conv1(inputs, training=training)
77+
x = self.conv2(x, training=training)
78+
x = self.conv3(x, training=training)
79+
branch_1 = self.b1_maxpool(x)
80+
branch_2 = self.b2_conv(x, training=training)
81+
x = tf.concat(values=[branch_1, branch_2], axis=-1)
82+
branch_3 = self.b3_conv1(x, training=training)
83+
branch_3 = self.b3_conv2(branch_3, training=training)
84+
branch_4 = self.b4_conv1(x, training=training)
85+
branch_4 = self.b4_conv2(branch_4, training=training)
86+
branch_4 = self.b4_conv3(branch_4, training=training)
87+
branch_4 = self.b4_conv4(branch_4, training=training)
88+
x = tf.concat(values=[branch_3, branch_4], axis=-1)
89+
branch_5 = self.b5_conv(x, training=training)
90+
branch_6 = self.b6_maxpool(x, training=training)
91+
x = tf.concat(values=[branch_5, branch_6], axis=-1)
92+
93+
return x
94+
95+
96+
class InceptionBlockA(tf.keras.layers.Layer):
97+
def __init__(self):
98+
super(InceptionBlockA, self).__init__()
99+
self.b1_pool = tf.keras.layers.AveragePooling2D(pool_size=(3, 3),
100+
strides=1,
101+
padding="same")
102+
self.b1_conv = BasicConv2D(filters=96,
103+
kernel_size=(1, 1),
104+
strides=1,
105+
padding="same")
106+
self.b2_conv = BasicConv2D(filters=96,
107+
kernel_size=(1, 1),
108+
strides=1,
109+
padding="same")
110+
self.b3_conv1 = BasicConv2D(filters=64,
111+
kernel_size=(1, 1),
112+
strides=1,
113+
padding="same")
114+
self.b3_conv2 = BasicConv2D(filters=96,
115+
kernel_size=(3, 3),
116+
strides=1,
117+
padding="same")
118+
self.b4_conv1 = BasicConv2D(filters=64,
119+
kernel_size=(1, 1),
120+
strides=1,
121+
padding="same")
122+
self.b4_conv2 = BasicConv2D(filters=96,
123+
kernel_size=(3, 3),
124+
strides=1,
125+
padding="same")
126+
self.b4_conv3 = BasicConv2D(filters=96,
127+
kernel_size=(3, 3),
128+
strides=1,
129+
padding="same")
130+
131+
def call(self, inputs, training=None, **kwargs):
132+
b1 = self.b1_pool(inputs)
133+
b1 = self.b1_conv(b1, training=training)
134+
135+
b2 = self.b2_conv(inputs, training=training)
136+
137+
b3 = self.b3_conv1(inputs, training=training)
138+
b3 = self.b3_conv2(b3, training=training)
139+
140+
b4 = self.b4_conv1(inputs, training=training)
141+
b4 = self.b4_conv2(b4, training=training)
142+
b4 = self.b4_conv3(b4, training=training)
143+
144+
return tf.concat(values=[b1, b2, b3, b4], axis=-1)
145+
146+
147+
class ReductionA(tf.keras.layers.Layer):
148+
def __init__(self, k, l, m, n):
149+
super(ReductionA, self).__init__()
150+
self.b1_pool = tf.keras.layers.MaxPool2D(pool_size=(3, 3),
151+
strides=2,
152+
padding="valid")
153+
self.b2_conv = BasicConv2D(filters=n,
154+
kernel_size=(3, 3),
155+
strides=2,
156+
padding="valid")
157+
self.b3_conv1 = BasicConv2D(filters=k,
158+
kernel_size=(1, 1),
159+
strides=1,
160+
padding="same")
161+
self.b3_conv2 = BasicConv2D(filters=l,
162+
kernel_size=(3, 3),
163+
strides=1,
164+
padding="same")
165+
self.b3_conv3 = BasicConv2D(filters=m,
166+
kernel_size=(3, 3),
167+
strides=2,
168+
padding="valid")
169+
170+
def call(self, inputs, training=None, **kwargs):
171+
b1 = self.b1_pool(inputs)
172+
173+
b2 = self.b2_conv(inputs, training=training)
174+
175+
b3 = self.b3_conv1(inputs, training=training)
176+
b3 = self.b3_conv2(b3, training=training)
177+
b3 = self.b3_conv3(b3, training=training)
178+
179+
return tf.concat(values=[b1, b2, b3], axis=-1)
180+
181+
182+
class InceptionBlockB(tf.keras.layers.Layer):
183+
def __init__(self):
184+
super(InceptionBlockB, self).__init__()
185+
self.b1_pool = tf.keras.layers.AveragePooling2D(pool_size=(3, 3),
186+
strides=1,
187+
padding="same")
188+
self.b1_conv = BasicConv2D(filters=128,
189+
kernel_size=(1, 1),
190+
strides=1,
191+
padding="same")
192+
self.b2_conv = BasicConv2D(filters=384,
193+
kernel_size=(1, 1),
194+
strides=1,
195+
padding="same")
196+
self.b3_conv1 = BasicConv2D(filters=192,
197+
kernel_size=(1, 1),
198+
strides=1,
199+
padding="same")
200+
self.b3_conv2 = BasicConv2D(filters=224,
201+
kernel_size=(1, 7),
202+
strides=1,
203+
padding="same")
204+
self.b3_conv3 = BasicConv2D(filters=256,
205+
kernel_size=(1, 7),
206+
strides=1,
207+
padding="same")
208+
self.b4_conv1 = BasicConv2D(filters=192,
209+
kernel_size=(1, 1),
210+
strides=1,
211+
padding="same")
212+
self.b4_conv2 = BasicConv2D(filters=192,
213+
kernel_size=(1, 7),
214+
strides=1,
215+
padding="same")
216+
self.b4_conv3 = BasicConv2D(filters=224,
217+
kernel_size=(7, 1),
218+
strides=1,
219+
padding="same")
220+
self.b4_conv4 = BasicConv2D(filters=224,
221+
kernel_size=(1, 7),
222+
strides=1,
223+
padding="same")
224+
self.b4_conv5 = BasicConv2D(filters=256,
225+
kernel_size=(7, 1),
226+
strides=1,
227+
padding="same")
228+
229+
def call(self, inputs, training=None, **kwargs):
230+
b1 = self.b1_pool(inputs)
231+
b1 = self.b1_conv(b1, training=training)
232+
233+
b2 = self.b2_conv(inputs, training=training)
234+
235+
b3 = self.b3_conv1(inputs, training=training)
236+
b3 = self.b3_conv2(b3, training=training)
237+
b3 = self.b3_conv3(b3, training=training)
238+
239+
b4 = self.b4_conv1(inputs, training=training)
240+
b4 = self.b4_conv2(b4, training=training)
241+
b4 = self.b4_conv3(b4, training=training)
242+
b4 = self.b4_conv4(b4, training=training)
243+
b4 = self.b4_conv5(b4, training=training)
244+
245+
return tf.concat(values=[b1, b2, b3, b4], axis=-1)
246+
247+
248+
class ReductionB(tf.keras.layers.Layer):
249+
def __init__(self):
250+
super(ReductionB, self).__init__()
251+
self.b1_pool = tf.keras.layers.MaxPool2D(pool_size=(3, 3),
252+
strides=2,
253+
padding="valid")
254+
self.b2_conv1 = BasicConv2D(filters=192,
255+
kernel_size=(1, 1),
256+
strides=1,
257+
padding="same")
258+
self.b2_conv2 = BasicConv2D(filters=192,
259+
kernel_size=(3, 3),
260+
strides=2,
261+
padding="valid")
262+
self.b3_conv1 = BasicConv2D(filters=256,
263+
kernel_size=(1, 1),
264+
strides=1,
265+
padding="same")
266+
self.b3_conv2 = BasicConv2D(filters=256,
267+
kernel_size=(1, 7),
268+
strides=1,
269+
padding="same")
270+
self.b3_conv3 = BasicConv2D(filters=320,
271+
kernel_size=(7, 1),
272+
strides=1,
273+
padding="same")
274+
self.b3_conv4 = BasicConv2D(filters=320,
275+
kernel_size=(3, 3),
276+
strides=2,
277+
padding="valid")
278+
279+
def call(self, inputs, training=None, **kwargs):
280+
b1 = self.b1_pool(inputs)
281+
282+
b2 = self.b2_conv1(inputs, training=training)
283+
b2 = self.b2_conv2(b2, training=training)
284+
285+
b3 = self.b3_conv1(inputs, training=training)
286+
b3 = self.b3_conv2(b3, training=training)
287+
b3 = self.b3_conv3(b3, training=training)
288+
b3 = self.b3_conv4(b3, training=training)
289+
290+
return tf.concat(values=[b1, b2, b3], axis=-1)
291+
292+
293+
class InceptionBlockC(tf.keras.layers.Layer):
294+
def __init__(self):
295+
super(InceptionBlockC, self).__init__()
296+
self.b1_pool = tf.keras.layers.AveragePooling2D(pool_size=(3, 3),
297+
strides=1,
298+
padding="same")
299+
self.b1_conv = BasicConv2D(filters=256,
300+
kernel_size=(1, 1),
301+
strides=1,
302+
padding="same")
303+
self.b2_conv = BasicConv2D(filters=256,
304+
kernel_size=(1, 1),
305+
strides=1,
306+
padding="same")
307+
self.b3_conv1 = BasicConv2D(filters=384,
308+
kernel_size=(1, 1),
309+
strides=1,
310+
padding="same")
311+
self.b3_conv2 = BasicConv2D(filters=256,
312+
kernel_size=(1, 3),
313+
strides=1,
314+
padding="same")
315+
self.b3_conv3 = BasicConv2D(filters=256,
316+
kernel_size=(3, 1),
317+
strides=1,
318+
padding="same")
319+
self.b4_conv1 = BasicConv2D(filters=384,
320+
kernel_size=(1, 1),
321+
strides=1,
322+
padding="same")
323+
self.b4_conv2 = BasicConv2D(filters=448,
324+
kernel_size=(1, 3),
325+
strides=1,
326+
padding="same")
327+
self.b4_conv3 = BasicConv2D(filters=512,
328+
kernel_size=(3, 1),
329+
strides=1,
330+
padding="same")
331+
self.b4_conv4 = BasicConv2D(filters=256,
332+
kernel_size=(3, 1),
333+
strides=1,
334+
padding="same")
335+
self.b4_conv5 = BasicConv2D(filters=256,
336+
kernel_size=(1, 3),
337+
strides=1,
338+
padding="same")
339+
340+
def call(self, inputs, training=None, **kwargs):
341+
b1 = self.b1_pool(inputs)
342+
b1 = self.b1_conv(b1, training=training)
343+
344+
b2 = self.b2_conv(inputs, training=training)
345+
346+
b3 = self.b3_conv1(inputs, training=training)
347+
b3_1 = self.b3_conv2(b3, training=training)
348+
b3_2 = self.b3_conv3(b3, training=training)
349+
350+
b4 = self.b4_conv1(inputs, training=training)
351+
b4 = self.b4_conv2(b4, training=training)
352+
b4 = self.b4_conv3(b4, training=training)
353+
b4_1 = self.b4_conv4(b4, training=training)
354+
b4_2 = self.b4_conv5(b4, training=training)
355+
356+
return tf.concat(values=[b1, b2, b3_1, b3_2, b4_1, b4_2], axis=-1)

models/inception_resnet_v1.py

Whitespace-only changes.

models/inception_resnet_v2.py

Whitespace-only changes.

0 commit comments

Comments
 (0)