def train_generator_step(self, configuration: Configuration, metadata: Metadata, architecture: Architecture) -> float: # clean previous gradients architecture.generator_optimizer.zero_grad() # conditional if "conditional" in architecture.arguments: # for now uniform distribution is used but could be controlled in a different way # also this works for both binary and categorical dependent variables number_of_conditions = metadata.get_dependent_variable().get_size() condition = to_gpu_if_available(FloatTensor(configuration.batch_size).uniform_(0, number_of_conditions)) # non-conditional else: condition = None # generate a full batch of fake features fake_features = self.sample_fake(architecture, configuration.batch_size, condition=condition) # calculate loss loss = architecture.generator_loss(architecture, fake_features, condition=condition) # calculate gradients loss.backward() # update the generator weights architecture.generator_optimizer.step() # return the loss return to_cpu_if_was_in_gpu(loss).item()
def train_generator_step(configuration: Configuration, metadata: Metadata, architecture: Architecture, batch: Batch) -> float: # clean previous gradients architecture.generator_optimizer.zero_grad() # generate a batch of fake features with the same size as the real feature batch generated = architecture.generator(batch["features"], missing_mask=batch["missing_mask"]) # replace the missing features by the generated imputed = compose_with_mask( mask=batch["missing_mask"], differentiable=True, # now there are no NaNs and this should be used where_one=generated, where_zero=batch["raw_features"]) # generate hint hint = generate_hint(batch["missing_mask"], configuration.hint_probability, metadata) # calculate loss loss = architecture.generator_loss(architecture=architecture, features=batch["raw_features"], generated=generated, imputed=imputed, hint=hint, non_missing_mask=inverse_mask( batch["missing_mask"])) # calculate gradients loss.backward() # update the generator weights architecture.generator_optimizer.step() # return the loss return to_cpu_if_was_in_gpu(loss).item()