From 4a99de40a24aec5ff860cebd5f53c89e26dc06ac Mon Sep 17 00:00:00 2001 From: Somshubra Majumdar Date: Fri, 17 Nov 2017 15:41:30 -0600 Subject: [PATCH] Improve name scope and add CIFAR model --- keras_contrib/applications/nasnet.py | 179 +++++++++++++-------------- 1 file changed, 89 insertions(+), 90 deletions(-) diff --git a/keras_contrib/applications/nasnet.py b/keras_contrib/applications/nasnet.py index 2ba3e4c..15e7247 100644 --- a/keras_contrib/applications/nasnet.py +++ b/keras_contrib/applications/nasnet.py @@ -38,7 +38,6 @@ from keras.applications.inception_v3 import preprocess_input from keras.applications.imagenet_utils import decode_predictions from keras import backend as K - _BN_DECAY = 0.9997 _BN_EPSILON = 1e-3 @@ -171,10 +170,10 @@ def NASNet(input_shape=None, img_input = input_tensor assert penultimate_filters % 24 == 0, "`penultimate_filters` needs to be divisible " \ - "by 6 * (2^N)." + "by 6 * (2^N)." channel_dim = 1 if K.image_data_format() == 'channels_first' else -1 - filters = penultimate_filters // 24 + filters = penultimate_filters // 24 x = Conv2D(stem_filters, (3, 3), strides=(2, 2), padding='valid', use_bias=False, name='stem_conv1', kernel_initializer='he_normal')(img_input) @@ -199,22 +198,22 @@ def NASNet(input_shape=None, img_dim = 2 if K.image_data_format() == 'channels_first' else -2 with K.name_scope('auxilary_branch'): - auxilary_x = Activation('relu')(x) - auxilary_x = AveragePooling2D((5, 5), strides=(3, 3), padding='valid', name='aux_pool')(auxilary_x) - auxilary_x = Conv2D(128, (1, 1), padding='same', use_bias=False, name='aux_conv_projection', - kernel_initializer='he_normal')(auxilary_x) - auxilary_x = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, - name='aux_bn_projection')(auxilary_x) - auxilary_x = Activation('relu')(auxilary_x) + auxilary_x = Activation('relu')(x) + auxilary_x = AveragePooling2D((5, 5), strides=(3, 3), padding='valid', name='aux_pool')(auxilary_x) + auxilary_x = Conv2D(128, (1, 1), padding='same', use_bias=False, name='aux_conv_projection', + kernel_initializer='he_normal')(auxilary_x) + auxilary_x = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, + name='aux_bn_projection')(auxilary_x) + auxilary_x = Activation('relu')(auxilary_x) - auxilary_x = Conv2D(768, auxilary_x._keras_shape[img_dim], padding='valid', use_bias=False, - kernel_initializer='he_normal', name='aux_conv_reduction')(auxilary_x) - auxilary_x = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, - name='aux_bn_reduction')(auxilary_x) - auxilary_x = Activation('relu')(auxilary_x) + auxilary_x = Conv2D(768, auxilary_x._keras_shape[img_dim], padding='valid', use_bias=False, + kernel_initializer='he_normal', name='aux_conv_reduction')(auxilary_x) + auxilary_x = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, + name='aux_bn_reduction')(auxilary_x) + auxilary_x = Activation('relu')(auxilary_x) - auxilary_x = GlobalAveragePooling2D()(auxilary_x) - auxilary_x = Dense(classes, activation='softmax')(auxilary_x) + auxilary_x = GlobalAveragePooling2D()(auxilary_x) + auxilary_x = Dense(classes, activation='softmax')(auxilary_x) x, p0 = _reduction_A(x, p, filters * filters_multiplier ** 2, id='reduce_%d' % (2 * nb_blocks)) @@ -456,7 +455,7 @@ def NASNetCIFAR(input_shape=None, """ return NASNet(input_shape, penultimate_filters=768, - nb_blocks=2, + nb_blocks=6, stem_filters=96, skip_reduction=True, use_auxilary_branch=use_auxilary_branch, @@ -518,32 +517,32 @@ def _adjust_block(p, ip, filters, id=None): img_dim = 2 if K.image_data_format() == 'channels_first' else -2 with K.name_scope('adjust_block'): - if p is None: - p = ip + if p is None: + p = ip - elif p._keras_shape[img_dim] != ip._keras_shape[img_dim]: - with K.name_scope('adjust_reduction_block_%s' % id): - p = Activation('relu', name='adjust_relu_1_%s' % id)(p) + elif p._keras_shape[img_dim] != ip._keras_shape[img_dim]: + with K.name_scope('adjust_reduction_block_%s' % id): + p = Activation('relu', name='adjust_relu_1_%s' % id)(p) - p1 = AveragePooling2D((1, 1), strides=(2, 2), padding='valid', name='adjust_avg_pool_1_%s' % id)(p) - p1 = Conv2D(filters // 2, (1, 1), padding='same', use_bias=False, - name='adjust_conv_1_%s' % id, kernel_initializer='he_normal')(p1) + p1 = AveragePooling2D((1, 1), strides=(2, 2), padding='valid', name='adjust_avg_pool_1_%s' % id)(p) + p1 = Conv2D(filters // 2, (1, 1), padding='same', use_bias=False, + name='adjust_conv_1_%s' % id, kernel_initializer='he_normal')(p1) - p2 = AveragePooling2D((1, 1), strides=(2, 2), padding='valid', name='adjust_avg_pool_2_%s' % id)(p) - p2 = Conv2D(filters // 2, (1, 1), padding='same', use_bias=False, - name='adjust_conv_2_%s' % id, kernel_initializer='he_normal')(p2) + p2 = AveragePooling2D((1, 1), strides=(2, 2), padding='valid', name='adjust_avg_pool_2_%s' % id)(p) + p2 = Conv2D(filters // 2, (1, 1), padding='same', use_bias=False, + name='adjust_conv_2_%s' % id, kernel_initializer='he_normal')(p2) - p = concatenate([p1, p2], axis=channel_dim) - p = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, - name='adjust_bn_%s' % id)(p) + p = concatenate([p1, p2], axis=channel_dim) + p = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, + name='adjust_bn_%s' % id)(p) - elif p._keras_shape[channel_dim] != filters: - with K.name_scope('adjust_projection_block_%s' % id): - p = Activation('relu')(p) - p = Conv2D(filters, (1, 1), strides=(1, 1), padding='same', name='adjust_conv_projection_%s' % id, - use_bias=False, kernel_initializer='he_normal')(p) - p = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, - name='adjust_bn_%s' % id)(p) + elif p._keras_shape[channel_dim] != filters: + with K.name_scope('adjust_projection_block_%s' % id): + p = Activation('relu')(p) + p = Conv2D(filters, (1, 1), strides=(1, 1), padding='same', name='adjust_conv_projection_%s' % id, + use_bias=False, kernel_initializer='he_normal')(p) + p = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, + name='adjust_bn_%s' % id)(p) return p @@ -562,38 +561,38 @@ def _normal_A(ip, p, filters, id=None): channel_dim = 1 if K.image_data_format() == 'channels_first' else -1 with K.name_scope('normal_A_block_%s' % id): - p = _adjust_block(p, ip, filters, id) + p = _adjust_block(p, ip, filters, id) - h = Activation('relu')(ip) - h = Conv2D(filters, (1, 1), strides=(1, 1), padding='same', name='normal_conv_1_%s' % id, - use_bias=False, kernel_initializer='he_normal')(h) - h = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, - name='normal_bn_1_%s' % id)(h) + h = Activation('relu')(ip) + h = Conv2D(filters, (1, 1), strides=(1, 1), padding='same', name='normal_conv_1_%s' % id, + use_bias=False, kernel_initializer='he_normal')(h) + h = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, + name='normal_bn_1_%s' % id)(h) - with K.name_scope('block_1'): - x1 = _separable_conv_block(h, filters, id='normal_left1_%s' % id) - x1 = add([x1, h], name='normal_add_1_%s' % id) + with K.name_scope('block_1'): + x1 = _separable_conv_block(h, filters, id='normal_left1_%s' % id) + x1 = add([x1, h], name='normal_add_1_%s' % id) - with K.name_scope('block_2'): - x2_1 = _separable_conv_block(p, filters, id='normal_left2_%s' % id) - x2_2 = _separable_conv_block(h, filters, kernel_size=(5, 5), id='normal_right2_%s' % id) - x2 = add([x2_1, x2_2], name='normal_add_2_%s' % id) + with K.name_scope('block_2'): + x2_1 = _separable_conv_block(p, filters, id='normal_left2_%s' % id) + x2_2 = _separable_conv_block(h, filters, kernel_size=(5, 5), id='normal_right2_%s' % id) + x2 = add([x2_1, x2_2], name='normal_add_2_%s' % id) - with K.name_scope('block_3'): - x3 = AveragePooling2D((3, 3), strides=(1, 1), padding='same', name='normal_left3_%s' % (id))(h) - x3 = add([x3, p], name='normal_add_3_%s' % id) + with K.name_scope('block_3'): + x3 = AveragePooling2D((3, 3), strides=(1, 1), padding='same', name='normal_left3_%s' % (id))(h) + x3 = add([x3, p], name='normal_add_3_%s' % id) - with K.name_scope('block_4'): - x4_1 = AveragePooling2D((3, 3), strides=(1, 1), padding='same', name='normal_left4_%s' % (id))(p) - x4_2 = AveragePooling2D((3, 3), strides=(1, 1), padding='same', name='normal_right4_%s' % (id))(p) - x4 = add([x4_1, x4_2], name='normal_add_4_%s' % id) + with K.name_scope('block_4'): + x4_1 = AveragePooling2D((3, 3), strides=(1, 1), padding='same', name='normal_left4_%s' % (id))(p) + x4_2 = AveragePooling2D((3, 3), strides=(1, 1), padding='same', name='normal_right4_%s' % (id))(p) + x4 = add([x4_1, x4_2], name='normal_add_4_%s' % id) - with K.name_scope('block_5'): - x5_1 = _separable_conv_block(p, filters, (5, 5), id='normal_left5_%s' % id) - x5_2 = _separable_conv_block(p, filters, (3, 3), id='normal_right5_%s' % id) - x5 = add([x5_1, x5_2], name='normal_add_5_%s' % id) + with K.name_scope('block_5'): + x5_1 = _separable_conv_block(p, filters, (5, 5), id='normal_left5_%s' % id) + x5_2 = _separable_conv_block(p, filters, (3, 3), id='normal_right5_%s' % id) + x5 = add([x5_1, x5_2], name='normal_add_5_%s' % id) - x = concatenate([p, x2, x5, x3, x4, x1], axis=channel_dim, name='normal_concat_%s' % id) + x = concatenate([p, x2, x5, x3, x4, x1], axis=channel_dim, name='normal_concat_%s' % id) return x, ip @@ -613,36 +612,36 @@ def _reduction_A(ip, p, filters, id=None): channel_dim = 1 if K.image_data_format() == 'channels_first' else -1 with K.name_scope('reduction_A_block_%s' % id): - p = _adjust_block(p, ip, filters, id) + p = _adjust_block(p, ip, filters, id) - h = Activation('relu')(ip) - h = Conv2D(filters, (1, 1), strides=(1, 1), padding='same', name='reduction_conv_1_%s' % id, - use_bias=False, kernel_initializer='he_normal')(h) - h = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, - name='reduction_bn_1_%s' % id)(h) + h = Activation('relu')(ip) + h = Conv2D(filters, (1, 1), strides=(1, 1), padding='same', name='reduction_conv_1_%s' % id, + use_bias=False, kernel_initializer='he_normal')(h) + h = BatchNormalization(axis=channel_dim, momentum=_BN_DECAY, epsilon=_BN_EPSILON, + name='reduction_bn_1_%s' % id)(h) - with K.name_scope('block_1'): - x1_1 = _separable_conv_block(p, filters, (7, 7), strides=(2, 2), id='reduction_left1_%s' % id) - x1_2 = _separable_conv_block(h, filters, (5, 5), strides=(2, 2), id='reduction_right1_%s' % id) - x1 = add([x1_1, x1_2], name='reduction_add_1_%s' % id) + with K.name_scope('block_1'): + x1_1 = _separable_conv_block(p, filters, (7, 7), strides=(2, 2), id='reduction_left1_%s' % id) + x1_2 = _separable_conv_block(h, filters, (5, 5), strides=(2, 2), id='reduction_right1_%s' % id) + x1 = add([x1_1, x1_2], name='reduction_add_1_%s' % id) - with K.name_scope('block_2'): - x2_1 = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='reduction_left2_%s' % id)(h) - x2_2 = _separable_conv_block(p, filters, (7, 7), strides=(2, 2), id='reduction_right2_%s' % id) - x2 = add([x2_1, x2_2], name='reduction_add_2_%s' % id) + with K.name_scope('block_2'): + x2_1 = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='reduction_left2_%s' % id)(h) + x2_2 = _separable_conv_block(p, filters, (7, 7), strides=(2, 2), id='reduction_right2_%s' % id) + x2 = add([x2_1, x2_2], name='reduction_add_2_%s' % id) - with K.name_scope('block_3'): - x3_1 = AveragePooling2D((3, 3), strides=(2, 2), padding='same', name='reduction_left3_%s' % id)(h) - x3_2 = _separable_conv_block(p, filters, (5, 5), strides=(2, 2), id='reduction_right3_%s' % id) - x3 = add([x3_1, x3_2], name='reduction_add3_%s' % id) + with K.name_scope('block_3'): + x3_1 = AveragePooling2D((3, 3), strides=(2, 2), padding='same', name='reduction_left3_%s' % id)(h) + x3_2 = _separable_conv_block(p, filters, (5, 5), strides=(2, 2), id='reduction_right3_%s' % id) + x3 = add([x3_1, x3_2], name='reduction_add3_%s' % id) - with K.name_scope('block_4'): - x4_1 = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='reduction_left4_%s' % id)(h) - x4_2 = _separable_conv_block(x1, filters, (3, 3), id='reduction_right4_%s' % id) - x4 = add([x4_1, x4_2], name='reduction_add4_%s' % id) + with K.name_scope('block_4'): + x4_1 = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='reduction_left4_%s' % id)(h) + x4_2 = _separable_conv_block(x1, filters, (3, 3), id='reduction_right4_%s' % id) + x4 = add([x4_1, x4_2], name='reduction_add4_%s' % id) - with K.name_scope('block_5'): - x5 = AveragePooling2D((3, 3), strides=(1, 1), padding='same', name='reduction_left5_%s' % id)(x1) + with K.name_scope('block_5'): + x5 = AveragePooling2D((3, 3), strides=(1, 1), padding='same', name='reduction_left5_%s' % id)(x1) - x = concatenate([x2, x3, x5, x4], axis=channel_dim, name='reduction_concat_%s' % id) - return x, ip + x = concatenate([x2, x3, x5, x4], axis=channel_dim, name='reduction_concat_%s' % id) + return x, ip