0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用TensorFlow构建和训练变分自动编码器

科技观察员 来源:allaboutcircuits 作者:亨利·安萨·福特久 2022-05-05 16:57 次阅读

多年来,我们已经看到许多领域和行业利用人工智能AI) 的力量来推动研究的边界。数据压缩和重建也不例外,人工智能的应用可以用来构建更强大的系统。

在本文中,我们将研究一个非常流行的 AI 用例,用于压缩数据并使用自动编码器重建压缩数据。

自动编码器应用

自动编码器在机器学习领域引起了许多人的关注,这一事实通过自动编码器的改进和几种变体的发明变得显而易见。他们在神经机器翻译、药物发现、图像去噪等几个领域取得了一些有希望的(如果不是最先进的)结果。

自动编码器的组成部分

与大多数神经网络一样,自编码器通过反向传播梯度来优化一组权重——但自编码器架构与大多数神经网络架构之间最显着的区别是瓶颈。这个瓶颈是将我们的数据压缩成较低维度的表示的一种手段。自编码器的另外两个重要部分是编码器和解码器。

将这三个组件融合在一起形成了一个“香草”自动编码器,尽管更复杂的自动编码器可能有一些额外的组件。

让我们分别看一下这些组件。

编码器

这是数据压缩和重建的第一阶段,它实际上负责数据压缩阶段。编码器是一个前馈神经网络,它接收数据特征(例如图像压缩中的像素)并输出一个大小小于数据特征大小的潜在向量。

pYYBAGJzkXeABRf5AAG0JpivaWg198.png

为了使数据的重建具有鲁棒性,编码器在训练期间优化其权重,以将输入数据表示的最重要特征压缩到小型潜在向量中。这确保了解码器有足够的关于输入数据的信息来以最小的损失重建数据。

潜在向量(瓶颈)

自编码器的瓶颈或潜在向量分量是最关键的部分——当我们需要选择它的大小时,它变得更加关键。

编码器的输出为我们提供了潜在向量,并且应该包含我们输入数据的最重要的特征表示。它还用作解码器部分的输入,并将有用的表示传播到解码器进行重建。

为潜在向量选择更小的尺寸意味着我们可以用更少的输入数据信息来表示输入数据特征。选择更大的潜在向量大小会淡化使用自动编码器进行压缩的整个想法,并且还会增加计算成本。

解码器

这个阶段结束了我们的数据压缩和重建过程。就像编码器一样,这个组件也是一个前馈神经网络,但它在结构上看起来与编码器有点不同。这种差异来自这样一个事实,即解码器将一个比解码器输出更小的潜在向量作为输入。

解码器的功能是从与输入非常接近的潜在向量生成输出。

poYBAGJzkXiAIBTBAADc_yeQMFI477.png

训练自动编码器

通常,在训练自动编码器时,我们将这些组件一起构建,而不是独立构建。我们使用梯度下降或 ADAM 优化器等优化算法对它们进行端到端训练。

损失函数

值得讨论的自动编码器训练过程的一部分是损失函数。数据重建是一项生成任务,与其他机器学习任务不同,我们的目标是最大化预测正确类别的概率,我们驱动我们的网络产生接近输入的输出。

我们可以通过几个损失函数来实现这个目标,例如 l1、l2、均方误差等。这些损失函数的共同点是它们测量输入和输出之间的差异(即多远或相同),使它们中的任何一个成为合适的选择。

自动编码器网络

一直以来,我们一直在使用多层感知器来设计我们的编码器和解码器——但事实证明,我们可以使用更专业的框架,例如卷积神经网络 (CNN) 来捕获更多关于输入数据的空间信息图像数据压缩的情况。

令人惊讶的是,研究表明,用作文本数据自动编码器的循环网络工作得非常好,但我们不打算在本文的范围内进行讨论。多层感知器中使用的编码器-潜在向量-解码器的概念仍然适用于卷积自动编码器。唯一的区别是我们设计了带有卷积层的解码器和编码器。

所有这些自动编码器网络都可以很好地完成压缩任务,但存在一个问题。

