【DL】深度生成模型

受限玻尔兹曼机(RBM)

DBN(深度置信网络,Deep Belief Networks)和RBM(受限玻尔兹曼机,Restricted Boltzmann Machines)是两种在深度学习早期非常重要的模型,尤其在深度学习兴起之前,它们在无监督特征学习和深度结构理解方面起到了关键作用。下面分别介绍这两种模型:

RBM是一种能量基模型,用于无监督学习。它由一个可见层和一个隐藏层组成,层内没有连接,层间的连接是全连接的,但没有方向,即层间的连接是双向的。RBM的目标是学习输入数据的概率分布。

  • 可见层:对应于输入数据的每个特征。
  • 隐藏层:捕获可见层单元之间复杂的交互。

RBM通过对比散度(Contrastive Divergence, CD)算法进行训练,该算法通过一系列的概率采样步骤来近似梯度下降,以最小化模型的重构误差。RBM可以被用来进行特征提取、降维、分类、协同过滤等任务。

深度置信网络(DBN)

DBN是一种由多个RBM层堆叠而成的深度网络结构。在DBN中,每一个RBM层的隐藏层都作为下一个RBM层的可见层。这种堆叠可以帮助网络学习数据在不同层次上的特征表示。

  • 预训练:DBN的训练通常包含两个阶段。第一个阶段是无监督的预训练,每个RBM层依次进行训练,每一层都在学习其输入的特征表示。
  • 微调:在预训练完成后,DBN会进行有监督的微调,通常使用反向传播算法来调整所有层的权重,以提高特定任务(如分类)的性能。

DBN在深度学习的早期阶段解决了训练深度神经网络的难题,尤其是在无监督学习和特征学习方面显示出强大的能力。然而,随着ReLU激活函数、Dropout技术和更强大的计算资源的出现,以及更高效的训练算法(如Adam优化器)的开发,更直接和简单的深度网络结构(如深度卷积神经网络)逐渐取代了DBN在许多应用领域中的地位。

PixelCNN和PixelRNN

PixelCNN和PixelRNN是两种深度学习模型,专门用于生成图像像素序列。它们属于自回归模型的范畴,意味着每个像素的值是基于之前像素值的函数。这两种模型在图像生成领域表现出色,能够产生高质量的、细节丰富的图像。

PixelRNN

PixelRNN由一系列循环神经网络(RNN)层组成,用于对图像像素进行顺序建模。它通过考虑像素之间的空间关系来生成图像,每个像素的值都依赖于先前生成的像素。PixelRNN通过使用RNN的长期依赖性,能够有效地捕获图像中的复杂结构和纹理。

  • 顺序建模:PixelRNN将图像生成视为像素序列生成过程,逐行或按某种顺序处理像素,每个像素的生成都依赖于之前的像素。
  • LSTM/GRU单元:PixelRNN通常使用LSTM或GRU单元来处理长期依赖问题,这有助于模型捕获图像中的复杂结构。

PixelCNN

PixelCNN则是基于卷积神经网络(CNN)的变体,它使用掩码卷积层来确保每个像素仅从先前生成的像素获取信息,从而满足自回归模型的条件性要求。PixelCNN通过堆叠多个掩码卷积层来增加感受野,从而能够捕获图像的更高级特征和结构。

  • 掩码卷积:为了确保模型只考虑当前像素之前的像素,PixelCNN在卷积核中使用了特殊的掩码技术。
  • 并行处理:与PixelRNN相比,PixelCNN的一个优势是能够更有效地利用现代硬件进行并行处理,因为卷积操作本质上比递归操作更适合并行化。

总体来说,PixelCNN和PixelRNN都是在图像生成领域的重要模型,展示了利用自回归性质进行像素级生成的潜力。它们在细节表现和生成图像的连贯性方面都有很好的表现,但PixelCNN通常由于其并行处理能力而更受青睐。

变分自编码器(VAE)

【变分自编码器VAE】可视化讲明白
变分自编码器(Variational Autoencoder, VAE)是一种生成模型,它通过结合深度学习和贝叶斯推断的概念来学习输入数据的潜在表示。VAE不仅可以用于生成新的数据样本,还可以用于数据的降维和特征提取。它由两个主要部分组成:编码器和解码器。

编码器

编码器的作用是将输入数据映射到一个潜在空间(latent space)的表示。在VAE中,这个映射不是直接输出潜在向量,而是输出该向量的参数,通常是潜在空间分布的均值和方差。这意味着每个输入数据点都被编码为潜在空间中的一个分布,而不是一个固定的点,从而增加了表示的灵活性和表达能力。

解码器

解码器的作用是将潜在空间的这些分布转换回数据空间,即从潜在表示中重构输入数据。在生成新的数据样本时,可以从潜在空间的分布中采样一个点,并通过解码器生成与该点对应的数据样本。

重构损失与KL散度

VAE的训练旨在最小化两个关键部分的组合损失:重构损失和KL散度。重构损失确保解码的数据尽可能接近原始数据,而KL散度则强制潜在空间的分布接近先验分布(通常是标准正态分布)。这种方法不仅促进了有效的数据编码,而且确保了潜在空间的连续性和完整性,这对于生成新的、合理的数据样本至关重要。

