进入到net之中之后,处理图像总是会遇到奇奇怪怪的问题
因为loss函数的问题,该loss为了使生成的两个描述细节上不一样的,本来在jupyter notebook上能运行的,搬到程序里面跑就出不来了。
AssertionError: nn criterions don't compute the gradient w.r.t. targets - please mark these variables as volatile or not requiring gradients
找了资料,说对target.detach(),之后就没有这个错误了。
image.pngAttributeError: 'MDGNModel' object has no attribute 'module'
出错误的地方在:我的MDGNModel中:
loss_dict = dict(zip(net.module.loss_names, losses))
我调用loss的时候参考着源代码写的,对于module没有仔细了解
image.png
在M_model中加入了这两句话之后就有了module,没有loss_name了。
现在把loss函数放在train代码中试试:
删除了这两行代码,用了最简单的方式:
real = Variable(data['image']).cuda()
mdgn1,mdgn2 = netM(real)
upsample = torch.nn.Upsample(scale_factor=8, mode='bilinear')
up1 = upsample(mdgn1)
up2 = upsample(mdgn2)
params = list(netM.parameters())
optimizer = torch.optim.Adam(params, lr=0.0002, betas=(0.9, 0.999))
loss_M_SSIM = -ssim_loss(real, up1) - ssim_loss(real, up2)
loss_M_DIS = -criterionDIS(mdgn1.detach(), mdgn2.detach()) * 0.1
loss = loss_M_SSIM + loss_M_DIS
optimizer.zero_grad()
loss.backward()
其中对DIS求loss的时候总是出错误,改成了detach就可以了。
5.23号:
开启保存图像和保存模型之路:
image.png
错误代码:
RuntimeError: can't convert CUDA tensor to numpy (it doesn't support GPU arrays). Use .cpu() to move the tensor to host memory first.
在data之后加入.cpu就可以了
但是在转入numpy之后依旧不可用,所以转成了tensor。因为我的tensor是四维的,而toPIL的tensor需要三维,所以出现了该错误:
TypeError: pic should be Tensor or ndarray. Got <class 'torch.cuda.FloatTensor'>.
之后
up2_tensor = up1_tensor[0]
转换成PIL类型的图像之后,可以直接save。
5.27号保存模型
两种办法:
- 保存模型
torch.save(net,'net.pkl') - 保存网络参数:
torch.save(net.sate_dict(),'params.pkl')
torch.save保存成一个序列化字典,可以保存网络,网络参数,优化器参数,最后给定一个PATH,
torch.load()即可加载模型。
网友评论