去除器

用于去除图像噪声的卷积自编码器

发布时间:2024/9/22 12:58:11   
全国治白癜风最好医院 http://www.znlvye.com/

我们使用一个全连接的网络作为工作的编码器和解码器。但是我们知道,对于图像,卷积网络可以得到更好的结果,因此在本节中,我们将使用卷积网络实现编码器和解码器。

为了获得更好的结果,我们将在编码器和解码器网络中使用多个卷积层。也就是说,我们将生成卷积层(以及最大池化层或上采样层)的堆栈。我们还将把整个自编码器训练为一个实体。

我们读取数据并对其进行预处理。同样,你可能会发现与之前的代码略有不同,特别是我们添加噪声并将其限制在0~1范围内的方式与之前有所不同。这样做是因为在这种情况下,我们将使用二值交叉熵损失,而不使用均方误差损失,而且解码器的最终输出将通过sigmoid激活,并将其范围限制在0~1之间。

定义编码器。编码器由三个卷积层组成,每个卷积层后都有一个最大池化层。因为我们使用的是MNIST数据集,所以输入图像的形状为28×28(单通道),输出图像的大小为4×4(因为最后一个卷积层有16个滤波器,所以图像有16个通道)。

定义解码器。这与编码器的设计完全相反,我们使用上采样增加图像的大小,而不使用最大池化。注意带注释的打印语句,你可以使用这些带注释的打印语句了解每一步之后形状是如何变化的。还要注意,编码器和解码器仍然是基于TensorFlowKerasLayers类的类,但是现在它们内部有多个层。

在这个示例中,我们将构建并训练一个基于LSTM的自编码器,为Reuters-语料库中的文档生成句子向量。我们已经在第7章中看到了如何使用词嵌入表示一个单词,以创建向量在其他单词的上下文中表示这个单词的含义。在这里,我们将看到如何为句子构建类似的向量。句子是单词序列,因此句子向量表示句子的含义。

构建句子向量最简单的方法是把词向量相加再除以单词数。但是,这会把句子当作一个词袋,并没有考虑单词的顺序。因此,在这种情况下,句子“Thedogbittheman”和“Themanbitthedog”是一样的。LSTM旨在处理序列输入,并且考虑单词的顺序,从而提供更好、更自然的句子表示。基于该信息,我们为LSTM模型设置以下常量。

我们为VOCAB_SIZE选择,即我们的词表包含最常用的个单词,涵盖语料库中超过93%以上的单词。把其余的单词视为未定义词,并用token替换。在预测时,模型没有识别的所有单词都将分配给tokenUNK。SEQUENCE_LEN设置为训练集中句子长度中值的两倍,实际上,在1.31亿个句子中,大约有1.1亿个句子都比这个设置短。

比SEQUENCE_LENGTH短的句子都将用一个特殊的PAD字符填充,截断那些较长的句子以满足限制:因为LSTM的输入是数字,所以我们需要构建查找表,在单词和单词ID之间来回切换。由于把词汇量限制为个,并且必须添加两个伪词PAD和UNK,所以我们的查找表包含了最常见的个单词和PAD与UNK的条目:网络的输入是一个单词序列,其中每个单词都用一个向量表示。

简单地说,我们可以对每个单词使用一个独热编码,但是这会使输入数据非常大。因此,我们使用50维的GloVe嵌入来编码每个单词。嵌入生成的矩阵形状为(VOCAB_SIZE,EMBED_SIZE),其中每一行代表词表中一个单词的GloVe嵌入。分别用零和随机统一值填充PAD和UNK行(分别为0和1):因为我们输入的是一个嵌入矩阵,所以输出也是一个词嵌入矩阵。

因为嵌入空间是连续的,而我们的词表是离散的,所以不是每个输出嵌入都对应一个单词。我们能做的最好的事情就是找到一个最接近输出嵌入的单词,重构原始文本。这有点麻烦,所以我们将使用不同的方式评估我们的自编码器。



转载请注明:http://www.aideyishus.com/lkcf/7633.html
------分隔线----------------------------