DecoderTrainer sample method uses the exponentially moving averaged

This commit is contained in:
Phil Wang
2022-04-30 14:55:34 -07:00
parent 63195cc2cb
commit ebe01749ed
3 changed files with 24 additions and 2 deletions

View File

@@ -144,6 +144,10 @@ class DecoderTrainer(nn.Module):
self.max_grad_norm = max_grad_norm
@property
def unets(self):
return nn.ModuleList([ema.ema_model for ema in self.ema_unets])
def scale(self, loss, *, unet_number):
assert 1 <= unet_number <= self.num_unets
index = unet_number - 1
@@ -169,6 +173,18 @@ class DecoderTrainer(nn.Module):
ema_unet = self.ema_unets[index]
ema_unet.update()
@torch.no_grad()
def sample(self, *args, **kwargs):
if self.use_ema:
trainable_unets = self.decoder.unets
self.decoder.unets = self.unets # swap in exponential moving averaged unets for sampling
output = self.decoder.sample(*args, **kwargs)
if self.use_ema:
self.decoder.unets = trainable_unets # restore original training unets
return output
def forward(
self,
x,