forked from commaai/speedchallenge
-
Notifications
You must be signed in to change notification settings - Fork 1
/
keras_tricks_resnet.py
86 lines (66 loc) · 3.3 KB
/
keras_tricks_resnet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import tensorflow as tf
import evonorm
import aa_downsample
import keras_senet
def res_block(input, num_channels, project=False):
shortcut = input
input = tf.keras.layers.BatchNormalization()(input)
input = tf.keras.layers.Activation(tf.nn.swish)(input)
if project:
shortcut = tf.keras.layers.AveragePooling2D(padding='same')(input)
shortcut = tf.keras.layers.Conv2D(num_channels, 1, padding='same')(shortcut)
# Residual
input = tf.keras.layers.Conv2D(num_channels, 3, strides=(2 if project else 1), padding='same')(input)
input = tf.keras.layers.BatchNormalization()(input)
input = tf.keras.layers.Activation(tf.nn.swish)(input)
input = tf.keras.layers.Conv2D(num_channels, 3, padding='same')(input)
input = keras_senet.squeeze_excite_block(input, ratio=4)
# Merge
out = tf.keras.layers.add([input, shortcut])
return out
def resnet18_encoder(image):
encoder_filters = [64, 64, 128, 256, 512]
conv1 = tf.keras.layers.Conv2D(32, 3, strides=2, padding='same')(image)
conv1 = tf.keras.layers.BatchNormalization()(conv1)
conv1 = tf.keras.layers.Activation(tf.nn.swish)(conv1)
conv1 = tf.keras.layers.Conv2D(32, 3, padding='same')(conv1)
conv1 = tf.keras.layers.BatchNormalization()(conv1)
conv1 = tf.keras.layers.Activation(tf.nn.swish)(conv1)
conv1 = tf.keras.layers.Conv2D(encoder_filters[0], 3, padding='same')(conv1)
conv1 = tf.keras.layers.MaxPool2D(3, 2, 'same')(conv1)
conv2 = res_block(conv1, encoder_filters[0])
conv2 = res_block(conv2, encoder_filters[0])
conv3 = res_block(conv2, encoder_filters[2], project=True)
conv3 = res_block(conv3, encoder_filters[2])
conv4 = res_block(conv3, encoder_filters[3], project=True)
conv4 = res_block(conv4, encoder_filters[3])
conv5 = res_block(conv4, encoder_filters[4], project=True)
conv5 = res_block(conv5, encoder_filters[4])
return conv5
def resnet34_encoder(image):
encoder_filters = [64, 64, 128, 256, 512]
conv1 = tf.keras.layers.Conv2D(32, 3, strides=2, padding='same')(image)
conv1 = tf.keras.layers.BatchNormalization()(conv1)
conv1 = tf.keras.layers.Activation(tf.nn.swish)(conv1)
conv1 = tf.keras.layers.Conv2D(32, 3, padding='same')(conv1)
conv1 = tf.keras.layers.BatchNormalization()(conv1)
conv1 = tf.keras.layers.Activation(tf.nn.swish)(conv1)
conv1 = tf.keras.layers.Conv2D(encoder_filters[0], 3, padding='same')(conv1)
conv1 = tf.keras.layers.MaxPool2D(3, 2, 'same')(conv1)
conv2 = res_block(conv1, encoder_filters[0])
conv2 = res_block(conv2, encoder_filters[0])
conv2 = res_block(conv2, encoder_filters[0])
conv3 = res_block(conv2, encoder_filters[2], project=True)
conv3 = res_block(conv3, encoder_filters[2])
conv3 = res_block(conv3, encoder_filters[2])
conv3 = res_block(conv3, encoder_filters[2])
conv4 = res_block(conv3, encoder_filters[3], project=True)
conv4 = res_block(conv4, encoder_filters[3])
conv4 = res_block(conv4, encoder_filters[3])
conv4 = res_block(conv4, encoder_filters[3])
conv4 = res_block(conv4, encoder_filters[3])
conv4 = res_block(conv4, encoder_filters[3])
conv5 = res_block(conv4, encoder_filters[4], project=True)
conv5 = res_block(conv5, encoder_filters[4])
conv5 = res_block(conv5, encoder_filters[4])
return conv5