def mldensenet(img_shape, n_classes, mltype=0, finalAct='softmax', f=32): """ if mltype == 0: repetitions = 6,12,24,16 elif mltype == 2 or mltype == 3: repetitions = 6,12,24,16 elif mltype == 1 or mltype == 4 or mltype == 5: repetitions = 6,12,24 """ if mltype == 0: repetitions = 6, 12, 48, 32 elif mltype == 2 or mltype == 3: repetitions = 6, 12, 48, 32 elif mltype == 1 or mltype == 4 or mltype == 5: repetitions = 6, 12, 32 def bn_rl_conv(x, f, k=1, s=1, p='same'): x = BatchNormalization(epsilon=1.001e-5)(x) x = ReLU()(x) x = Conv2D(f, k, strides=s, padding=p)(x) return x def dense_block(tensor, r): for _ in range(r): x = bn_rl_conv(tensor, 4 * f) x = bn_rl_conv(x, f, 3) x = squeeze_excite_block(x) tensor = Concatenate()([tensor, x]) return tensor def transition_block(x): x = bn_rl_conv(x, K.int_shape(x)[-1] // 2) #x = Dropout(0.2)(x) x = AvgPool2D(2, strides=2, padding='same')(x) return x def squeeze_excite_block(tensor, ratio=16): init = tensor channel_axis = 1 if K.image_data_format() == "channels_first" else -1 filters = init.shape[channel_axis] se_shape = (1, 1, filters) se = GlobalAvgPool2D()(init) se = Reshape(se_shape)(se) se = Dense(filters // ratio, activation='relu', kernel_initializer='he_normal', use_bias=False)(se) se = Dense(filters, activation='sigmoid', kernel_initializer='he_normal', use_bias=False)(se) if K.image_data_format() == 'channels_first': se = Permute((3, 1, 2))(se) x = multiply([init, se]) return x input = Input(img_shape) x = Conv2D(64, 7, strides=2, padding='same')(input) x = BatchNormalization(epsilon=1.001e-5)(x) x = ReLU()(x) x = MaxPool2D(3, strides=2, padding='same')(x) for r in repetitions: d = dense_block(x, r) #d = squeeze_excite_block(d) x = transition_block(d) if mltype == 0: x = GlobalAvgPool2D()(d) output = Dense(n_classes, activation=finalAct)(x) model = Model(input, output) return model elif mltype == 1: outputs = [] mt_block = 16 for i in range(n_classes): print("class ", i) d = dense_block(x, mt_block) branch = GlobalAvgPool2D()(d) output = Dense(1, activation=finalAct)(branch) outputs.append(output) outputs = Concatenate()(outputs) model = Model(input, outputs) return model elif mltype == 2: x = GlobalAvgPool2D()(d) outputs = [] for i in range(n_classes): print("\rclass ", i, end="") x = Dense(1024, activation='relu')(x) x = Dense(512, activation='relu')(x) x = Dense(256, activation='relu')(x) output = Dense(1, activation=finalAct)(x) outputs.append(output) outputs = Concatenate()(outputs) model = Model(input, outputs) return model elif mltype == 3: a = transition_block(d) outputs = [] for i in range(n_classes): print("\rclass ", i, end="") v = Conv2D(256, (3, 3), activation='relu', padding='same')(a) v = Conv2D(256, (3, 3), activation='relu', padding='same')(v) v = Conv2D(256, (3, 3), activation='relu', padding='same')(v) v = MaxPooling2D((2, 2), strides=(2, 2))(v) v = Conv2D(512, (3, 3), activation='relu', padding='same')(v) v = Conv2D(512, (3, 3), activation='relu', padding='same')(v) v = Conv2D(512, (3, 3), activation='relu', padding='same')(v) v = MaxPooling2D((2, 2), strides=(2, 2))(v) v = Flatten()(v) d = Dense(4096, activation='relu')(v) d = Dense(4096, activation='relu')(d) d = Dense(1024, activation='relu')(d) output = Dense(1, activation=finalAct)(d) outputs.append(output) outputs = Concatenate()(outputs) model = Model(input, outputs) return model elif mltype == 4: x = GlobalAvgPool2D()(d) outputs = [] for i in range(n_classes): print("\rclass ", i, end="") x = Dense(1024, activation='relu')(x) x = Dense(512, activation='relu')(x) x = Dense(256, activation='relu')(x) output = Dense(1, activation=finalAct)(x) outputs.append(output) outputs = Concatenate()(outputs) model = Model(input, outputs) return model elif mltype == 5: a = transition_block(d) outputs = [] for i in range(n_classes): print("\rclass ", i, end="") v = Conv2D(256, (3, 3), activation='relu', padding='same')(a) v = Conv2D(256, (3, 3), activation='relu', padding='same')(v) v = Conv2D(256, (3, 3), activation='relu', padding='same')(v) v = MaxPooling2D((2, 2), strides=(2, 2))(v) v = Conv2D(512, (3, 3), activation='relu', padding='same')(v) v = Conv2D(512, (3, 3), activation='relu', padding='same')(v) v = Conv2D(512, (3, 3), activation='relu', padding='same')(v) v = MaxPooling2D((2, 2), strides=(2, 2))(v) v = Flatten()(v) d = Dense(2048, activation='relu')(v) d = Dense(2048, activation='relu')(d) d = Dense(1024, activation='relu')(d) output = Dense(1, activation=finalAct)(d) outputs.append(output) outputs = Concatenate()(outputs) model = Model(input, outputs) return model