南宁企业建站系统模板,aaaa景区网站建设标准,临沂企业网站开发官网,蔺市网站建设自编码说白了就是一个特征提取器#xff0c;也可以看作是一个降维器。下面找了一张很丑的图来说明自编码的过程。 自编码分为压缩和解码两个过程。从图中可以看出来#xff0c;压缩过程就是将一组数据特征进行提取#xff0c; 得到更深层次的特征。解码的过程就是利用之前的…自编码说白了就是一个特征提取器也可以看作是一个降维器。下面找了一张很丑的图来说明自编码的过程。 自编码分为压缩和解码两个过程。从图中可以看出来压缩过程就是将一组数据特征进行提取 得到更深层次的特征。解码的过程就是利用之前的深层次特征再还原成为原来的数据特征。那么如何保证从压缩到解码两部分原数据和解码数据保持一致呢这就是要训练的过程。
如何理解降维如果压缩的过程是卷积维度可以根据核的个数变化特征维度因此而改变。 import os
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from torchvision import transforms
from torchvision.utils import save_imagedevice torch.device(cuda if torch.cuda.is_available() else cpu)sample_dir samples
if not os.path.exists(sample_dir):os.makedirs(sample_dir)
image_size 784
h_dim 400
z_dim 20
num_epochs 15
batch_size 128
learning_rate 1e-3dataset torchvision.datasets.MNIST(root../../data,trainTrue,transformtransforms.ToTensor(),downloadTrue)# Data loader
data_loader torch.utils.data.DataLoader(datasetdataset,batch_sizebatch_size, shuffleTrue)
模型搭建这里搭建的是一个变分自编码Variational Autoencoder
那么变分自编码是为了解决什么问题呢 ——- 其主要思想还是希望学习隐层变量并将其用来表示原始数据但是它加另一个条件, 即隐层变量能学习原始数据的分布, 并反过来生产一些和原始数据相似的数据这有啥用—-可用于图片修复让图片按训练集的数据分布变化。
变分自编码 (Variational Autoencoder) 为了让隐层抓住输入数据特性, 而不是简单的输出数据输入数据他在隐层中加入随机噪声单位高斯噪声这个过程也叫reparametrize以确保隐层能较好抽象输入数据特点。
代码中怎么做的呢
1、编码过程中我们保存了第二层线性层的输出。其中第二层包含有fc2与fc3两部分他们是并联的。
2、给隐藏层加入随机噪声作为解码的输入
class VAE(nn.Module):def __init__(self, image_size784, h_dim400, z_dim20):super(VAE, self).__init__()self.fc1 nn.Linear(image_size, h_dim)self.fc2 nn.Linear(h_dim, z_dim)self.fc3 nn.Linear(h_dim, z_dim)self.fc4 nn.Linear(z_dim, h_dim)self.fc5 nn.Linear(h_dim, image_size)def encode(self, x):h F.relu(self.fc1(x))return self.fc2(h), self.fc3(h)def reparameterize(self, mu, log_var):std torch.exp(log_var/2)eps torch.randn_like(std)return mu eps * stddef decode(self, z):h F.relu(self.fc4(z))return F.sigmoid(self.fc5(h))def forward(self, x):mu, log_var self.encode(x)z self.reparameterize(mu, log_var)x_reconst self.decode(z)return x_reconst, mu, log_var
训练由于训练中加入了噪声所以损失值的结构也因此改变。一部分来源于解码内容核原内容的相似度另一部分是kl_div具体是什么意义需查看论文。
model VAE().to(device)
optimizer torch.optim.Adam(model.parameters(), lrlearning_rate)# Start training
for epoch in range(num_epochs):for i, (x, _) in enumerate(data_loader):# Forward passx x.to(device).view(-1, image_size)x_reconst, mu, log_var model(x)# Compute reconstruction loss and kl divergence# For KL divergence, see Appendix B in VAE paper or http://yunjey47.tistory.com/43reconst_loss F.binary_cross_entropy(x_reconst, x, size_averageFalse)kl_div - 0.5 * torch.sum(1 log_var - mu.pow(2) - log_var.exp())# Backprop and optimizeloss reconst_loss kl_divoptimizer.zero_grad()loss.backward()optimizer.step()if (i1) % 10 0:print (Epoch[{}/{}], Step [{}/{}], Reconst Loss: {:.4f}, KL Div: {:.4f} .format(epoch1, num_epochs, i1, len(data_loader), reconst_loss.item(), kl_div.item()))with torch.no_grad():# Save the sampled imagesz torch.randn(batch_size, z_dim).to(device)out model.decode(z).view(-1, 1, 28, 28)save_image(out, os.path.join(sample_dir, sampled-{}.png.format(epoch1)))# Save the reconstructed imagesout, _, _ model(x)x_concat torch.cat([x.view(-1, 1, 28, 28), out.view(-1, 1, 28, 28)], dim3)save_image(x_concat, os.path.join(sample_dir, reconst-{}.png.format(epoch1)))
模型训练完成了之后该如何使用这个模型呢
model.decode()是一个解码的过程我们给他一个随机的中间特征z就可以输出一个数字图片了。
z torch.randn(1,z_dim).to(device)
out model.decode(z)
plt.imshow(out.cpu().data.numpy().reshape(28,28),cmapgray)
plt.show() 有了随机的一张图片之后我们把他完整的放入模型中生成了和输入相似的一张图片也没看出来是修复了图像......
out,_,_ model(out)
plt.imshow(out.cpu().data.numpy().reshape(28,28),cmapgray)
plt.show()