How to Generate Images using Autoencoders

你知道什么会很酷吗?如果我们不需要所有那些标记数据来训练我们的模型。我的意思是标记和分类数据需要太多的工作。不幸的是,从支持向量机到卷积神经网络的大多数现有模型如果没有它们就无法进行训练。

除了一小组算法,他们可以。好奇?这就是所谓的无监督学习。无监督学习通过自己的无标签数据推断出一个函数。最着名的无监督算法是K-Means,它已被广泛用于将数据聚类成组和PCA,这是降维的解决方案。 K-Means和PCA可能是有史以来最好的两种机器学习算法。让他们变得更好的是他们的简单。我的意思是,如果你掌握它们,你就会像:“我为什么不早点想到它?”

我们想到的下一个问题是:“是否存在无监督的神经网络? “。你可能知道帖子标题的答案。自动编码。

为了更好地理解自动编码器,我将在解释的同时提供一些代码。请注意,我们将使用Pytorch来构建和训练我们的模型。

import torch
from torch import nn, optim
from torch.autograd import Variable
from torch.nn import functional as F

自动编码器是简单的神经网络,它们的输出是它们的输入。 就那么简单。 他们的目标是学习如何重建输入数据。 但它有什么用呢? 诀窍是他们的结构。 网络的第一部分就是我们所说的编码器。 它接收输入并将其编码在较低维度的潜在空间中。 第二部分(解码器)采用该向量并对其进行解码以生成原始输入。

中间的潜在向量是我们想要的,因为它是输入的压缩表示。应用程序非常丰富,例如:

  • 压缩

  • 降维

此外,很明显,我们可以应用它们来重现相同但有点不同甚至更好的数据。例如:

  • 数据去噪:用嘈杂的图像输入它们并训练它们输出相同的图像但没有噪声

  • 训练数据增加

  • 异常检测:在一个类上训练它们,以便每个异常都会产生很大的重建错误。

然而,自动编码器面临与大多数神经网络相同的几个问题。他们往往过度适应,他们遭受消失的梯度问题。有解决方案吗?变分自动编码器是一个非常好的和优雅的努力。它本质上增加了随机性但不完全相同。
让我们进一步解释一下。变分自动编码器经过训练,可以学习模拟输入数据的概率分布,而不是映射输入和输出的函数。然后,它从该分布中采样点并将它们馈送到解码器以生成新的输入数据样本。但是等一下。当我听说概率分布时,只有一件事物浮现在脑海中:贝叶斯。是的,贝叶斯规则再次成为主要原则。顺便说一句,我并不是夸大其词,但贝叶斯公式是有史以来最好的方程式。而且我不是在开玩笑。无处不在。如果您不知道是什么,请查阅。放弃那篇文章,了解贝叶斯是什么。我会原谅你的。

回到变分自动编码器。我认为以下图像清晰起来:


你有它。 随机神经网络。 在我们构建一个生成新图像的示例之前,讨论更多细节是合适的。

VAE的一个关键方面是损失功能。 最常见的是,它由两部分组成。 重建损失测量重建数据与原始数据的不同程度(例如二进制交叉熵)。 KL-分歧试图使过程正规化并使重建数据尽可能多样化。

def loss_function(recon_x, x, mu, logvar) -> Variable:BCE = F.binary_cross_entropy(recon_x, x.view(-1, 784))KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())KLD /= BATCH_SIZE * 784return BCE + KLD

另一个重要方面是如何训练模型。 难以发生,因为变量是注释确定性的,但随机和梯度下降通常不会那样工作。 为解决这个问题,我们使用重新参数化。 潜在向量(z)将等于我们分布的学习平均值(μ)加上学习的标准偏差(σ)乘以epsilon(ε),其中ε遵循正态分布。 我们重新参数化样本,使随机性与参数无关。

def reparameterize(self, mu: Variable, logvar: Variable) -> Variable:#mu :  mean matrix#logvar :  variance matrixif self.training: std = logvar.mul(0.5).exp_()  # type: Variableeps = Variable(std.data.new(std.size()).normal_())return eps.mul(std).add_(mu)else:return mu

