def timer(model): result = '' for i, layer in enumerate(model.layers): layer_name = layer.__class__.__name__ if layer_name == 'InputLayer' or layer_name == 'Flatten' \ or layer_name == 'MaxPooling3D' or layer_name == 'Activation' \ or layer_name == 'MaxPooling2D' or layer_name == 'ZeroPadding2D' \ or layer_name == 'Add' or layer_name == 'AveragePooling2D' \ or layer_name == 'GlobalAveragePooling2D' or layer_name == 'Lambda'\ or layer_name == 'Concatenate': continue # Because we split some of Convolution layers, which has multiple inputs # cannot use normal method for getting int_shape. try: shape = layer.input_shape except Exception: shape = layer.get_input_shape_at(0) assert not isinstance(shape[0], tuple), \ '{:s} has bad input shape {:s}'.format(layer_name, str(layer.input_shape)) input_shape = list(shape)[1:] data = np.random.random_sample(input_shape) input = InputLayer(input_shape) config = layer.get_config() if layer_name == 'Dense': _layer = Dense.from_config(config) elif layer_name == 'Conv3D': _layer = Conv3D.from_config(config) elif layer_name == 'Conv2D': _layer = Conv2D.from_config(config) elif layer_name == 'SeparableConv2D': _layer = SeparableConv2D.from_config(config) elif layer_name == 'DepthwiseConv2D': _layer = DepthwiseConv2D.from_config(config) else: raise Exception(layer_name, ' layer name not included') # Not the real model used for inference. _model = Sequential() _model.add(input) _model.add(_layer) # fake run because the model needs to be complied _model.predict(np.array([data])) start = time.time() for _ in range(50): _model.predict(np.array([data])) result += '{:>20s}: {:.3f} s\n'.format(layer.name, (time.time() - start) / 50) return result
def FCN_8s_pretrained(classes, in_shape, l2_reg, nopad=False, test=False): vgg16 = VGG16(include_top=False, weights="imagenet", input_shape=in_shape) inputs = Input(shape=in_shape) if nopad: x = inputs else: x = ZeroPadding2D(padding=(100, 100))(inputs) for layer in vgg16.layers[1:]: if "conv" in layer.name: W, b = layer.get_weights() config = layer.get_config() config["kernel_regularizer"] = l2(l2_reg) config["kernel_initializer"] = Constant(W) config["bias_initializer"] = Constant(b) conv = Conv2D.from_config(config) x = conv(x) elif "pool" in layer.name: x = MaxPooling2D()(x) if layer.name == "block3_pool": feat3 = x elif layer.name == "block4_pool": feat4 = x x = Conv2D(filters=4096, kernel_size=(7, 7), padding="valid", activation="relu", kernel_regularizer=l2(l2_reg), name="fc1")(x) x = Dropout(0.5)(x) x = Conv2D(filters=4096, kernel_size=(1, 1), padding="valid", activation="relu", kernel_regularizer=l2(l2_reg), name="fc2")(x) x = Dropout(0.5)(x) score5 = Conv2D(filters=classes, kernel_size=(1, 1), kernel_regularizer=l2(l2_reg), activation="relu")(x) if nopad: score5 = Conv2DTranspose(filters=classes, kernel_size=(14, 14), strides=(1, 1), padding="valid", activation="linear", kernel_regularizer=l2(l2_reg), kernel_initializer=Constant( bilinear_upsample_weights( "full", classes) ))(score5) else: score5 = Conv2DTranspose(filters=classes, kernel_size=(4, 4), strides=(2, 2), padding="same", activation="linear", kernel_regularizer=l2(l2_reg), kernel_initializer=Constant( bilinear_upsample_weights(2, classes) ))(score5) # pool3 のfeature mapを次元圧縮 score3 = Conv2D(filters=classes, kernel_size=(1, 1), kernel_regularizer=l2(l2_reg), activation='relu')(feat3) # pool4のfeature mapを次元圧縮 score4 = Conv2D(filters=classes, kernel_size=(1, 1), kernel_regularizer=l2(l2_reg), activation="relu")(feat4) # merge p4 and p5 score4 = CroppingLike2D(K.int_shape(score5))(score4) score45 = Add()([score4, score5]) # p4+p5 を x2 upsampling if not nopad: score45 = ZeroPadding2D(padding=(1, 1))(score45) score45 = Conv2DTranspose(filters=classes, kernel_size=(4, 4), strides=(2, 2), padding="same", activation="linear", kernel_regularizer=l2(l2_reg), kernel_initializer=Constant( bilinear_upsample_weights(2, classes) ))(score45) # p3とp45をmerge score3 = CroppingLike2D(K.int_shape(score45))(score3) score345 = Add()([score3, score45]) # p3+p4+p5を x8 upsampling if not nopad: score345 = ZeroPadding2D(padding=(1, 1))(score345) x = Conv2DTranspose(filters=classes, kernel_size=(16, 16), strides=(8, 8), padding="same", activation="linear", kernel_regularizer=l2(l2_reg), kernel_initializer=Constant( bilinear_upsample_weights(8, classes) ))(score345) x = CroppingLike2D(K.int_shape(inputs))(x) if test: x = Activation("softmax")(x) model = Model(inputs=inputs, outputs=x) return model