该示例创建了一个编码器模型、一个解码器模型,并在两个调用中将它们链接,以获得自动编码器模型:
编码器模型:
将输入源数据进行压缩编码,一定程度上可以去除输入数据的噪音,最大程度上保留图像的原始特征
解码器模型:
将编码器编码压缩后的数据按照一定策略进行解压,也就是解码,将压缩后的数据还原成原始的数据,但是经过这样一个操作后,输出和原始数据肯定是会有损失的,所以像图像填充、音频去噪就是按照这个原理实现的,保留原始数据最重要的特征,取出掉数据中的噪音。
完整代码:
"""
* Created with PyCharm
* 作者: 阿光
* 日期: 2022/1/2
* 时间: 12:16
* 描述:
"""
from keras import Model
from tensorflow import keras
from tensorflow.keras.layers import *
encoder_input = Input(shape=(28, 28, 1), name='img')
x = Conv2D(16, 3, activation='relu')(encoder_input)
x = Conv2D(32, 3, activation='relu')(x)
x = MaxPooling2D(3)(x)
x = Conv2D(32, 3, activation='relu')(x)
x = Conv2D(16, 3, activation='relu')(x)
encoder_output = GlobalMaxPooling2D()(x)
encoder = Model(encoder_input, encoder_output, name='encoder')
encoder.summary()
decoder_input = Input(shape=(16,))
x = Reshape((4, 4, 1))(encoder_output)
x = Conv2DTranspose(16, 3, activation='relu')(x)
x = Conv2DTranspose(32, 3, activation='relu')(x)
x = UpSampling2D(3)(x)
x = Conv2DTranspose(16, 3, activation='relu')(x)
decoder_output = Conv2DTranspose(1, 3, activation='relu')(x)
decoder = Model(encoder_input, decoder_output, name='decoder')
decoder.summary()
auto_encoder = Model(encoder_input, decoder_output, name='autoencoder')
auto_encoder.summary()
keras.utils.plot_model(auto_encoder, "auto_encoder.png", show_shapes=True)