我们讨论过的网络创造力为零。我所说的零创造力的意思是他们只能产生他们已经看到或接受过培训的输出。

我们可以通过稍微调整我们的架构设计来激发一定程度的创造力。结果被称为变分自动编码器。

pYYBAGJzkXqAFBwqAACkczHl8WU685.png

变分自编码器

变分自动编码器引入了两个主要的设计变化:

我们没有将输入转换为潜在编码,而是输出两个参数向量:均值和方差。

一个称为 KL 散度损失的附加损失项被添加到初始损失函数中。

变分自动编码器背后的想法是,我们希望我们的解码器使用从由编码器生成的均值向量和方差向量参数化的分布中采样的潜在向量来重建我们的数据。

从分布中采样特征给解码器一个受控的空间来生成。在训练变分自动编码器后,每当我们对输入数据执行前向传递时,编码器都会生成一个均值和方差向量,负责确定从哪个分布中对潜在向量进行采样。

平均向量决定了输入数据的编码应该集中在哪里,方差决定了我们想要从中选择编码以生成真实输出的径向空间或圆。这意味着,对于相同输入数据的每次前向传递,我们的变分自动编码器可以生成以均值向量为中心和方差空间内的不同输出变体。

相比之下,在查看标准自动编码器时,当我们尝试生成网络尚未训练的输出时,由于编码器产生的潜在向量空间的不连续性,它会生成不切实际的输出。

poYBAGJzkXuAT7IuAADf6jhOFU4891.png

现在我们对变分自动编码器有了一个直观的了解,让我们看看如何在 TensorFlow 中构建一个。

用于变分自动编码器的 TensorFlow 代码

我们将从准备好数据集开始我们的示例。为简单起见,我们将使用 MNIST 数据集。

(train_images, _), (test_images, _) = tf.keras.datasets.mnist.load_data()

train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype(‘float32’)

test_images = test_images.reshape(test_images.shape[0], 28, 28, 1).astype(‘float32’)

# Normalizing the images to the range of [0., 1.]

train_images /= 255.

test_images /= 255.

# Binarization

train_images[train_images 》= .5] = 1.

train_images[train_images 《 .5] = 0.

test_images[test_images 》= .5] = 1.

test_images[test_images 《 .5] = 0.

TRAIN_BUF = 60000

BATCH_SIZE = 100

TEST_BUF = 10000

train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(TRAIN_BUF).batch(BATCH_SIZE)

test_dataset = tf.data.Dataset.from_tensor_slices(test_images).shuffle(TEST_BUF).batch(BATCH_SIZE)

Obtain dataset and prepare it for the task.

class CVAE(tf.keras.Model):

def __init__(self, latent_dim):

super(CVAE, self).__init__()

self.latent_dim = latent_dim

self.inference_net = tf.keras.Sequential(

tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),

tf.keras.layers.Conv2D(

filters=32, kernel_size=3, strides=(2, 2), activation=‘relu’),

tf.keras.layers.Conv2D(

filters=64, kernel_size=3, strides=(2, 2), activation=‘relu’),

tf.keras.layers.Flatten(),

# No activation

tf.keras.layers.Dense(latent_dim + latent_dim),