在我们的示例中,我们将尝试使用变分自动编码器生成新图像。 我们将使用MNIST数据集,重建的图像将是手写的数字。 正如我已经告诉过你的那样,除了熟悉之外,我使用Pytorch作为框架,没有特别的原因。 首先,我们应该定义我们的图层。

def __init__(self):super(VAE, self).__init__()# ENCODERself.fc1 = nn.Linear(784, 400)self.relu = nn.ReLU()self.fc21 = nn.Linear(400, 20)  # mu layerself.fc22 = nn.Linear(400, 20)  # logvariance layer# DECODERself.fc3 = nn.Linear(20, 400)self.fc4 = nn.Linear(400, 784)self.sigmoid = nn.Sigmoid()

如您所见,我们将使用一个非常简单的网络,只有Dense(在pytorch的情况下为Linear)层。 下一步是构建运行编码器和解码器的功能。

def encode(self, x: Variable) -> (Variable, Variable):h1 = self.relu(self.fc1(x))  return self.fc21(h1), self.fc22(h1)def decode(self, z: Variable) -> Variable:h3 = self.relu(self.fc3(z))return self.sigmoid(self.fc4(h3))def forward(self, x: Variable) -> (Variable, Variable, Variable):mu, logvar = self.encode(x.view(-1, 784))z = self.reparameterize(mu, logvar)return self.decode(z), mu, logvar

它只是几行python代码。 没什么大不了。 最后,我们将训练我们的模型并查看生成的图像。

快速提醒:与tensorflow相比,Pytorch有一个动态图表,这意味着代码在运行中运行。 没有必要创建图形然后编译执行它,Tensorflow最近以其急切的执行模式引入了上述功能。

optimizer = optim.Adam(model.parameters(), lr=1e-3)def train(epoch):model.train()train_loss = 0for batch_idx, (data, _) in enumerate(train_loader):data = Variable(data)optimizer.zero_grad()recon_batch, mu, logvar = model(data)loss = loss_function(recon_batch, data, mu, logvar)loss.backward()train_loss += loss.data[0]optimizer.step()def test(epoch):model.eval()test_loss = 0for i, (data, _) in enumerate(test_loader):data = Variable(data, volatile=True)recon_batch, mu, logvar = model(data)test_loss += loss_function(recon_batch, data, mu, logvar).data[0]for epoch in range(1, EPOCHS + 1):train(epoch)test(epoch)

培训完成后,我们执行测试功能以检查模型的工作情况。 事实上,它做得非常好,构造的图像与原始图像完全相同,我相信没有人能够在不知道整个故事的情况下将它们区分开来。

下图显示了第一行中的原始照片和第二行中的原始照片。

相当不错,不是吗?

在我们结束这篇文章之前,我想再介绍一个主题。 如我们所见,变分自动编码器能够生成新图像。 这是生成模型的经典行为。 生成模型正在生成新数据。 另一方面,判别模型是对类或类别中的现有数据进行分类或区分。

用一些数学术语来解释:生成模型学习联合概率分布p(x,y),而判别模型学习条件概率分布p(y | x)。

在我看来,生成模型更有趣,因为它们为从数据增加到模拟未来可能状态的众多可能性打开了大门。 但更多关于下一篇文章的内容。 关于一种称为生成性对抗性网络的相对较新的生成模型的帖子。

在那之前,继续学习AI。

