pytorch-book
pytorch-book copied to clipboard
第七章: 生成对抗网络
您好: 第七章的main.py的errord_meter.reset()没理解为什么是在保存模型的时候才重置?我的理解是每一个epoch有一个error,应该在每一个epoch开始前就reset。另外,对于在一个epoch的某个batch中进行画error,我也不是很理解这种做法,在第六章的时候我也保留了这个疑问,是我在哪里遗漏了什么?
可以每一个epoch都重置,不过我觉得没有必要频繁重置,尤其是在一个epoch的迭代次数比较少的情况下。每重置一次,都要重新计算均值,噪声比较大。
懂了, 让其光滑一些,计算均值时引入的噪声的少一些,因为一个epoch的下的图片没有那么多。 谢谢。
还有一个问题,是在
if opt.vis and ii % opt.plot_every == opt.plot_every - 1:
## 可视化
if os.path.exists(opt.debug_file):
ipdb.set_trace()
fix_fake_imgs = netg(fix_noises)
vis.images(fix_fake_imgs.data.cpu().numpy()[:64] * 0.5 + 0.5, win='fixfake')
vis.images(real_img.data.cpu().numpy()[:64] * 0.5 + 0.5, win='real')
求fix_fake_imgs的时候,我想问是否需要写 netg.eval()?因为我感觉这里是相当于在固定的噪声上验证这个模型的好坏,因为它既不是在训练, 也不是在测试。虽然这个好坏的评价指标是判别器的输出,而非平常意义上的正确率。
第二个问题,我是否可以把generate这个函数视为test,是在对训练好的进行进行测试。因为此时的噪声也就是数据是新的,与之前的数据集不一样。不知道这么理解对不对?
还有一个问题是在保存模型的时候,重新生成了优化器,这是什么原理?因为在第六章的时候没有优化器重新生成这个说法,一直都是一个优化器在用,是因为beta吗?
1
fix_fake_imgs的时候,我想问是否需要写 netg.eval()
写了更好,不过这边可能影响不是很大
2
我是否可以把generate这个函数视为test,是在对训练好的进行进行测试。
可以这么理解
3
在保存模型的时候,重新生成了优化器,
没必要,我已经删除了,当初本想做梯度衰减,即使如此还是可以不用创建新的优化器
- 你说的梯度衰减是指学习率衰减吗? 学习率衰减是不是通过构建新的优化器的更快一些,比第六章的在优化器的各个参数重新设计学习率更好一些? 2.我刚刚想通了为什么要分别设计生成模型和判别模型的优化器?我的理解是为了在固定判别器训练生成器的时候只对生成器的参数进行训练的时候方便,不知道这么理解对不对? 另外,我的想法是如果是两个优化器,那么在固定生成器训练判别器的时候,判别器优化器进行反向传播的时候,应该不会涉及到生成模型的参数的变动才对,因为判别器优化器里没有生成器的参数。
fake_img = netg(noises).detach()
fake_output = netd(fake_img)
error_d_fake = criterion(fake_output, fake_labels)
error_d_fake.backward()
optimizer_d.step()
应该写成
fake_img = netg(noises)
fake_output = netd(fake_img)
error_d_fake = criterion(fake_output, fake_labels)
error_d_fake.backward()
optimizer_d.step()
这里不需要detach。不知道理解上我哪里出现了错误? 谢谢
我刚刚试了试detach,我的 方法应该是可行的。 不知道你的理解是什么?
我刚刚想了想优化器的事情,重构优化器会使得里面的隐含变量,比如Adam的v和m重新初始化,所以我觉得重构优化器和直接学习率下降是两个不一样的事情,不知道这么理解对不对?
@TJJTJJTJJ detach play the role of tf.stop_gradient() in tensorflow, prevent gradient computing, in this way save memory and gpu/cpu
https://discuss.pytorch.org/t/whats-the-difference-between-variable-detach-and-variable-clone/10758/5
https://stackoverflow.com/questions/51529974/tensorflow-stop-gradient-equivalent-in-pytorch
File "main.py", line 149, in train tv.utils.save_image(fix_fake_imgs.data[:64], '%s/%s.png' % (opt.save_path, epoch), normalize=True, range=(-1, 1)) UnboundLocalError: local variable 'fix_fake_imgs' referenced before assignment为什么会显示这种错误的?
fix_fake_imgs, 你看一下这句话之前是否有执行fix_fake_imgs=之类的语句,这是指还没有赋值就引用
我刚刚试了试detach,我的 方法应该是可行的。 不知道你的理解是什么?
可以省去计算生成器的梯度
File "main.py", line 149, in train tv.utils.save_image(fix_fake_imgs.data[:64], '%s/%s.png' % (opt.save_path, epoch), normalize=True, range=(-1, 1)) UnboundLocalError: local variable 'fix_fake_imgs' referenced before assignment为什么会显示这种错误的?
能否问一下你是怎么解决的么
fix_fake_imgs, 你看一下这句话之前是否有执行fix_fake_imgs=之类的语句,这是指还没有赋值就引用
可以每一个epoch都重置,不过我觉得没有必要频繁重置,尤其是在一个epoch的迭代次数比较少的情况下。每重置一次,都要重新计算均值,噪声比较大。
请问,errord_meter就是用来做显示loss方便,不是用来优化网络的吧?如果是,那么多一些、少一些,计算量几乎可以忽略吧。
File "main.py", line 149, in train tv.utils.save_image(fix_fake_imgs.data[:64], '%s/%s.png' % (opt.save_path, epoch), normalize=True, range=(-1, 1)) UnboundLocalError: local variable 'fix_fake_imgs' referenced before assignment为什么会显示这种错误的?
那个问题你解决了吗
我在报错那句前面加了
fix_fake_imgs = netg(fix_noises)
运行成功了
if ii % opt.d_every == 0: # 训练判别器 optimizer_d.zero_grad() ## 尽可能的把真图片判别为正确 output = netd(real_img) error_d_real = criterion(output, true_labels) error_d_real.backward()
## 尽可能把假图片判别为错误
noises.data.copy_(t.randn(opt.batch_size, opt.nz, 1, 1))
fake_img = netg(noises).detach() # 根据噪声生成假图
output = netd(fake_img)
error_d_fake = criterion(output, fake_labels)
error_d_fake.backward()
optimizer_d.step()
在训练判别器的时候,为什么在对真图片进行判别时只进行backward,而在对假图片进行判别时进行了backward和step???