我想只使用层的特定部分来训练自动编码器(这个问题底部的自动编码器示例中名为FEATURES的层(。
就我而言,新产品的NOK图片非常罕见,但需要进行培训。目的是从OK图片生成NOK图片(我发现的所有例子都相反(。其思想是强制学习特征[0:n-x]中的OK图片结构和特征[n-x:n]中的NOK图片结构(可能来自类似的乘积(,以便使用NOK特征作为参数来从OK图片生成NOK图片。
使用非随机丢弃,我想到了两个想法
(1)
keras.layers.Dropout(rate, noise_shape=None, seed=None)
有noise_shape参数,但我不确定它是否对我有帮助,因为它只描述形状。能够提供由{0,1}组成的掩模以应用于层上以打开/关闭特定节点将是完美的
(2)
创建自定义层(下面命名为MaskLayer(,该自定义层执行对层的特定节点的屏蔽,例如作为{0,1}的元组。
我读过这篇文章,但我认为它不适用(通过连接可以单独冻结的层来生成层(。
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)
谢谢你的提示。
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
请注意,在将图层设置为可训练/不可训练后编译模型。