Specifi c Отсев в Керасе - PullRequest
       24

Specifi c Отсев в Керасе

0 голосов
/ 22 апреля 2020

Я бы хотел обучить автоэнкодер, используя только указанные c ЧАСТИ слоя (слой с именем FEATURES в примере с автоэнкодером внизу этого вопроса).

В моем случае изображения NOK для новинки очень редки, но необходимы для обучения. Цель состоит в том, чтобы генерировать изображения NOK из изображений OK (все примеры, которые я нашел, делали наоборот). Идея состоит в том, чтобы заставить изучение структуры OK-изображения в элементах [0: nx] и изучение структуры NOK-изображения (возможно, из похожего продукта) в элементах [nx: n], чтобы использовать функции NOK в качестве параметров для генерации NOK. -картины из ОК-картинок.

Мне пришло в голову две идеи использования неслучайного отсева

(1) keras.layers.Dropout(rate, noise_shape=None, seed=None) имеет аргумент noise_shape, но я не уверен, поможет ли он мне, поскольку он описывает только форму , Было бы идеально иметь возможность предоставить маску, состоящую из {0,1}, для применения на слое, чтобы включить / выключить указанные c узлы

(2), создающие пользовательский слой (с именем MaskLayer (ниже), который выполняет маскирование указанных c узлов слоя, например, как кортеж {0,1}.

Я прочитал this , но я не думаю, что это применимо ( создать слой, объединяя слои, которые могут быть заморожены отдельно).

def autoEncGenerate0( imgSizeX=28, imgSizeY=28, imgDepth=1):  ####:
    ''' keras blog autoencoder'''
    input_img = Input(shape=(imgSizeX, imgSizeY, imgDepth)) 
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
    x = MaxPooling2D((4, 4), padding='same')(x)
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
    encoded0 = MaxPooling2D((8, 8), padding='same', name="FEATURES")(x) 
    encoded1 = MaskLayer(mask)(encoded0) # TO BE DONE (B2) masking layer parts
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(encoded1)
    x = UpSampling2D((8, 8))(x)
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
    x = UpSampling2D((4, 4))(x)
    decoded = Conv2D( imgDepth, (3, 3), activation='sigmoid', padding='same')(x)
    autoencoder = Model(input_img, decoded)
    autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
    return( autoencoder)

Спасибо за подсказки.

1 Ответ

0 голосов
/ 22 апреля 2020

У каждого экземпляра tf.keras.layer.Layer есть атрибут trainable, который запрещает обучение переменных этого слоя. UpSampling2D не имеет переменных, поэтому вы НЕ МОЖЕТЕ обучать его. Вам нужно обучить переменные сверточного слоя, который предшествует этому слою с повышающей дискретизацией.

Вы можете сделать это следующим образом:

# define architecture here
autoencoder = Model(input_img, decoded)
layers_names = [l.name for l in autoencoder.layers]
trainable_layer_index = layers_names.index('FEATURES') - 1
for i in range(len(autoencoder.layers)):
    if i != trainable_layer_index:
        autoencoder.layers[i].trainable = False
# compile here

Обратите внимание, что вы компилируете модель ПОСЛЕ того, как вы установили слои к обучаемым / не обучаемым.

...