CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
amanchadha

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.

GitHub Repository: amanchadha/coursera-deep-learning-specialization
Path: blob/master/C4 - Convolutional Neural Networks/Week 3/Car detection for Autonomous Driving/yad2k/models/keras_darknet19.py
Views: 4822
1
"""Darknet19 Model Defined in Keras."""
2
import functools
3
from functools import partial
4
5
from tensorflow.keras.layers import Conv2D, MaxPooling2D
6
from tensorflow.keras.layers import LeakyReLU
7
from tensorflow.keras.layers import BatchNormalization
8
from tensorflow.keras.models import Model
9
from tensorflow.keras.regularizers import l2
10
11
from ..utils import compose
12
13
# Partial wrapper for Convolution2D with static default argument.
14
_DarknetConv2D = partial(Conv2D, padding='same')
15
16
17
@functools.wraps(Conv2D)
18
def DarknetConv2D(*args, **kwargs):
19
"""Wrapper to set Darknet weight regularizer for Convolution2D."""
20
darknet_conv_kwargs = {'kernel_regularizer': l2(5e-4)}
21
darknet_conv_kwargs.update(kwargs)
22
return _DarknetConv2D(*args, **darknet_conv_kwargs)
23
24
25
def DarknetConv2D_BN_Leaky(*args, **kwargs):
26
"""Darknet Convolution2D followed by BatchNormalization and LeakyReLU."""
27
no_bias_kwargs = {'use_bias': False}
28
no_bias_kwargs.update(kwargs)
29
return compose(
30
DarknetConv2D(*args, **no_bias_kwargs),
31
BatchNormalization(),
32
LeakyReLU(alpha=0.1))
33
34
35
def bottleneck_block(outer_filters, bottleneck_filters):
36
"""Bottleneck block of 3x3, 1x1, 3x3 convolutions."""
37
return compose(
38
DarknetConv2D_BN_Leaky(outer_filters, (3, 3)),
39
DarknetConv2D_BN_Leaky(bottleneck_filters, (1, 1)),
40
DarknetConv2D_BN_Leaky(outer_filters, (3, 3)))
41
42
43
def bottleneck_x2_block(outer_filters, bottleneck_filters):
44
"""Bottleneck block of 3x3, 1x1, 3x3, 1x1, 3x3 convolutions."""
45
return compose(
46
bottleneck_block(outer_filters, bottleneck_filters),
47
DarknetConv2D_BN_Leaky(bottleneck_filters, (1, 1)),
48
DarknetConv2D_BN_Leaky(outer_filters, (3, 3)))
49
50
51
def darknet_body():
52
"""Generate first 18 conv layers of Darknet-19."""
53
return compose(
54
DarknetConv2D_BN_Leaky(32, (3, 3)),
55
MaxPooling2D(),
56
DarknetConv2D_BN_Leaky(64, (3, 3)),
57
MaxPooling2D(),
58
bottleneck_block(128, 64),
59
MaxPooling2D(),
60
bottleneck_block(256, 128),
61
MaxPooling2D(),
62
bottleneck_x2_block(512, 256),
63
MaxPooling2D(),
64
bottleneck_x2_block(1024, 512))
65
66
67
def darknet19(inputs):
68
"""Generate Darknet-19 model for Imagenet classification."""
69
body = darknet_body()(inputs)
70
logits = DarknetConv2D(1000, (1, 1), activation='softmax')(body)
71
return Model(inputs, logits)
72
73