def multi_level_contextual(patch_size, n_channels, nb_classes):
# number of convolutional filters to use at each layer
nb_filters = [64, 64, 64]
# level of pooling to perform at each layer (POOL x POOL)
nb_pool = [2, 2, 2]
# level of convolution to perform at each layer (CONV x CONV)
nb_conv = [5, 5, 5]
inputs = Input((patch_size, patch_size, patch_size, n_channels))
c1 = Conv3D(nb_filters[0], (nb_conv[0], nb_conv[0], nb_conv[0]), padding='same', activation='relu', kernel_regularizer=regularizers.l2(0.01))(inputs)
c2 = BatchNormalization(epsilon=1e-06, momentum=0.9, weights=None)(c1)
c3 = MaxPooling3D(pool_size=(nb_pool[0], nb_pool[0], nb_pool[0]))(c2)
c4 = SpatialDropout3D(0.5)(c3)
c5 = Conv3D(nb_filters[1],(nb_conv[1], nb_conv[1], nb_conv[1]), padding='same', activation='relu', kernel_regularizer=regularizers.l2(0.01))(c4)
c6 = BatchNormalization(epsilon=1e-06, momentum=0.9, weights=None)(c5)
c7 = Conv3D(nb_filters[2],(nb_conv[2], nb_conv[2], nb_conv[2]), padding='same', activation='relu', kernel_regularizer=regularizers.l2(0.01))(c6)
c8 = BatchNormalization(epsilon=1e-06, momentum=0.9, weights=None)(c7)
c9 = SpatialDropout3D(0.5)(c8)
c10 = Flatten()(c9)
c11 = Dense(256, kernel_initializer='glorot_normal', activation='relu', kernel_regularizer=regularizers.l2(0.01))(c10)
c12 = Dense(nb_classes, kernel_initializer='glorot_normal', kernel_regularizer=regularizers.l2(0.01))(c11)
c13 = Activation('softmax')(c12)
c00 = Cropping3D(cropping=((patch_size//2-patch_size//4, patch_size//2+patch_size//4), (patch_size//2-patch_size//4, patch_size//2+patch_size//4), (patch_size//2-patch_size//4, patch_size//2+patch_size//4)))(inputs)
c01 = Conv3D(nb_filters[0], (nb_conv[0], nb_conv[0], nb_conv[0]), padding='same', activation='relu', kernel_regularizer=regularizers.l2(0.01))(c00)
c02 = BatchNormalization(epsilon=1e-06, momentum=0.9, weights=None)(c01)
c03 = SpatialDropout3D(0.5)(c02)
c04 = Conv3D(nb_filters[1],(nb_conv[1], nb_conv[1], nb_conv[1]), padding='same', activation='relu', kernel_regularizer=regularizers.l2(0.01))(c03)
c05 = BatchNormalization(epsilon=1e-06, momentum=0.9, weights=None)(c04)
c06 = Conv3D(nb_filters[2],(nb_conv[2], nb_conv[2], nb_conv[2]), padding='same', activation='relu', kernel_regularizer=regularizers.l2(0.01))(c05)
c07 = BatchNormalization(epsilon=1e-06, momentum=0.9, weights=None)(c06)
c08 = SpatialDropout3D(0.5)(c07)
c09 = Flatten()(c08)
c010 = Dense(128, kernel_initializer='glorot_normal', activation='relu', kernel_regularizer=regularizers.l2(0.01))(c09)
c011 = Dense(nb_classes, kernel_initializer='glorot_normal', kernel_regularizer=regularizers.l2(0.01))(c010)
c012 = Activation('softmax')(c011)
model = Model(inputs=[inputs], outputs=[(c13+c012)/2])
return model