目录

介绍

预测新时尚形象的力量

构建GAN

初始化GAN参数和加载数据

从头开始构建生成器

从头开始构建鉴别器

初始化GAN的损失和优化器

下一步


  • 下载源 - 120.7 MB

介绍

DeepFashion等数据集的可用性为时尚行业开辟了新的可能性。在本系列文章中,我们将展示一个AI驱动的深度学习系统,它可以帮助我们更好地了解客户的需求,从而彻底改变时装设计行业。

在这个项目中,我们将使用:

  • Jupyter Notebook作为 IDE
  • 库:
  • TensorFlow 2.0
  • NumPy
  • MatplotLib
  • DeepFashion数据集的自定义子集——相对较小以减少计算和内存开销

我们假设您熟悉深度学习的概念,以及Jupyter Notebooks和TensorFlow。如果您不熟悉Jupyter Notebook,请从本教程开始。欢迎下载项目代码。

在上一篇文章中,我们评估并改进了我们的深度网络性能。在本文中,我们将致力于构建、训练和测试生成对抗网络(GAN)——然后我们将使用该网络生成新的服装图像和设计。

预测新时尚形象的力量

人工智能不仅可以帮助我们预测服装项目的类别,还可以创建计算机生成的外观相似项目的图像。这对于努力打造个性化服装或预测更广泛时尚趋势的零售商和时装设计师来说非常方便。

在创建GAN之前,由于图像的大量数据,生成逼真的时尚图像是一项具有挑战性的任务。图像往往是高分辨率的,因此像素很多。另外,每个像素代表三个通道值:红色、蓝色和绿色 (RGB)。GAN为研究人员提供了一种可行的方法来生成和验证所有这些数据。

构建GAN

GAN是一种流行的无监督机器学习模型,其中两个神经网络——一个生成器和一个鉴别器——相互交互。生成器的作用是从它作为输入的随机噪声中生成图像。鉴别器的任务是检测这些生成的图像是假的还是真实的(通过将它们与数据集中的图像进行比较)。这个过程会持续几个时期,直到假和真之间的鉴别器损失达到其最小值。随着损失达到最小值,生成器在生成与原始数据集中的图像相似的图像方面变得足够熟练。

构建GAN将包括以下阶段:

  1. 初始化网络参数和加载数据
  2. 构建生成器
  3. 构建鉴别器

我们将使用Pytorch库来构建我们的GAN。这个库速度很快,而且不需要很多计算能力。

在Conda上安装带有CUDA10的Pytorch:

# CUDA 10.0
conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 -c pytorch

初始化GAN参数和加载数据

构成GAN的两个卷积神经网络 (CNN) 包括用于鉴别器的卷积、批归一化和ReLU层,以及用于生成器的反卷积、批归一化和ReLU层。

在开始构建我们的生成器和鉴别器网络之前,让我们设置一些参数并加载将用于训练和测试网络的时尚图像数据集。

首先,我们导入一些依赖项。

from __future__ import print_function
#%matplotlib inline
import argparse
import os
import random
import torch
import torch.nn as nn
import torch.nn.parallel
import torch.backends.cudnn as cudnn
import torch.optim as optim
import torch.utils.data
import torchvision.datasets as dset
import torchvision.transforms as transforms
import torchvision.utils as vutils
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML

接下来,我们设置一些随机种子来实现可重复性:

# Set random seed for reproducibility
manualSeed = 999
#manualSeed = random.randint(1, 10000) # use if you want new results
print("Random Seed: ", manualSeed)
random.seed(manualSeed)
torch.manual_seed(manualSeed)

然后,我们设置了一些重要的参数,例如特征图的数量、输入图像大小、批量大小、时期数和学习率。

# Root directory for dataset
dataroot = r"C:\Users\abdul\Desktop\ContentLab\P2\DeepFashion\Train"# Number of workers for dataloader
workers = 2# Batch size during training
batch_size = 128# Spatial size of training images. All images will be resized to this
#   size using a transformer.
image_size = 64# Number of channels in the training images. For color images this is 3
nc = 3# Size of z latent vector (i.e. size of generator input)
nz = 100# Size of feature maps in generator
ngf = 64# Size of feature maps in discriminator
ndf = 64# Number of training epochs
num_epochs = 40# Learning rate for optimizers
lr = 0.0002# Beta1 hyperparam for Adam optimizers
beta1 = 0.5# Number of GPUs available. Use 0 for CPU mode.
ngpu = 1

现在我们可以使用dataloader加载我们的数据并显示该数据的样本。

dataset = dset.ImageFolder(root=dataroot,transform=transforms.Compose([transforms.Resize(image_size),transforms.CenterCrop(image_size),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),]))
# Create the dataloader
dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size,shuffle=True, num_workers=workers)# Decide which device we want to run on
device = torch.device("cuda:0" if (torch.cuda.is_available() and ngpu > 0) else "cpu")# Plot some training images
real_batch = next(iter(dataloader))
plt.figure(figsize=(8,8))
plt.axis("off")
plt.title("Training Images")
plt.imshow(np.transpose(vutils.make_grid(real_batch[0].to(device)[:64], padding=2, normalize=True).cpu(),(1,2,0)))

