Керас замораживает удельные веса с помощью маски - PullRequest
1 голос
/ 05 июля 2019

Я новичок в Керасе. Я хочу реализовать слой, где не все веса будут обновлены. Например, в следующем коде я хочу, чтобы слой dilation обновлялся таким образом, чтобы некоторые веса центра никогда не обновлялись. Например, форма каждой матрицы объектов (из 1024) в слое dilation равна 448, 448, и блок 8x8 в центре всех матриц объектов никогда не будет обновлен, то есть блок 8x8 (не обучаемая) маска для матриц объектов.

input_layer=Input(shape=(896,896,3))
new_layer = Conv2D(32, kernel_size=(3,3), padding="same", activation='relu', kernel_initializer='he_normal')(input_layer)
new_layer = MaxPooling2D(pool_size=(2, 2), strides=(2,2), padding='same', data_format=None)(new_layer)
new_layer = Conv2D(64, kernel_size=(3,3), padding='same', activation='relu', kernel_initializer='he_normal')(new_layer)
new_layer = Conv2D(1024, kernel_size=(7,7), dilation_rate=8, padding="same", activation='relu', kernel_initializer='he_normal', name='dialation')(new_layer)
new_layer = Conv2D(32, kernel_size=(1,1), padding="same", activation='relu', kernel_initializer='he_normal')(new_layer)
new_layer = Conv2D(32, kernel_size=(1,1), padding="same", activation='relu', kernel_initializer='he_normal')(new_layer)

model = Model(input_layer, new_layer)

Я пытался с custom layer [ссылка] Кераса, но мне было трудно понять. Любой, пожалуйста, помогите.

UPDATE : Я добавил следующий рисунок для лучшего понимания. Слой расширения содержит 1024 объекта. Я хочу, чтобы средняя область каждого объекта была необучаемой (статической).

image of dilation layer

1 Ответ

0 голосов
/ 10 июля 2019

Используйте эту маску для обоих случаев:

mask = np.zeros((1,448,448,1))
mask[:,220:228,220:228] = 1

Замена части функции

Если вы заменяете часть функции постоянными значениями, это означает, что функция будет статической, ноон все равно будет участвовать в обратном распространении (потому что веса будут все еще умножаться и суммироваться для этой части изображения и имеется соединение)

constant = 0 (will annulate kernel, but not bias) 

def replace(x):
    return x*(1-mask) + constant*mask

#before the dilation layer
new_layer=Lambda(replace)(new_layer) 

Сохранение значения функции, но остановка обратного распространения

Здесь веса слоя расширения и далее будут обновляться нормально, но веса до слоя расширения не будут получать влияние центральной области.

def stopBackprop(x):
    stopped=K.stop_gradients(x)
    return x*(1-mask) + stopped*mask

#before the dilation layer
new_layer=Lambda(stopBackprop)(new_layer) 
...