Создать Bagnet на Керасе - PullRequest
       1

Создать Bagnet на Керасе

0 голосов
/ 25 февраля 2019

В настоящее время я пытаюсь реализовать Bagnet на keras, следуя этой статье: https://www.lyrn.ai/2019/02/14/bagnet-imagenet-with-a-simple-bof-model/ Я строю одну модель для оценки патча, а другую - для усреднения всех моих патчей.И я пытаюсь объединить их с входом: (количество патчей, x_patch, y_patch, channel_patch).Но это не работает хорошо.Мои основные проблемы связаны с оценкой всех патчей и усреднением результата.Вот мой код.Если у кого-то есть предложения, как с этим бороться.

def build_patch_model(lr, l2,patch_number):

##############
# BRANCH MODEL
##############
regul  = regularizers.l2(l2)
optim  = Adam(lr=lr)
kwargs = {'padding':'same', 'kernel_regularizer':regul}

inp = Input(shape=patch_size) # patch qxqx3

#x = MaxPooling2D((2, 2), strides=(2, 2))(inp) # 24x24x128
#x = BatchNormalization()(x)
x = Conv2D(32, (1,1), activation='relu', **kwargs)(inp)
for _ in range(6): x = subblock(x, 32, **kwargs)

x = MaxPooling2D((2, 2), strides=(2, 2))(x) # 24x24x128
x = BatchNormalization()(x)
x = Conv2D(64, (1,1), activation='relu', **kwargs)(x)
for _ in range(6): x = subblock(x, 64, **kwargs)

x = MaxPooling2D((2, 2), strides=(2, 2))(x) # 24x24x128
x = BatchNormalization()(x)
x = Conv2D(128, (1,1), activation='relu', **kwargs)(x)
for _ in range(6): x = subblock(x, 128, **kwargs) 

#x = MaxPooling2D((2, 2), strides=(2, 2))(x) # 24x24x128
#x = BatchNormalization()(x)
x = Conv2D(256, (1,1), activation='relu', **kwargs)(x)
for _ in range(6): x = subblock(x, 256, **kwargs)

x = MaxPooling2D((2, 2), strides=(2, 2))(x) # 24x24x128
x = BatchNormalization()(x)
x = Conv2D(512, (1,1), activation='relu', **kwargs)(x)
for _ in range(6): x = subblock(x, 512, **kwargs)

#x = MaxPooling2D((2, 2), strides=(2, 2))(x) # 24x24x128
#x = BatchNormalization()(x)
x = Conv2D(1080, (1,1), activation='relu', **kwargs)(x)
for _ in range(6): x = subblock(x, 1080, **kwargs)


x = MaxPooling2D((2, 2), strides=(2, 2))(x) # 24x24x128
x = BatchNormalization()(x)
x = Conv2D(2048, (1,1), activation='relu', **kwargs)(x) 
for _ in range(12): x = subblock(x, 2048, **kwargs)


x       = GlobalMaxPooling2D()(x) # 2048

y       = Dense(5004, use_bias=False, activation="softmax", name='patch_heatmap')(x)

branch_model      = Model(inp, y)

branch_model.compile(optim, loss='categorical_crossentropy', metrics=['categorical_crossentropy', 'acc'])

return branch_model




build_averaging_model():

##############
# HEAD MODEL #
##############

#x = Average()(input_head)
inp = Input(shape=(5004,))
x = Dense(5004,use_bias=False, activation="softmax", name='patch_sum')(inp)

head_model = Model(inp, x, name='head')

#x = head_model([xa, xb])

return head_model


def build_model(head_model,branch_model):

inp = Input(shape=(patch_number,patch_size[0],patch_size[1],patch_size[2]))

input_head = []

for i in range(patch_number):
    input_head.append(branch_model(inp[i,:,:,:]))


x = Average()(input_head)

x = head_model(x)

model = Model(inp,x)

return model
...