self.generative_net = tf.keras.Sequential(

tf.keras.layers.InputLayer(input_shape=(latent_dim,)),

tf.keras.layers.Dense(units=7*7*32, activation=tf.nn.relu),

tf.keras.layers.Reshape(target_shape=(7, 7, 32)),

tf.keras.layers.Conv2DTranspose(

filters=64,

kernel_size=3,

strides=(2, 2),

padding=“SAME”,

activation=‘relu’),

tf.keras.layers.Conv2DTranspose(

filters=32,

kernel_size=3,

strides=(2, 2),

padding=“SAME”,

activation=‘relu’),

# No activation

tf.keras.layers.Conv2DTranspose(

filters=1, kernel_size=3, strides=(1, 1), padding=“SAME”),

@tf.function

def sample(self, eps=None):

if eps is None:

eps = tf.random.normal(shape=(100, self.latent_dim))

return self.decode(eps, apply_sigmoid=True)

def encode(self, x):

mean, logvar = tf.split(self.inference_net(x), num_or_size_splits=2, axis=1)

return mean, logvar

def reparameterize(self, mean, logvar):

eps = tf.random.normal(shape=mean.shape)

return eps * tf.exp(logvar * .5) + mean

def decode(self, z, apply_sigmoid=False):

logits = self.generative_net(z)

if apply_sigmoid:

probs = tf.sigmoid(logits)

return probs

return logits

这两个代码片段准备了我们的数据集并构建了我们的变分自动编码器模型。在模型代码片段中,有几个辅助函数来执行编码、采样和解码。

计算梯度的重新参数化

有一个我们尚未讨论的重新参数化函数,但它解决了我们的变分自动编码器网络中的一个非常关键的问题。回想一下,在解码阶段,我们从由编码器生成的均值和方差向量控制的分布中对潜在向量编码进行采样。这在通过我们的网络前向传播数据时不会产生问题,但在从解码器到编码器的反向传播梯度时会导致一个大问题,因为采样操作是不可微的。

简单来说,我们无法从采样操作中计算梯度。

这个问题的一个很好的解决方法是应用重新参数化技巧。其工作原理是首先生成均值为 0 和方差为 1 的标准高斯分布,然后使用编码器生成的均值和方差对该分布执行可微加法和乘法运算。

请注意,我们在代码中将方差转换为对数空间。这是为了确保数值稳定性。引入了额外的损失项Kullback-Leibler 散度损失,以确保我们生成的分布尽可能接近均值为 0 方差为 1 的标准高斯分布。

将分布的均值驱动为零可确保我们生成的分布彼此非常接近,以防止分布之间的不连续性。接近 1 的方差意味着我们有一个更适中的(即,不是很大也不是很小)的空间来生成编码。

pYYBAGJzkXyAIO3EAABkdTBYcsI191.png

执行重新参数化技巧后,通过将方差向量与标准高斯分布相乘并将结果与​​均值向量相加得到的分布与均值和方差向量立即控制的分布非常相似。

构建变分自编码器的简单步骤

让我们通过总结构建变分自动编码器的步骤来结束本教程

构建编码器和解码器网络。

在编码器和解码器之间应用重新参数化技巧以允许反向传播。

端到端训练两个网络。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码器
    +关注

    关注

    45

    文章

    3651

    浏览量

    134840
  • tensorflow
    +关注

    关注

    13

    文章

    329

    浏览量

    60556
收藏 人收藏

    评论

    相关推荐

    [8.2]--8.2自动编码器

    深度学习
    jf_60701476
    发布于 :2022年12月01日 02:37:18

    新手 Protel 99SE 自动编码和电气规则问题

    跟着视频画的,到自动编码时出现这个问题,哪位大神帮忙
    发表于 03-12 22:36

    基于编码器的异常小区检测

    Decoder将z重构成原始输入。    图2 编码器处理过程示意图  VAE 的参数通过两个损失函数来进行训练:一个是重构损失(reconstruction loss),它迫使
    发表于 12-03 15:06

    稀疏边缘降噪自动编码器的方法

    为了提高自动编码器算法的学习精度,更进一步降低分类任务的分类错误率,提出一种组合稀疏自动编码器(SAE)和边缘降噪自动编码器(mDAE)从而形成稀疏边缘降噪自动编码器(SmDAE)的方
    发表于 12-21 14:41 3次下载
    稀疏边缘降噪<b class='flag-5'>自动编码器</b>的方法

    基于动态dropout的改进堆叠自动编码机方法

    自动编码机算法中;同时,根据传统dropout算法容易使部分节点长期处于熄火状态的缺陷,提出了一种动态dropout改进算法,使用动态函数将传统静态熄火率修改为随着迭代次数逐渐减小的动态熄火率;最后,利用动态dropout算法改进堆叠自动编码机的预
    发表于 12-26 14:37 0次下载
    基于动态dropout的改进堆叠<b class='flag-5'>自动编码</b>机方法

    自动编码器的社区发现算法

    准确.提出一种基于深度稀疏自动编码器的社区发现算法CoDDA(a community detection algorithm based on deep sparse autoencoder),尝试提高使用这些经典方法处理高维邻接矩阵进行社区发现的准确性.首先,提出基于跳数的处理方法,对稀疏的邻接矩
    发表于 01-02 18:32 0次下载
    <b class='flag-5'>自动编码器</b>的社区发现算法

    自动编码器与PCA的比较

    编码器虽然不像 PCA 那般在教科书上随处可见,但是在早期被拿来做深度网络的逐层预训练,其地位可见一斑。尽管在 ReLU、Dropout 等神器出现之后,人们不再使用 AutoEncoders 来
    发表于 06-11 15:37 5937次阅读

    稀疏自编码器TensorFlow实现详解

     稀疏自编码器(又称稀疏自动编码机)中,重构误差中添加了一个稀疏惩罚,用来限定任何时刻的隐藏层中并不是所有单元都被激活。如果 m 是输入模式的总数,那么可以定义一个参数 ρ_hat,用来表示每个隐藏层单元的行为(平均激活多少次)。
    发表于 06-11 16:45 3870次阅读
    稀疏自<b class='flag-5'>编码器</b>及<b class='flag-5'>TensorFlow</b>实现详解

    如何使用深度神经网络技术实现机器学习的全噪声自动编码器

    ,基于自动编码器的深度神经网络可以有效的用于数据特征提取。自动编码是一种无监督学习算法,稀疏自动编码器、降噪自动编码器、收缩自动编码器是在原
    发表于 12-11 15:44 7次下载
    如何使用深度神经网络技术实现机器学习的全噪声<b class='flag-5'>自动编码器</b>

    一种改进的基于半自动编码器的协同过滤推荐算法

    为高效利用推荐系统中用户和物品的交互历史和辅助信息,提出一种改进的协同过滤推荐算法。利用半自动编码器对用户和物品的辅助信息进行特征提取,将提取岀的特征映射到矩阵分解模型中,通过反向传播算法实现半自动编码器
    发表于 03-23 16:35 4次下载
    一种改进的基于半<b class='flag-5'>自动编码器</b>的协同过滤推荐算法

    一种混合自动编码器高斯混合模型MAGMM

    高维数据的无监督异常检测是机器学习的重要挑战之一。虽然先前基于单一深度自动编码器和密度估计的方法已经取得了显著的进展,但是其仅通过一个深度自编码器来生成低维表示,这表明没有足够的信息来执行后续
    发表于 04-13 15:33 7次下载
    一种混合<b class='flag-5'>自动编码器</b>高斯混合模型MAGMM

    一种基于编码器的人脸图像修复方法

    基于卷积神经网络的人脸图像修复技术在刑事侦破、文物保护及影视特效等领域有着重要的应用。但现有方法存在着图像修复结果不够清晰以及结果多样化不足等缺点,为此,提出了一种基于编码器的人脸图像修复
    发表于 04-21 10:51 10次下载
    一种基于<b class='flag-5'>变</b><b class='flag-5'>分</b>自<b class='flag-5'>编码器</b>的人脸图像修复方法

    堆叠降噪自动编码器(SDAE)

    自动编码器(Auto-Encoder,AE) 自编码器(autoencoder)是神经网络的一种,经过训练后能尝试将输入复制到输出。自编码器内部有一个隐藏层 h,可以产生
    的头像 发表于 01-11 17:04 6616次阅读
    堆叠降噪<b class='flag-5'>自动编码器</b>(SDAE)

    编码器好坏怎么判断,编码器原理

    编码器(Encoder)是将输入数据转化为特定编码表示的一种技术。对于不同类型的编码器,评判其好坏可以从多个方面进行考量,包括编码质量、速度、模型结构等。
    的头像 发表于 01-23 10:58 1940次阅读

    tensorflow简单的模型训练

    TensorFlow开始,然后介绍如何构建和训练一个简单的神经网络模型。 1. 安装TensorFlow 首先,我们需要安装TensorFlow
    的头像 发表于 07-05 09:38 732次阅读