人工智能算法工程师(高级)课程4-图像生成项目之自编码生成模型与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程4-图像生成项目之自编码生成模型与代码详解。自编码生成模型(Autoencoder)是一种无监督学习算法,旨在通过编码器和解码器学习数据的有效表示。本文将介绍自编码生成模型的几种常见类型,包括AE模型、SAE模型、DAE模型和VAE模型,并使用PyTorch搭建这些模型,最后介绍图像生成的原理和技术。
文章目录
一、AE模型(Autoencoder)
AE模型原理
AE模型的目标是最小化输入数据x和重构数据x’之间的重构误差。损失函数通常采用均方误差(MSE):
L
(
x
,
x
′
)
=
1
n
∑
i
=
1
n
(
x
i
−
x
i
′
)
2
L(x, x') = \frac{1}{n}\sum_{i=1}^{n}(x_i - x'_i)^2
L(x,x′)=n1i=1∑n(xi−xi′)2
其中,n为数据维度。
AE模型代码:
import torch
import torch.nn as nn
import torch.optim as optim
# 定义AE模型
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(True),
nn.Linear(256, 128),
nn.ReLU(True),
nn.Linear(128, 64),
nn.ReLU(True)
)
self.decoder = nn.Sequential(
nn.Linear(64, 128),
nn.ReLU(True),
nn.Linear(128, 256),
nn.ReLU(True),
nn.Linear(256, 784),
nn.Sigmoid()
)
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
# 实例化模型、损失函数和优化器
model = Autoencoder()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练模型
for epoch in range(100):
for data in dataloader:
inputs, _ = data
inputs = inputs.view(-1, 784)
outputs = model(inputs)
loss = criterion(outputs, inputs)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/100], Loss: {loss.item()}')
二、SAE模型(Stacked Autoencoder)
SAE模型原理
稀疏自编码器SAE是一种特殊类型的自编码器,它在隐藏层加入稀疏性约束,目的是让隐藏层的激活值在大多数情况下接近零,从而学习更加有效的特征表示。稀疏性可以通过添加额外的损失项来实现,例如KL散度,用于衡量隐藏层激活分布与目标稀疏分布之间的差异。
假设隐藏层的激活概率为
p
j
p_j
pj,目标稀疏系数为
ρ
\rho
ρ,则稀疏惩罚项可以表示为:
∑
j
K
L
(
ρ
∣
∣
p
j
)
=
ρ
log
(
ρ
p
j
)
+
(
1
−
ρ
)
log
(
1
−
ρ
1
−
p
j
)
\sum_j KL(\rho || p_j) = \rho \log\left(\frac{\rho}{p_j}\right) + (1-\rho)\log\left(\frac{1-\rho}{1-p_j}\right)
j∑KL(ρ∣∣pj)=ρlog(pjρ)+(1−ρ)log(1−pj1−ρ)
SAE模型代码实现
# SAE模型代码与AE模型类似,只需在AE模型的基础上增加更多层
class StackedAutoencoder(nn.Module):
def __init__(self):
super(StackedAutoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(True),
nn.Linear(256, 128),
nn.ReLU(True),
nn.Linear(128, 64),
nn.ReLU(True)
)
self.decoder = nn.Sequential(
nn.Linear(64, 128),
nn.ReLU(True),
nn.Linear(128, 256),
nn.ReLU(True),
nn.Linear(256, 784),
nn.Sigmoid()
)
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
三、DAE模型(Denoising Autoencoder)
数学原理
DAE在自编码器的基础上引入了去噪的概念,它通过在训练时向输入数据
x
\mathbf{x}
x 添加噪声
ϵ
\epsilon
ϵ 来生成带噪输入
x
~
=
x
+
ϵ
\tilde{\mathbf{x}} = \mathbf{x} + \epsilon
x~=x+ϵ 或者通过某种机制(如随机遮挡)来模拟噪声。DAE的目标是学习一个函数
f
DAE
(
x
~
;
θ
)
f_\text{DAE}(\tilde{\mathbf{x}}; \theta)
fDAE(x~;θ),该函数能够从带噪输入
x
~
\tilde{\mathbf{x}}
x~ 中恢复出原始的干净输入
x
\mathbf{x}
x。
DAE的训练目标函数可以表示为:
L
DAE
(
x
,
x
^
)
=
E
x
~
∼
q
(
x
~
∣
x
)
[
L
(
x
,
f
DAE
(
x
~
;
θ
)
)
]
L_{\text{DAE}}(\mathbf{x}, \hat{\mathbf{x}}) = \mathbb{E}_{\tilde{\mathbf{x}} \sim q(\tilde{\mathbf{x}}|\mathbf{x})} \left[ L(\mathbf{x}, f_\text{DAE}(\tilde{\mathbf{x}}; \theta)) \right]
LDAE(x,x^)=Ex~∼q(x~∣x)[L(x,fDAE(x~;θ))]
其中
q
(
x
~
∣
x
)
q(\tilde{\mathbf{x}}|\mathbf{x})
q(x~∣x) 是噪声数据的分布,
E
\mathbb{E}
E 表示期望值,即对所有可能的噪声样本
x
~
\tilde{\mathbf{x}}
x~ 求平均重构误差。
DAE模型代码实现:
# DAE模型代码与AE模型类似,只需在训练过程中添加噪声
for epoch in range(100):
for data in dataloader:
inputs, _ = data
inputs = inputs.view(-1, 784)
noisy_inputs = inputs + 0.3 * torch.randn_like(inputs) # 添加噪声
outputs = model(noisy_inputs)
loss = criterion(outputs, inputs)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/100], Loss: {loss.item()}')
四、VAE模型(Variational Autoencoder)
VAE模型数学原理
VAE模型引入了变分推断,使模型能够学习到数据的概率分布。损失函数由两部分组成:重构误差和KL散度。
L
(
x
,
x
′
)
=
−
1
n
∑
i
=
1
n
(
x
i
log
(
x
i
′
)
+
(
1
−
x
i
)
log
(
1
−
x
i
′
)
)
+
D
K
L
(
q
(
z
∣
x
)
∣
∣
p
(
z
)
)
L(x, x') = -\frac{1}{n}\sum_{i=1}^{n}(x_i \log(x'_i) + (1 - x_i) \log(1 - x'_i)) + D_{KL}(q(z|x) || p(z))
L(x,x′)=−n1i=1∑n(xilog(xi′)+(1−xi)log(1−xi′))+DKL(q(z∣x)∣∣p(z))
其中,
D
K
L
(
q
(
z
∣
x
)
∣
∣
p
(
z
)
)
D_{KL}(q(z|x) || p(z))
DKL(q(z∣x)∣∣p(z))为KL散度,用于衡量潜在变量分布
q
(
z
∣
x
)
q(z|x)
q(z∣x)与先验分布
p
(
z
)
p(z)
p(z)之间的差异。
VAE模型代码实现
class VariationalAutoencoder(nn.Module):
def __init__(self):
super(VariationalAutoencoder, self).__init__()
# 编码器部分
self.fc1 = nn.Linear(784, 400)
self.fc21 = nn.Linear(400, 20) # 均值向量
self.fc22 = nn.Linear(400, 20) # 方差向量
# 解码器部分
self.fc3 = nn.Linear(20, 400)
self.fc4 = nn.Linear(400, 784)
def encode(self, x):
h1 = torch.relu(self.fc1(x))
return self.fc21(h1), self.fc22(h1)
def reparameterize(self, mu, logvar):
std = torch.exp(0.5*logvar)
eps = torch.randn_like(std)
return mu + eps*std
def decode(self, z):
h3 = torch.relu(self.fc3(z))
return torch.sigmoid(self.fc4(h3))
def forward(self, x):
mu, logvar = self.encode(x.view(-1, 784))
z = self.reparameterize(mu, logvar)
return self.decode(z), mu, logvar
# 实例化模型、损失函数和优化器
vae = VariationalAutoencoder()
optimizer = optim.Adam(vae.parameters(), lr=1e-3)
# 训练模型
def loss_function(recon_x, x, mu, logvar):
BCE = nn.functional.binary_cross_entropy(recon_x, x.view(-1, 784), reduction='sum')
KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
return BCE + KLD
for epoch in range(100):
vae.train()
train_loss = 0
for data in dataloader:
inputs, _ = data
optimizer.zero_grad()
recon_batch, mu, logvar = vae(inputs)
loss = loss_function(recon_batch, inputs, mu, logvar)
loss.backward()
train_loss += loss.item()
optimizer.step()
print(f'Epoch [{epoch+1}/100], Loss: {train_loss/len(dataloader.dataset)}')
四、图像生成的原理和技术
图像生成是利用学习到的数据表示来生成新的数据样本。在自编码生成模型中,图像生成主要依赖于解码器部分。以下是图像生成的步骤:
- 从先验分布(例如高斯分布)中采样潜在变量z。
- 将潜在变量z输入到解码器中,生成新的数据样本。
在VAE模型中,图像生成的代码如下:
# 图像生成
vae.eval()
with torch.no_grad():
sample = torch.randn(64, 20).to(device) # 从标准正态分布中抽取样本
sample = vae.decode(sample).cpu()
sample = sample.view(64, 1, 28, 28)
save_image(sample, 'sample.png')
五、总结
本文介绍了自编码生成模型的几种常见类型,并使用PyTorch搭建了这些模型。通过训练,模型能够学习到数据的有效表示。利用这些表示,我们可以生成新的图像样本。掌握图像生成的原理和技术,有助于进一步研究深度学习和生成模型。
原文地址:https://blog.csdn.net/weixin_42878111/article/details/140608069
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!