首页 文章

从训练有素的自动编码器中提取编码器和解码器

提问于
浏览
0

我想将自动编码器学习和应用分成https://blog.keras.io/building-autoencoders-in-keras.html之后的两个部分,并使用fashion-mnist数据进行测试:

  • 加载图像,进行可能需要几个小时或几天的拟合并使用回调来保存最佳的自动编码器模型 . 这个过程可能在下一部分之前几周 .

  • 使用此最佳模型(由文件名手动选择)并绘制原始图像,由自动编码器的编码器进行的编码表示以及使用自动编码器的解码器进行的预测 . 我有问题(见第二步)从训练和保存的自动编码器中提取编码器和解码器层 .

对于 step one 我有如下非常简单的网络:

input_img = Input(shape=(784,))
# encoded representation
encoded = Dense(encoding_dim, activation='relu')(input_img)
# lossy reconstruction
decoded = Dense(784, activation='sigmoid')(encoded)

# full AE model: map an input to its reconstruction
autoencoder = Model(input_img, decoded)

# encoder: map an input to its encoded representation
encoder = Model(input_img, encoded)
# placeholder for an encoded input
encoded_input = Input(shape=(encoding_dim,))
# last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]
# decoder
decoder = Model(encoded_input, decoder_layer(encoded_input))

网络是:

autoencoder.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_5 (InputLayer)         (None, 784)               0         
_________________________________________________________________
dense_5 (Dense)              (None, 32)                25120     
_________________________________________________________________
dense_6 (Dense)              (None, 784)               25872     
=================================================================

encoder.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_5 (InputLayer)         (None, 784)               0         
_________________________________________________________________
dense_5 (Dense)              (None, 32)                25120     
=================================================================

所以我训练模型并通过 autoencoder.save('fashion-autoencoder.hdf5') 保存 . 在我的实例中,我使用回调保存它,因此通过保存编码器和解码器的解决方案似乎不是一个真正的解决方案 . 后来我加载了图像(未显示)并做了类似的预测

# encode and decode some images from test set
encoded_imgs = encoder.predict(x_test)
decoded_imgs = decoder.predict(encoded_imgs)
# test the shape
print(encoded_imgs[0].shape)

并获得 (32,0) 的形状 .

所以,让我去两个 step 2 哪里有我的问题 . 我使用加载模型

encoder= K.models.load_model('fashion-autoencoder.hdf5')
# delete the last layers to get the encoder
encoder.layers.pop()
encoder.summary() # show model data

并且编码器看起来与第一步中的原始编码器相同,这让我觉得提取效果很好:

Layer (type)                 Output Shape              Param #   
=================================================================
input_5 (InputLayer)         (None, 784)               0         
_________________________________________________________________
dense_5 (Dense)              (None, 32)                25120     
=================================================================
Total params: 50,992
Trainable params: 50,992
Non-trainable params: 0

但我也得到了警告

training.py:478: UserWarning: Discrepancy between trainable weights and collected trainable weights, did you set `model.trainable` without calling `model.compile` after ?
'Discrepancy between trainable weights and collected trainable'

我以某种方式理解,但不知道它有多重要 . 然后我再次加载图像(未显示)并使用编码器

encoded_imgs = encoder.predict(x_test)

# test the shape
print(encoded_imgs[0].shape)

(784,) 形状不对 .

因此,我对编码器的提取不起作用,因为尺寸不正确 . 我甚至没有成功提取解码器(形成保存自动编码器),因为我不能使用 push() 并尝试像 decoder = decoder.layers[-1:-2] 这样的东西,但它没有用 .

所以,我的一般问题是如何提取加载模型的部分 .

1 回答

  • 1

    由于您使用功能API来创建自动编码器,因此重建编码器和解码器的最佳方法是再次使用功能API和 Model 类:

    autoencoder= K.models.load_model('fashion-autoencoder.hdf5')
    
    encoder = Model(autoencoder.input, autoencoder.layers[-2].output)
    
    decoder_input = Input(shape=(encoding_dim,))
    decoder = Model(decoder_input, autoencoder.layers[-1](decoder_input))
    
    encoder.summary()
    decoder.summary()
    

    模型摘要:

    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_4 (InputLayer)         (None, 784)               0         
    _________________________________________________________________
    dense_3 (Dense)              (None, 32)                25120     
    =================================================================
    Total params: 25,120
    Trainable params: 25,120
    Non-trainable params: 0
    _________________________________________________________________
    
    
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_6 (InputLayer)         (None, 32)                0         
    _________________________________________________________________
    dense_4 (Dense)              (None, 784)               25872     
    =================================================================
    Total params: 25,872
    Trainable params: 25,872
    Non-trainable params: 0
    _________________________________________________________________
    

    涉及 pop() 属性does not work since you need to update some of the internal attributes of the modelpop() 解决方案 . 虽然,对于顺序模型,已经实现了内置的pop()方法 .

相关问题