Machine learning 在自动编码器中,解码器如何将低维转换为高维?

Machine learning 在自动编码器中,解码器如何将低维转换为高维?,machine-learning,keras,deep-learning,artificial-intelligence,autoencoder,Machine Learning,Keras,Deep Learning,Artificial Intelligence,Autoencoder,我正在建造一个自动编码器。我在谷歌上读到编码器压缩数据,比如将784个维度转换为100个隐藏的瓶颈神经元,然后解码器再次将100个维度转换为784,我想知道它是如何实现的(解码器)从低维转换到高维,因为如果我们谈论编码器,它可能会通过消除一些冗余位来减少位数,并选择应该丢弃哪些功能以及哪些方面可能相关。但低维如何再次转换为高维,要么是通过再次添加我们在编码器中丢弃的位,要么是通过其他方式。请详细说明这种混淆似乎源于假设编码器和解码器是独立的过程,在学习过程中分别接受培训,而不是。模型学习一起编码

我正在建造一个自动编码器。我在谷歌上读到编码器压缩数据,比如将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手写数字,而是一张不包含或包含以下内容的图片:

  • 左上角有一个加号
  • 左下角的一个圆圈
  • 右上角的斜线
  • 右下角的正方形
每一项都不重叠,而且总是一样的。如果我被赋予编码,我会将每个图像转换为4个数据点的布尔“编码”,每个特征都是真/假。如果我被要求制作一个解码器来读取编码并正确地重新创建原始图像,那么再也没有问题了。我将绘制或不绘制每个glyph,这取决于编码中的特征是真是假

我们上面的自动编码器可以适应/训练做的事情非常相似。它将使用编码器部分对图片中最常用和可重用的结构和模式进行编码。解码器将用于获取每个特征,并有条件地将像素写入输出图像

在上面的示例
解码器
中,它有一个密集的(784)层。对于100x784形状的总内部权重矩阵,该层有100个输入和784个输出。这意味着对于每个嵌入层值,它可以修改输出图像的部分、无或所有像素。这个玩具网络在加号/圆/斜线/平方问题上确实会做得很好,因为解码器可以使用每个功能将重要信息(原始图像的整个复制)写入输出


另一种考虑权重矩阵为100x784的out解码器的方法是,它存储了整个784输出图像的100个完整变化。

其思想是,由于图像的像素不是相互独立的,因此原始图像的有效维数通常低于784。例如,想象一个极端情况,所有图像在白色背景上都有一条黑色水平线。然后图像可以用一个数字(线的高度)表示,即尺寸为一。自动编码器以更复杂的方式实现同样的功能,但它将以像素数而不是线的高度给出输出。