DCGAN生成二次元头像实战,Anime Faces数据集下载
一、数据
下载地址1 CSDN
0积分下载
:https://download.csdn.net/download/sdbyp/87586295
下载地址2 Kaggle:https://www.kaggle.com/datasets/soumikrakshit/anime-faces
二、实现代码
import glob
import torch
from PIL import Image
from torch import nn
from torch.utils import data
from torchvision import transforms
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as npimages_path = glob.glob('./data/anime-faces/*.png')transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])class FaceDataset(data.Dataset):def __init__(self, images_path):self.images_path = images_pathdef __getitem__(self, index):image_path = self.images_path[index]pil_img = Image.open(image_path)pil_img = transform(pil_img)return pil_imgdef __len__(self):return len(self.images_path)BATCH_SIZE = 32
dataset = FaceDataset(images_path)
data_loader = data.DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=True)
image_batch = next(iter(data_loader))# 定义生成器
class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()self.linear1 = nn.Linear(100, 256*16*16)self.bn1 = nn.BatchNorm1d(256*16*16)self.deconv1 = nn.ConvTranspose2d(256, 128, kernel_size=3, padding=1) # 输出:128*16*16self.bn2 = nn.BatchNorm2d(128)self.deconv2 = nn.ConvTranspose2d(128, 64, kernel_size=4, stride=2, padding=1) # 输出:64*32*32self.bn3 = nn.BatchNorm2d(64)self.deconv3 = nn.ConvTranspose2d(64, 3, kernel_size=4, stride=2, padding=1) # 输出:3*64*64def forward(self, x):x = F.relu(self.linear1(x))x = self.bn1(x)x = x.view(-1, 256, 16, 16)x = F.relu(self.deconv1(x))x = self.bn2(x)x = F.relu(self.deconv2(x))x = self.bn3(x)x = F.tanh(self.deconv3(x))return x# 定义判别器
class Discrimination(nn.Module):def __init__(self):super(Discrimination, self).__init__()self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=2) # 64*31*31self.conv2 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=2) # 128*15*15self.bn1 = nn.BatchNorm2d(128)self.fc = nn.Linear(128*15*15, 1)def forward(self, x):x = F.dropout(F.leaky_relu(self.conv1(x)), p=0.3)x = F.dropout(F.leaky_relu(self.conv2(x)), p=0.3)x = self.bn1(x)x = x.view(-1, 128*15*15)x = torch.sigmoid(self.fc(x))return xdevice = "cuda:0" if torch.cuda.is_available() else "cpu"
print(device)
gen = Generator().to(device)
dis = Discrimination().to(device)
loss_fn = torch.nn.BCELoss()
gen_opti = torch.optim.Adam(gen.parameters(), lr=0.0001)
dis_opti = torch.optim.Adam(dis.parameters(), lr=0.00001)# 定义可视化函数
def generate_and_save_images(model, epoch, test_noise_):predictions = model(test_noise_).permute(0, 2, 3, 1).cpu().numpy()fig = plt.figure(figsize=(20, 160))for i in range(predictions.shape[0]):plt.subplot(1, 8, i+1)plt.imshow((predictions[i]+1)/2)# plt.axis('off')plt.show()test_noise = torch.randn(8, 100, device=device)#############################
D_loss = []
G_loss = []# 开始训练
for epoch in range(500):D_epoch_loss = 0G_epoch_loss = 0batch_count = len(data_loader) # 返回批次数for step, img, in enumerate(data_loader):img = img.to(device)size = img.shape[0]random_noise = torch.randn(size, 100, device=device) # 生成随机输入# 固定生成器,训练判别器dis_opti.zero_grad()real_output = dis(img)d_real_loss = loss_fn(real_output, torch.ones_like(real_output, device=device))d_real_loss.backward()generated_img = gen(random_noise)# print(generated_img)fake_output = dis(generated_img.detach())d_fake_loss = loss_fn(fake_output, torch.zeros_like(fake_output, device=device))d_fake_loss.backward()dis_loss = d_real_loss + d_fake_lossdis_opti.step()# 固定判别器,训练生成器gen_opti.zero_grad()fake_output = dis(generated_img)gen_loss = loss_fn(fake_output, torch.ones_like(fake_output, device=device))gen_loss.backward()gen_opti.step()with torch.no_grad():D_epoch_loss += dis_loss.item()G_epoch_loss += gen_loss.item()with torch.no_grad():D_epoch_loss /= batch_countG_epoch_loss /= batch_countD_loss.append(D_epoch_loss)G_loss.append(G_epoch_loss)print("Epoch:", epoch)generate_and_save_images(gen, epoch, test_noise)plt.plot(range(1, len(D_loss)+1), D_loss, label="D_loss")
plt.plot(range(1, len(D_loss)+1), G_loss, label="G_loss")
plt.xlabel('epoch')
plt.legend()
plt.show()
三、截图结果
epoch0
epoch20
epoch40
epoch60
epoch80
epoch89
DCGAN生成二次元头像实战,Anime Faces数据集下载相关推荐
- DCGAN生成二次元头像(Pytorch)
任务:基于Pytorch搭建DCGAN网络进行训练自动生成二次元头像的模型 文章目录 简介 网络介绍 代码详解 实验结果 参考 简介 好久没发Blog了,发个Pytorch的入门项目一起happy下~ ...
- DCGAN 生成二次元头像
8. DCGAN 2019/11/10 GAN, 又称生成对抗网络, 也是 Generative Adversarial Nets 的简称 我们知道自然界的生物无时无刻都不在相互对抗进化,生物 ...
- 【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像...
模型训练与在线预测服务.推荐算法四部曲.机器学习PAI实战.更多精彩,尽在 开发者分会场 [机器学习PAI实战]-- 玩转人工智能之综述 [机器学习PAI实战]-- 玩转人工智能之商品价格预测 [机器 ...
- 【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像
前言 深度学习作为人工智能的重要手段,迎来了爆发,在NLP.CV.物联网.无人机等多个领域都发挥了非常重要的作用.最近几年,各种深度学习算法层出不穷, Generative Adverarial Ne ...
- 【菜鸟窝免费视频】如何生成数字、人脸和二次元美少女头像(AI生成二次元头像)
阿里百度人工智能大神精讲的人工智能视频课程,领取地址:https://www.cniao5.com/course/10239 或欢迎勾搭运营小姐姐(微信 id:BT474849)免费领取63讲精品机器 ...
- pytorch实现GAN(生成对抗网络)生成二次元头像(附代码)
目录 GAN基本概念 GAN算法流程 代码实现与讲解 1.准备数据集 代码实现 定义鉴别器 定义生成器 训练 补充 附完整代码 参考链接及书目 GAN基本概念 GAN, 全称Generative Ad ...
- 【MindSpore】DCGAN生成漫画头像-----利用华为云modelarts云终端实现
前言 本人对于 mindspore 一点也不熟悉 但是 对于 学习新事物的心情和动力 一直都很澎湃 本次参加 mindSpore 的 DCGAN生成漫画头像 社区活动,希望能够增长见识 关注 证明图 ...
- Mindspore体验dcgan生成漫画头像
第一章 MindSpore框架的体验与部署 第二章Mindspore体验dcgan生成漫画头像 目录 前言 一.官方文档 二.使用体验 1.下载notebook并打开 GAN基础原理 DCGAN原理 ...
- 华为开源自研AI框架昇思MindSpore应用实践:DCGAN生成漫画头像
目录 一.原理说明 1.GAN基础原理 2.DCGAN原理 二.环境准备 1.进入ModelArts官网 2.使用CodeLab体验Notebook实例 三.数据准备与处理 1.数据处理 四.创建网络 ...
最新文章
- 离开网易的转型之路3:热爱测试之路-路上的风景
- 一起学nRF51xx 18 - 蓝牙协议栈烧录
- 如何提升JavaScript的任务效率?学会后教给你同事
- 学习进行中,快over了
- hibernate框架学习笔记11:Criteria查询详解
- js中获取 table节点各tr及td的内容方法
- opencv之cv::Mat像素遍历
- Python自动化开发学习的第四周------函数进阶
- 闽江学院2015-2016学年下学期《软件测试》课程-第四次博客作业
- java导出出行客人到Excel
- 【Go系列】Go安装与环境配置,The selected directory is not a valid home for Go SDK
- SEO过程中外链的误区
- Android安卓的发展史
- NXP JN5169使用EEPROM/片上FLASH/随机数/内部NVM
- C++多线程:thread_local
- JSON-spirit用法
- 方程的近似解c语言程序,C语言实现二分法(方程近似解)
- BeanFacotry中的ApplicationContext
- HTML中img标签的src属性为绝对路径时,在IE中图片可显示,在firefox中不行
- word2013打开后一直未响应完美解决方案