最后,我们将使用下面的函数来初始化生成器和鉴别器网络的权重。

# custom weights initialization
def weights_init(m):classname = m.__class__.__name__if classname.find('Conv') != -1:nn.init.normal_(m.weight.data, 0.0, 0.02)elif classname.find('BatchNorm') != -1:nn.init.normal_(m.weight.data, 1.0, 0.02)nn.init.constant_(m.bias.data, 0)

从头开始构建生成器

生成器CNN由转置卷积层、批范数层和ReLU激活组成。输入是从标准正态分布中提取的潜在向量z,输出是3 x 64 x 64像素的RGB图像。

class Generator(nn.Module):def __init__(self, ngpu):super(Generator, self).__init__()self.ngpu = ngpuself.main = nn.Sequential(# input is Z, going into a convolutionnn.ConvTranspose2d( nz, ngf * 8, 4, 1, 0, bias=False),nn.BatchNorm2d(ngf * 8),nn.ReLU(True),# state size. (ngf*8) x 4 x 4nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf * 4),nn.ReLU(True),# state size. (ngf*4) x 8 x 8nn.ConvTranspose2d( ngf * 4, ngf * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf * 2),nn.ReLU(True),# state size. (ngf*2) x 16 x 16nn.ConvTranspose2d( ngf * 2, ngf, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf),nn.ReLU(True),# state size. (ngf) x 32 x 32nn.ConvTranspose2d( ngf, nc, 4, 2, 1, bias=False),nn.Tanh()# state size. (nc) x 64 x 64)def forward(self, input):return self.main(input)

现在,我们创建netG生成器并展示其结构。

# Create the generator
netG = Generator(ngpu).to(device)# Handle multi-gpu if desired
if (device.type == 'cuda') and (ngpu > 1):netG = nn.DataParallel(netG, list(range(ngpu)))# Apply the weights_init function to randomly initialize all weights
#  to mean=0, stdev=0.2.
netG.apply(weights_init)# Print the model
print(netG)

从头开始构建鉴别器

我们的鉴别器将被称为netD,它将由跨步卷积层、LeakyReLU激活层和批范数层组成。它的输入将是一个3 x 64 x 64的输入图像,它的输出将是输入来自真实数据集的标量概率。

class Discriminator(nn.Module):def __init__(self, ngpu):super(Discriminator, self).__init__()self.ngpu = ngpuself.main = nn.Sequential(# input is (nc) x 64 x 64nn.Conv2d(nc, ndf, 4, 2, 1, bias=False),nn.LeakyReLU(0.2, inplace=True),# state size. (ndf) x 32 x 32nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 2),nn.LeakyReLU(0.2, inplace=True),# state size. (ndf*2) x 16 x 16nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 4),nn.LeakyReLU(0.2, inplace=True),# state size. (ndf*4) x 8 x 8nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 8),nn.LeakyReLU(0.2, inplace=True),# state size. (ndf*8) x 4 x 4nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False),nn.Sigmoid())def forward(self, input):return self.main(input)# Create the Discriminator
netD = Discriminator(ngpu).to(device)# Handle multi-gpu if desired
if (device.type == 'cuda') and (ngpu > 1):netD = nn.DataParallel(netD, list(range(ngpu)))# Apply the weights_init function to randomly initialize all weights
#  to mean=0, stdev=0.2.
netD.apply(weights_init)# Print the model
print(netD)

初始化GAN的损失和优化器

在开始训练我们的GAN之前,我们将设置它的损失函数和优化器。在GAN中,我们通常使用二元交叉熵作为损失函数,因为我们在输出中有两个类:Fake (0)和Real (1)。我们将使用Adam 优化器,学习率为 0.0002,Beta1为0.5。

# Initialize BCELoss function
criterion = nn.BCELoss()# Create batch of latent vectors that we will use to visualize
#  the progression of the generator
fixed_noise = torch.randn(64, nz, 1, 1, device=device)# Establish convention for real and fake labels during training
real_label = 1.
fake_label = 0.# Setup Adam optimizers for both G and D
optimizerD = optim.Adam(netD.parameters(), lr=lr, betas=(beta1, 0.999))
optimizerG = optim.Adam(netG.parameters(), lr=lr, betas=(beta1, 0.999))

下一步

在接下来的文章中,我们将告诉你如何培养对时装设计产生的GAN。敬请关注!

https://www.codeproject.com/Articles/5297330/Generate-New-Fashion-Designs-with-a-Generative-Adv

(五)使用生成对抗网络 (GAN)生成新的时装设计相关推荐

  1. 利用Tensorflow构建生成对抗网络GAN以生成数据

    使用生成对抗网络(GAN)生成数据 本文主要内容 介绍了自动编码器的基本原理 比较了生成模型与自动编码器的区别 描述了GAN模型的网络结构 分析了GAN模型的目标核函数以及训练过程 介绍了利用Goog ...

  2. ECCV2022 | 生成对抗网络GAN论文汇总(图像转换-图像编辑-图像修复-少样本生成-3D等)...

    图像转换/图像可控编辑 视频生成 少样本生成 图像外修复/结合transformer GAN改进 新数据集 图像增强 3D 图像来源归属分析 一.图像转换/图像可控编辑 1.VecGAN: Image ...

  3. 【机器学习】生成对抗网络 GAN

    文章目录 GAN能干什么? GAN的设计初衷 GAN 的基本原理(大白话) 生成对抗网络(GAN)由2个重要的部分构成 训练过程 GAN的总结 GAN的提出:"Generative Adve ...

  4. 生成对抗网络gan原理_中国首个“芯片大学”即将落地;生成对抗网络(GAN)的数学原理全解...

    开发者社区技术周刊又和大家见面了,萌妹子主播为您带来第三期"开发者技术联播".让我们一起听听,过去一周有哪些值得我们开发者关注的重要新闻吧. 中国首个芯片大学,南京集成电路大学即将 ...

  5. 必读!TOP10生成对抗网络GAN论文(附链接)

    来源:新智元 本文约2200字,建议阅读7分钟. 本文所选论文提供了一个易读的对GAN的介绍,帮助你理解GAN技术的基础. [ 导读 ]生成对抗网络 (GAN) 是深度学习中最有趣.最受欢迎的应用之一 ...

  6. 生成对抗网络GAN综述

    题目:生成对抗网络GAN综述 系别:工程物理系 姓名:王雨阳 简 介: 生成对抗网络(GAN)是目前深度学习中应用较为广泛的一种网络.在我今后的研究中,可能会用到GAN,并且我也想了解一下GAN,因此 ...

  7. 【GAN优化】长文综述解读如何定量评价生成对抗网络(GAN)

    欢迎大家来到<GAN优化>专栏,这里将讨论GAN优化相关的内容,本次将和大家一起讨论GAN的评价指标. 作者&编辑 | 小米粥 编辑 | 言有三 在判别模型中,训练完成的模型要在测 ...

  8. [论文阅读] (06) 万字详解什么是生成对抗网络GAN?经典论文及案例普及

    <娜璋带你读论文>系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢.由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学 ...

  9. 生成对抗网络gan原理_必读!TOP10生成对抗网络GAN论文(附链接)

    来源:新智元 本文约2200字,建议阅读7分钟. 本文所选论文提供了一个易读的对GAN的介绍,帮助你理解GAN技术的基础. [ 导读 ]生成对抗网络 (GAN) 是深度学习中最有趣.最受欢迎的应用之一 ...

最新文章

  1. 好的开始是成功的一半:网页优化之标题篇
  2. pyecharts 应用4: 二维散点图
  3. 同等学力申硕计算机科学与技术参考书,2017同等学力申硕计算机科学与技术综合备考规划...
  4. 阻塞队列,来写生产者消费者,生产一个消费一个
  5. 数字图像处理:视觉系统中的坐标系介绍
  6. 人口增量超过北上广!二线城市是怎样逆袭的?
  7. AngularJS日期格式化
  8. 后退与hash的问题
  9. GB28181-2016过检通过
  10. 云服务下的安全特点及基础防护
  11. 深入解析ORACLE字符集
  12. win7桌面图标消失的3种解决方案
  13. 局域网网络流量监控_网工必知:用于监控企业网络的10款最佳工具,拿走!不谢!...
  14. PHP方法,传入的参数前带三个点是什么意思?
  15. 如何使用微软提供的TCHAR.H头文件
  16. 《必然》二、奔跑吧,所有人都是菜鸡
  17. 人机智能的逻辑哲学论
  18. Linux rm/rmdir 命令使用介绍
  19. [人工智能-深度学习-46]:FineTuning(微调)、Transfer Trainning(迁移学习)的理论基础与深度解析
  20. 计算机辅助设计表现的发展给设计带来的影响,计算机辅助设计对艺术设计的影响.doc...

热门文章

  1. futuretask java 并发请求_Java并发编程:Callable、Future和FutureTask
  2. docker ubuntu镜像_macOS 下使用 Docker 搭建 ubuntu 环境
  3. 引用管理器没有程序集_Excel结构化表与名称管理器
  4. python api加快交易速度_使用Python3的pipedriveapi将交易输出限制为1000个交易
  5. 常见的php 字符串函数,php 常用字符串函数总结
  6. PNG免扣素材|圣诞树海报素材,元素很多哦!
  7. 必备的中国风PNG免扣元素点缀,尽显国潮韵味
  8. 这样的促销海报,还怕卖不出去?
  9. php curl 链接无效时,在PHP中使用CURL的POST会产生无效的请求错误
  10. 干支纪年法简便算法_@谢氏宗亲:可知道我国为何放弃黄帝纪年,而选择耶稣诞辰纪年法...