if args.b_distribution == 'none': att_b_ = (att_b * 2 - 1) * args.thres_int if args.b_distribution == 'uniform': att_b_ = (att_b * 2 - 1) * \ torch.rand_like(att_b) * \ (2 * args.thres_int) if args.b_distribution == 'truncated_normal': att_b_ = (att_b * 2 - 1) * \ (torch.fmod(torch.randn_like(att_b), 2) + 2) / 4.0 * \ (2 * args.thres_int) if (it+1) % (args.n_d+1) != 0: errD = attgan.trainD(img_a, att_a, att_a_, att_b, att_b_) add_scalar_dict(writer, errD, it+1, 'D') else: errG = attgan.trainG(img_a, att_a, att_a_, att_b, att_b_) add_scalar_dict(writer, errG, it+1, 'G') progressbar.say(epoch=epoch, iter=it+1, d_loss=errD['d_loss'], g_loss=errG['g_loss'])
时间: 2024-04-21 15:24:41 浏览: 94
这段代码包含了两个条件语句块。
第一个条件语句块根据命令行参数 `args.b_distribution` 的值选择不同的属性 B 分布。如果 `args.b_distribution` 的值为 `'none'`,则执行第一个条件分支。在该分支中,通过 `(att_b * 2 - 1) * args.thres_int` 对属性 B 进行归一化处理,将其缩放到 -`args.thres_int` 到 `args.thres_int` 的范围内。
如果 `args.b_distribution` 的值为 `'uniform'`,则执行第二个条件分支。在该分支中,先通过 `(att_b * 2 - 1)` 对属性 B 进行归一化处理,然后使用 `torch.rand_like(att_b)` 生成与属性 B 相同形状的随机张量,并且每个元素的值在 [0, 1) 的范围内。最后,通过 `(2 * args.thres_int)` 将随机张量缩放到 -`args.thres_int` 到 `args.thres_int` 的范围内。
如果 `args.b_distribution` 的值为 `'truncated_normal'`,则执行第三个条件分支。在该分支中,先通过 `(att_b * 2 - 1)` 对属性 B 进行归一化处理,然后使用 `torch.fmod(torch.randn_like(att_b), 2) + 2` 生成一个符合截断正态分布的随机张量,然后除以 4.0 进行归一化处理。最后,通过 `(2 * args.thres_int)` 将随机张量缩放到 -`args.thres_int` 到 `args.thres_int` 的范围内。
接下来,根据 `(it+1) % (args.n_d+1) != 0` 的条件判断选择执行训练判别器或者生成器的代码块。
如果条件为真,则执行训练判别器的代码块。调用 `attgan.trainD()` 对判别器进行训练,传入图像数据 `img_a`、属性数据 `att_a`、处理后的属性数据 `att_a_`、属性数据 `att_b` 和处理后的属性数据 `att_b_`。将得到的误差值 `errD` 通过 `add_scalar_dict()` 添加到摘要信息中,并指定摘要信息的名称为 `'D'`。
如果条件为假,则执行训练生成器的代码块。调用 `attgan.trainG()` 对生成器进行训练,传入相同的参数。将得到的误差值 `errG` 通过 `add_scalar_dict()` 添加到摘要信息中,并指定摘要信息的名称为 `'G'`。然后,通过 `progressbar.say()` 打印出当前 epoch、迭代次数、判别器损失和生成器损失。
总结起来,这段代码根据命令行参数选择不同的属性 B 分布,并对属性数据进行归一化处理。然后,根据迭代次数的奇偶性选择训练判别器或者生成器,并将得到的误差值记录到摘要信息中。最后,打印出当前的训练进度和损失值。
阅读全文