我正在构建一个自动编码器。我在谷歌上读到,编码器压缩数据,比如将784个维度转换为100个隐藏的瓶颈神经元,然后解码器将100个维度再次转换为784,我想知道它(解码器(是如何从低维转换到高维的,因为如果我们谈论编码器,它可以通过消除一些冗余比特来减少比特数量,并选择应该丢弃哪些特征以及哪些方面可以相关。但是,低维如何再次转换为高维,要么是通过再次添加我们在编码器中丢弃的比特,要么是其他方式。请详细说明
这种混淆似乎源于假设编码器和解码器是独立的过程,在学习过程中单独训练——事实并非如此。模型学习一起编码和解码。这就是为什么自动编码器中的损失函数L(x,x(是自动编码器输入(原始样本x(和输出(重建样本x(的函数。更多详细信息可以在这里找到。当然,一旦训练了模型,就可以分别使用每个模型进行编码或解码。
自动编码器-解码器部分如何工作
事实上,经典的MNIST自动编码器接收大小为28x28(784像素(的数字图像,我们可以用类似python的定义一个
import tensorflow as tf
encoder = tf.keras.models.Sequential([
tf.keras.layers.InputLayer((28,28)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(100, activation='sigmoid')
])
encoder = tf.keras.models.Sequential([
tf.keras.layers.InputLayer(input_shape=(100,)),
tf.keras.layers.Dense(784),
tf.keras.layers.Reshape((28,28)),
])
autoencoder = tf.keras.models.Sequential([
encoder,
decoder
])
这不是最好的,但它符合我们的目的。现在假设输入不是MNIST手写数字,而是一张不包含或多个以下内容的图片:
- 左上角的加号
- 左下角的一个圆圈
- 右上角的斜线
- 右下角的正方形
并且每个项目不会与其他项目重叠并且始终相同。如果给我这个encode,我会把每个图像变成布尔";编码";4个数据点中的每个特征的真/假。如果我被要求制作一个解码器,读取编码并正确地重新创建原始图像,那就没问题了。我会绘制或不绘制每个字形,这取决于在我的编码中该特征是真是假。
我们上面的自动编码器可以适合/训练做的事情非常相似。它将使用编码器部分对图片中存在的最常用和可重复使用的结构和模式进行编码。解码器将用于获取每个特征,并有条件地将像素写入输出图像。
在我们上面的示例decoder
中,它具有致密的(784(层。对于形状为100x784的总内部权重矩阵,该层具有100个输入和784个输出。这意味着对于每个嵌入层值,它可以修改输出图像的部分、全部或全部像素。这个玩具网络实际上在加号/圆圈/斜线/正方形问题上会做得很好,因为解码器可以使用每个特征将重要信息(原始图像的整个复制(写入输出。
权重矩阵为100x784的out解码器的另一种思考方式是,它已经存储了整个784输出图像的100个完整变体。