做网站你们用什么浏览器,现代著名设计师及作品,做网站聚合做权重难吗,建设网站公司价格#x1f368; 本文为#x1f517;365天深度学习训练营 中的学习记录博客#x1f356; 原作者#xff1a;K同学啊 目录 代码总结与心得 代码
关于CGAN的原理上节已经讲过#xff0c;这次主要是编写代码加载上节训练后的模型来进行指定条件的生成
图像的生成其实只需要使用… 本文为365天深度学习训练营 中的学习记录博客 原作者K同学啊 目录 代码总结与心得 代码
关于CGAN的原理上节已经讲过这次主要是编写代码加载上节训练后的模型来进行指定条件的生成
图像的生成其实只需要使用Generator模型判别器模型是在训练过程中才用的。
# 库引入
from torch.autograd import Variable
from torchvision.utils import save_image, make_grid
import matplotlib.pyplot as plt
import torch.nn as nn
import torch.optim as optim
import torchdevice torch.device(cuda if torch.cuda.is_available() else cpu)# 超参数
latent_dim 100
n_classes 3
embedding_dim 100# 工具函数
def weights_init(m):classname m.__class__.__name__if classname.find(Conv) ! -1:torch.nn.init.normal_(m.weight, 0.0, 0.02)elif classname.find(BatchNorm) ! -1:torch.nn.init.normal_(m.weight, 1.0, 0.02)torch.nn.init.zeros_(m.bias)# 模型
class Generator(nn.Module):def __init__(self):super().__init__()self.label_conditioned_generator nn.Sequential(nn.Embedding(n_classes, embedding_dim),nn.Linear(embedding_dim, 16))self.latent nn.Sequential(nn.Linear(latent_dim, 4*4*512),nn.LeakyReLU(0.2, inplaceTrue))self.model nn.Sequential(nn.ConvTranspose2d(513, 64*8, 4, 2, 1, biasFalse),nn.BatchNorm2d(64*8, momentum0.1, eps0.8),nn.ReLU(True),nn.ConvTranspose2d(64*8, 64*4, 4, 2, 1, biasFalse),nn.BatchNorm2d(64*4, momentum0.1, eps0.8),nn.ReLU(True),nn.ConvTranspose2d(64*4, 64*2, 4, 2, 1, biasFalse),nn.BatchNorm2d(64*2, momentum0.1, eps0.8),nn.ReLU(True),nn.ConvTranspose2d(64*2, 64*1, 4, 2, 1, biasFalse),nn.BatchNorm2d(64*1, momentum0.1, eps0.8),nn.ReLU(True),nn.ConvTranspose2d(64*1, 3, 4, 2, 1, biasFalse),nn.Tanh())def forward(self, inputs):noise_vector, label inputslabel_output self.label_conditioned_generator(label)label_output label_output.view(-1, 1, 4, 4)latent_output self.latent(noise_vector)latent_output latent_output.view(-1, 512, 4, 4)concat torch.cat((latent_output, label_output), dim1)image self.model(concat)return imagegenerator Generator().to(device)
generator.apply(weights_init)
print(generator)Generator((label_conditioned_generator): Sequential((0): Embedding(3, 100)(1): Linear(in_features100, out_features16, biasTrue))(latent): Sequential((0): Linear(in_features100, out_features8192, biasTrue)(1): LeakyReLU(negative_slope0.2, inplaceTrue))(model): Sequential((0): ConvTranspose2d(513, 512, kernel_size(4, 4), stride(2, 2), padding(1, 1), biasFalse)(1): BatchNorm2d(512, eps0.8, momentum0.1, affineTrue, track_running_statsTrue)(2): ReLU(inplaceTrue)(3): ConvTranspose2d(512, 256, kernel_size(4, 4), stride(2, 2), padding(1, 1), biasFalse)(4): BatchNorm2d(256, eps0.8, momentum0.1, affineTrue, track_running_statsTrue)(5): ReLU(inplaceTrue)(6): ConvTranspose2d(256, 128, kernel_size(4, 4), stride(2, 2), padding(1, 1), biasFalse)(7): BatchNorm2d(128, eps0.8, momentum0.1, affineTrue, track_running_statsTrue)(8): ReLU(inplaceTrue)(9): ConvTranspose2d(128, 64, kernel_size(4, 4), stride(2, 2), padding(1, 1), biasFalse)(10): BatchNorm2d(64, eps0.8, momentum0.1, affineTrue, track_running_statsTrue)(11): ReLU(inplaceTrue)(12): ConvTranspose2d(64, 3, kernel_size(4, 4), stride(2, 2), padding(1, 1), biasFalse)(13): Tanh())
)from numpy.random import randint, randn
from numpy import linspace
from matplotlib import pyplot, gridspec# 加载训练好的权重
generator.load_state_dict(torch.load(generator_epoch_300.pth), strictFalse)
# 关闭梯度积累
generator.eval()# 生成随机变量
interpolated randn(100)
interpolated torch.tensor(interpolated).to(device).type(torch.float32)# 生成条件变量
label 0 # 生成第0个分类的图像
labels torch.ones(1) * label
labels labels.to(device).unsqueeze(1).long()# 执行生成
predictions generator((interpolated, labels))
predictions predictions.permute(0, 2, 3, 1).detach().cpu()# 屏蔽警告
import warnings
warnings.filterwarnings(ignore)# 设置中文字体
plt.rcParams[font.sans-serif] [SimHei]
# 防止负号无法显示
plt.rcParams[axes.unicode_minus] False
# 设置图的分辨率
plt.rcParams[figure.dpi] 100# 绘图
plt.figure(figsize(8, 3))
pred (predictions[0, :, :, :] 1) * 127.5
pred np.array(pred)
plt.imshow(pred.astype(np.uint8))
plt.show()我们将分类修改为1重新生成一次 总结与心得
在本次实验的过程中我了解了CGAN模型在训练完成后后续如何使用的步骤
保存训练好的生成器的权重使用生成器加载生成随机分布变量用于生成图像生成指定的标签并转换成控制向量执行生成操作
另外关于警告和matplotlib设置中文字体的方式也是经常会用到的技巧。