如何解决关于pytorch减少平均值
我想在自负值重建损失中使用L1loss和BCELoss并采用reduction ='mean'的方式
但是对于所有不同的输入(例如result for landmark
),它会产生相同的结果所以我使用reduce ='sum'会产生正确的结果,即不同的输出用于不同的输入。
我如何使用均值减少?
L1Loss = nn.L1Loss(reduction='mean').to(device)
BCELoss = nn.BCELoss(reduction='mean').to(device)
kld_criterion = KLDLoss(reduction='mean').to(device)
在训练中
rec_m,(rec_f,mean_f,logvar_f),(rec_l,mean_l,logvar_l) = model(origin)
lm_loss = CELoss(rec_l,lm)
f_loss = L1Loss(rec_f,f)
m_loss = CELoss(rec_m,m)
lm_kld_loss = kld_criterion(mean_l,logvar_l)
f_kld_loss = kld_criterion(mean_f,logvar_f)
loss = 4000*(f_loss + m_loss) + 30 * (lm_kld_loss + f_kld_loss) + 2000 * lm_loss
和型号代码
class VAE_NET(nn.Module):
def __init__(self,nc=3,ndf=32,nef=32,nz=128,isize=128,device=torch.device("cuda:0"),is_train=True):
super(VAE_NET,self).__init__()
self.nz = nz
# Encoder
self.l_encoder = Encoder(nc=nc,nef=nef,nz=nz,isize=isize,device=device)
self.f_encoder = Encoder(nc=nc,device=device)
# Decoder
self.l_decoder = Decoder(nc=nc,ndf=ndf,isize=isize)
self.m_decoder = Decoder(nc = nc,ndf = ndf,nz = nz * 2,isize = isize)
self.f_decoder = Decoder(nc = nc,isize = isize)
if is_train == False:
for param in self.encoder.parameters():
param.requires_grad = False
for param in self.decoder.parameters():
param.requires_grad = False
def forward(self,x):
latent_l,logvar_l = self.l_encoder(x)
latent_f,logvar_f = self.f_encoder(x)
concat_latent = torch.cat((latent_l,latent_f),1)
rec_l = self.l_decoder(latent_l)
rec_m = self.m_decoder(concat_latent)
rec_f = self.f_decoder(concat_latent)
return rec_m,latent_l)
l用于面部表情
m是口罩
f是面部部分
解决方法
reduction='sum'
和reduction='mean'
的区别仅在于标量倍数。从我的角度来看,您的实现没有错。如果您的模型仅使用reduction='sum'
产生正确的结果,则可能是您的学习率太低(sum
通过放大梯度来弥补这种差异)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。