如何使用自动编码器生成图像相关推荐

  1. 开源人工智能使用卷积网格自动编码器生成3D面部

    开源人工智能使用卷积网格自动编码器生成3D面部摘要:人脸的学习3D表示对于计算机视觉问题是有用的,例如3D面部跟踪和从图像重建,以及诸如角色生成和动画的图形应用.传统模型使用线性子空间或高阶张量概括来 ...

  2. 文本生成图像简述4——扩散模型、自回归模型、生成对抗网络的对比调研

    基于近年来图像处理和语言理解方面的技术突破,融合图像和文本处理的多模态任务获得了广泛的关注并取得了显著成功. 文本生成图像(text-to-image)是图像和文本处理的多模态任务的一项子任务,其根据 ...

  3. 自动编码器重建图像及Python实现

    自动编码器简介 自动编码器(一下简称AE)属于生成模型的一种,目前主流的生成模型有AE及其变种和生成对抗网络(GANs)及其变种.随着深度学习的出现,AE可以通过网络层堆叠形成深度自动编码器来实现数据 ...

  4. 无需成对示例、无监督训练,CycleGAN生成图像简直不要太简单

    作者 |  Jason Brownlee 译者 |  Freesia,Rachel 编辑 |  夕颜 出品 | AI科技大本营(ID: rgznai100) [导读]图像到图像的转换技术一般需要大量的 ...

  5. 学术 | 一种新的CNN网络可以更高效地区分自然图像生成图像

    作者 | Weize Quan , Kai Wang, Dong-Ming Yan , Xiaopeng Zhang 译者 | linstancy 编辑 | Jane 出品 | AI 科技大本营 [导 ...

  6. 字节最新文本生成图像AI,训练集里居然没有一张带文字描述的图片?!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 丰色 发自 凹非寺 量子位 | 公众号 QbitAI 一个文本-图像 ...

  7. 缩小规模,OpenAI文本生成图像新模型GLIDE用35亿参数媲美DALL-E

    视学算法报道 编辑:陈萍.小舟 模型的参数规模并不需要那么大. 从年初 OpenAI 刷屏社区的 DALL-E 到英伟达生成逼真摄影的 GauGAN2,文本生成图像可谓是今年大火的一个研究方向.现在 ...

  8. 引燃AI社区,不用跨界也能从文本生成图像,OpenAI新模型打破自然语言与视觉次元壁...

    视学算法报道 作者:魔王.杜伟.蛋酱 艺术创作的事,以后人类只要动手打几个字,其他的交给 AI 就行了. 自然语言与视觉的次元壁正在被打破.这不,OpenAI 最近连发大招,提出两个连接文本与图像的神 ...

  9. TensorFlow练习27: 验证码生成器-从文本生成图像

    前文<TensorFlow练习20: 使用深度学习破解字符验证码>是一个基于CNN的识别验证码练习,也就是根据图像预测文本.本帖就来个大反转,即从文本合成图像,看看能不能用深度学习练一个验 ...

最新文章

  1. R语言使用moments包计算偏度(Skewness)和峰度(Kurtosis)实战:计算偏度(Skewness)和峰度(Kurtosis)、确定样本数据是否具有与正态分布匹配的偏度和峰度(假设检验)
  2. 瑞星:ATM出现漏洞 银行:哪有这回事?
  3. python游戏脚本实例-基于Python实现的扫雷游戏实例代码
  4. python list 去重_Python中对列表list去重
  5. krc 编辑 linux,Linux网络编程
  6. Cable--新虚拟网络架构介绍
  7. c++ vector排序_个性化推荐系统源代码之基于LR模型的推荐系统离线排序方案
  8. 风口上的TikTok?
  9. 关于postgre中的pg_hba.conf 文件
  10. 运动目标跟踪(十八)--阶段性总结
  11. Ubuntu下安装的qq的下载文件地址
  12. 金融风控实战——金融风控与反欺诈业务详解
  13. div背景 css网格背景_如何为背景图像网格创建运动悬停效果
  14. dedecms友情链接字数修改
  15. java电子配件公司仓库管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  16. Linux 删除文件夹及所有目录
  17. 在docker下安装运行vue
  18. hydra海德拉 and Medusa美杜莎简单使用教程
  19. 计算机二级2017试题及答案,2017计算机二级VF试题及答案
  20. 教育新痛点:父母有手机依赖行为,其子女手机依赖的比例几乎翻倍

热门文章

  1. RedHat Linux口令恢复任我行(转)
  2. Windows11 win11提示这台电脑不符合安装此版本的Windows所需的最低系统要求怎么解决?
  3. 经济学计算机会成本,经济学思维方式之二——机会成本、经济利润
  4. [量子计算]日常生活中一些量子世界相关的概念
  5. TypeScript保存代码时自动编译并运行
  6. 超级简单java企业人力资源管理系统设计与实现.rar(论文+程序源码+ppt答辩)
  7. 盗版软件中国肆虐,微软/Adobe不能承受之痛
  8. 计算机基础知识试题题库
  9. mysql distinct 去掉查询结果重复记录 可用于多张表连接查询
  10. 智能驾驶车辆横向控制算法