自动编码器 - 解码器部分是如何工作的?
确实,经典的 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 中,它有一个dense(784) 层。该层有 100 个输入和 784 个输出,用于形状为 100x784 的总内部权重矩阵。这意味着对于每个嵌入层值,它可以修改输出图像的部分、无或全部像素。这个玩具网络实际上会在加/圆/斜线/正方形问题上表现出色,因为解码器可以使用每个特征将重要信息(原始图像的完整再现)写入输出。
另一种考虑权重矩阵为 100x784 的解码器的方式是,它已经记住了整个 784 输出图像的 100 个完整变体。