Keras中的特定辍学

时间:2020-04-22 17:22:03

标签: python tensorflow keras tensorflow2.0 autoencoder

我想通过仅使用层的特定PARTS来训练自动编码器(在该问题底部的自动编码器示例中名为FEATURES的层)。

就我而言,新产品的NOK图片很少见,但需要培训。目的是从OK图片生成NOK图片(我发现的所有示例都相反)。这个想法是要强制在features [0:nx]中学习OK图片结构,并在features [nx:n]中学习NOK图片结构(可能来自类似产品),以便使用NOK特征作为参数来生成NOK -图片来自OK图片。

通过非随机辍学,我想到了两个想法

(1) keras.layers.Dropout(rate, noise_shape=None, seed=None)具有noise_shape参数,但是由于它仅描述形状,因此我不确定它是否对我有帮助。能够提供由{0,1}组成的掩码以应用在该层上以打开/关闭特定节点

(2)创建一个自定义图层(以下称为MaskLayer),该图层执行屏蔽该图层的特定节点,例如作为{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 :(得分:0)

trainable的每个实例都具有tf.keras.layer.Layer属性,该属性会禁用该层变量的训练。 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

请注意,在将图层设置为可训练/不可训练之后,您将编译模型。