应用

VAE因其灵活性和强大的生成能力而被广泛应用于各种任务中,包括图像生成、风格转换、数据降维以及作为复杂系统的一部分,如推荐系统和强化学习模型。通过对潜在空间的探索和操作,VAE可以揭示数据的内在结构,并生成新的、具有相似特性的数据点。

生成对抗网络 GAN

生成对抗网络(GAN,Generative Adversarial Networks)是一种深度学习模型,由Ian Goodfellow等人在2014年提出。GAN由两个重要的网络组成,即生成器(Generator)和判别器(Discriminator),这两个网络在模型的训练过程中相互对抗,从而促使模型生成的数据越来越接近真实数据。

生成器(Generator)

生成器的目标是生成与真实数据尽可能相似的数据。在训练开始时,生成器接收一个随机噪声向量作为输入,通过一系列的神经网络层将其转化成与真实数据具有相同维度的输出。随着训练的进行,生成器学习如何调整其参数,以生成越来越逼真的数据。

判别器(Discriminator)

判别器的作用是区分输入数据是来自于真实数据集还是生成器生成的假数据。它也是一个神经网络,接收真实数据或生成器生成的数据作为输入,并输出一个概率值,表示输入数据是真实数据的可能性。

对抗训练过程

GAN的训练涉及到一个对抗过程,其中生成器试图生成越来越逼真的数据以“欺骗”判别器,而判别器则试图变得越来越擅长于区分真假数据。这个过程可以类比于一个伪造艺术品的伪造者(生成器)和一个试图识别伪造品的艺术品鉴定师(判别器)之间的博弈。

训练过程通常包含以下步骤:

  1. 训练判别器:固定生成器的参数,提升判别器的性能。这通过将一批真实数据和一批生成器生成的假数据提供给判别器,并优化判别器的参数来最大化其区分真假数据的能力来实现。

  2. 训练生成器:固定判别器的参数,提升生成器的性能。这通过生成一批假数据,然后尝试欺骗判别器(即让判别器将这些假数据误判为真实数据),并优化生成器的参数来减少判别器的准确性来实现。

这个过程反复进行,直到生成器生成的数据足够逼真,判别器无法区分真假数据,或达到某种平衡状态为止。

应用

GAN已经被应用于多种领域,包括但不限于图像生成、图像编辑、风格转换、图像超分辨率、文本到图像的转换等。由于GAN生成的数据质量高,它在艺术创作、游戏开发、模拟数据生成等方面也显示了巨大的潜力。

挑战

尽管GAN强大且应用广泛,但它们的训练过程仍然具有挑战性,包括模式崩溃(mode collapse)、训练不稳定等问题。研究人员已经提出了多种技术和变种来解决这些问题,使GAN的训练过程更加稳定和高效。

GAN 网络实现

图像预处理

对文件夹下批量图片进行rename

import os

# 图片存放的路径
path = r"C:\Users\ZJL\Desktop\1"

# 遍历更改文件名
num = 1
for file in os.listdir(path):
    os.rename(os.path.join(path,file),os.path.join(path,str(num))+".jpg")
    num = num + 1

本次项目只有八张图片,我们需要进行数据增强,获取更大的数据集。

首先,要对图像进行分辨率的统一。分辨率,即为图像中像素点的个数,例如,一个分辨率为 1920x1080 的图像,表示它在水平方向上有 1920 个像素,在垂直方向上有 1080 个像素。

问:为什么相同分辨率,相同文件类型,但是图片的文件大小不一样?
答:
图像内容的复杂程度:相同分辨率的图像,如果其内容越复杂,文件大小就可能越大。因为图像的复杂程度与其所包含的信息量有关,而信息量越大,文件大小也就越大。

像素的位深度:像素的位深度指的是每个像素能够表示的颜色的数量。例如,8 位深度的像素可以表示 256 种颜色,而 16 位深度的像素可以表示 65,536 种颜色。相同分辨率的图像,如果其像素的位深度不同,文件大小也可能会不同。

元数据的不同:图像文件中可能包含一些元数据,例如创建时间、修改时间、拍摄设备等信息,这些元数据的不同也可能会导致文件大小的差异。

在神经网络中,我们通常需要将输入图像的尺寸规范化为相同的分辨率。

然后我们进行数据增强

训练循环顺序:
步骤1
生成器不动,生成器产生一批假图片,再拿取一批真实图片,喂给判别器,训练判别器。
我们希望判别器对假图片打上标签0,对真图片打上标签1
步骤2
判别器不动,训练生成器。生成一批假样本,使用判别器对这些假样本进行评估。
更新生成器的参数,使其能够生成被判别器认为是真实的样本。

重复上述步骤,直到能生成足够逼真的数据

pytorch保存图片 save_image ,读取图片

训练GAN网络训练多少次比较合适?
最好使用早停(early stopping) 的方法,即在模型在验证集上的表现开始下降时停止训练。这样可以避免模型出现过拟合的情况。

另外,也可以使用 "learning rate decay" 的方法来防止模型出现过拟合的情况。这种方法的原理是,在训练过程中,会逐渐降低学习率,以便模型能够更加稳定地收敛到最优解。

赞赏