请人做竞价网站的要求重点,ftp网站建设,2023 个人主页html源码,h5手机制作网站开发Mindspore框架#xff1a;CycleGAN模型实现图像风格迁移算法
Mindspore框架CycleGAN模型实现图像风格迁移|#xff08;一#xff09;CycleGAN神经网络模型构建 Mindspore框架CycleGAN模型实现图像风格迁移|#xff08;二#xff09;实例数据集#xff08;苹果2橘子…Mindspore框架CycleGAN模型实现图像风格迁移算法
Mindspore框架CycleGAN模型实现图像风格迁移|一CycleGAN神经网络模型构建 Mindspore框架CycleGAN模型实现图像风格迁移|二实例数据集苹果2橘子 Mindspore框架CycleGAN模型实现图像风格迁移|三损失函数计算 Mindspore框架CycleGAN模型实现图像风格迁移|四CycleGAN模型训练 Mindspore框架CycleGAN模型实现图像风格迁移|五CycleGAN模型推理与资源下载
1. 损失函数计算
CycleGAN 网络本质上是由两个镜像对称的 GAN 网络组成。 运算流程
CycleGAN网络运转流程图中苹果图片 经过生成器 得到伪橘子 ̂ 然后将伪橘子 ̂ 结果送进生成器 又产生苹果风格的结果 ̂ 最后将生成的苹果风格结果 ̂ 与原苹果图片 一起计算出循环一致损失。
对生成器 及其判别器 : x- () 目标损失函数定义为: 其中 试图生成看起来与 中的图像相似的图像 ()而 的目标是区分翻译样本 () 和真实样本 生成器的目标是最小化这个损失函数以此来对抗判别器。即
对生成器G到F x- () -F( ())
这种循环损失计算会捕捉这样的直觉即如果我们从一个域转换到另一个域然后再转换回来我们应该到达我们开始的地方。
2.损失函数实现
# GAN网络损失函数这里最后一层不使用sigmoid函数
loss_fn nn.MSELoss(reductionmean)
l1_loss nn.L1Loss(mean)def gan_loss(predict, target):target ops.ones_like(predict) * targetloss loss_fn(predict, target)return loss生成器网络和判别器网络的优化器
# 构建生成器优化器
optimizer_rg_a nn.Adam(net_rg_a.trainable_params(), learning_rate0.0002, beta10.5)
optimizer_rg_b nn.Adam(net_rg_b.trainable_params(), learning_rate0.0002, beta10.5)
# 构建判别器优化器
optimizer_d_a nn.Adam(net_d_a.trainable_params(), learning_rate0.0002, beta10.5)
optimizer_d_b nn.Adam(net_d_b.trainable_params(), learning_rate0.0002, beta10.5)
3. 模型前向计算损失的过程
import mindspore as ms# 前向计算def generator(img_a, img_b):fake_a net_rg_b(img_b)fake_b net_rg_a(img_a)rec_a net_rg_b(fake_b)rec_b net_rg_a(fake_a)identity_a net_rg_b(img_a)identity_b net_rg_a(img_b)return fake_a, fake_b, rec_a, rec_b, identity_a, identity_blambda_a 10.0
lambda_b 10.0
lambda_idt 0.5# 生成器
def generator_forward(img_a, img_b):true Tensor(True, dtype.bool_)fake_a, fake_b, rec_a, rec_b, identity_a, identity_b generator(img_a, img_b)loss_g_a gan_loss(net_d_b(fake_b), true)loss_g_b gan_loss(net_d_a(fake_a), true)loss_c_a l1_loss(rec_a, img_a) * lambda_aloss_c_b l1_loss(rec_b, img_b) * lambda_bloss_idt_a l1_loss(identity_a, img_a) * lambda_a * lambda_idtloss_idt_b l1_loss(identity_b, img_b) * lambda_b * lambda_idtloss_g loss_g_a loss_g_b loss_c_a loss_c_b loss_idt_a loss_idt_breturn fake_a, fake_b, loss_g, loss_g_a, loss_g_b, loss_c_a, loss_c_b, loss_idt_a, loss_idt_bdef generator_forward_grad(img_a, img_b):_, _, loss_g, _, _, _, _, _, _ generator_forward(img_a, img_b)return loss_g# 判别器
def discriminator_forward(img_a, img_b, fake_a, fake_b):false Tensor(False, dtype.bool_)true Tensor(True, dtype.bool_)d_fake_a net_d_a(fake_a)d_img_a net_d_a(img_a)d_fake_b net_d_b(fake_b)d_img_b net_d_b(img_b)loss_d_a gan_loss(d_fake_a, false) gan_loss(d_img_a, true)loss_d_b gan_loss(d_fake_b, false) gan_loss(d_img_b, true)loss_d (loss_d_a loss_d_b) * 0.5return loss_ddef discriminator_forward_a(img_a, fake_a):false Tensor(False, dtype.bool_)true Tensor(True, dtype.bool_)d_fake_a net_d_a(fake_a)d_img_a net_d_a(img_a)loss_d_a gan_loss(d_fake_a, false) gan_loss(d_img_a, true)return loss_d_adef discriminator_forward_b(img_b, fake_b):false Tensor(False, dtype.bool_)true Tensor(True, dtype.bool_)d_fake_b net_d_b(fake_b)d_img_b net_d_b(img_b)loss_d_b gan_loss(d_fake_b, false) gan_loss(d_img_b, true)return loss_d_b# 保留了一个图像缓冲区用来存储之前创建的50个图像
pool_size 50
def image_pool(images):num_imgs 0image1 []if isinstance(images, Tensor):images images.asnumpy()return_images []for image in images:if num_imgs pool_size:num_imgs num_imgs 1image1.append(image)return_images.append(image)else:if random.uniform(0, 1) 0.5:random_id random.randint(0, pool_size - 1)tmp image1[random_id].copy()image1[random_id] imagereturn_images.append(tmp)else:return_images.append(image)output Tensor(return_images, ms.float32)if output.ndim ! 4:raise ValueError(img should be 4d, but get shape {}.format(output.shape))return output4.计算梯度和反向传播
from mindspore import value_and_grad# 实例化求梯度的方法
grad_g_a value_and_grad(generator_forward_grad, None, net_rg_a.trainable_params())
grad_g_b value_and_grad(generator_forward_grad, None, net_rg_b.trainable_params())grad_d_a value_and_grad(discriminator_forward_a, None, net_d_a.trainable_params())
grad_d_b value_and_grad(discriminator_forward_b, None, net_d_b.trainable_params())# 计算生成器的梯度反向传播更新参数
def train_step_g(img_a, img_b):net_d_a.set_grad(False)net_d_b.set_grad(False)fake_a, fake_b, lg, lga, lgb, lca, lcb, lia, lib generator_forward(img_a, img_b)_, grads_g_a grad_g_a(img_a, img_b)_, grads_g_b grad_g_b(img_a, img_b)optimizer_rg_a(grads_g_a)optimizer_rg_b(grads_g_b)return fake_a, fake_b, lg, lga, lgb, lca, lcb, lia, lib# 计算判别器的梯度反向传播更新参数
def train_step_d(img_a, img_b, fake_a, fake_b):net_d_a.set_grad(True)net_d_b.set_grad(True)loss_d_a, grads_d_a grad_d_a(img_a, fake_a)loss_d_b, grads_d_b grad_d_b(img_b, fake_b)loss_d (loss_d_a loss_d_b) * 0.5optimizer_d_a(grads_d_a)optimizer_d_b(grads_d_b)return loss_d