X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=quizz_machine.py;h=f799bf1c52a133dd6c2970ae80ac1f835143d45c;hb=9f787901b2c7591a323f843ab973fe6abcf6b8ce;hp=43fd868f229e8edb5aeb5d86742cdf564ce7f57b;hpb=6dbc18a5db82b12b06212841426896412e8bd6de;p=culture.git diff --git a/quizz_machine.py b/quizz_machine.py index 43fd868..f799bf1 100755 --- a/quizz_machine.py +++ b/quizz_machine.py @@ -27,7 +27,7 @@ def masked_inplace_autoregression( deterministic_synthesis, forbidden_tokens=None, logit_biases=None, - progress_bar_desc="autoregression", + progress_bar_desc=None, device=torch.device("cpu"), ): assert input.size() == ar_mask.size() @@ -66,25 +66,15 @@ def masked_inplace_autoregression( ###################################################################### -import sky - class QuizzMachine: - def save_image(self, input, result_dir, filename, logger): - img = sky.seq2img(input.to("cpu"), self.height, self.width) - image_name = os.path.join(result_dir, filename) - torchvision.utils.save_image(img.float() / 255.0, image_name, nrow=6, padding=4) - logger(f"wrote {image_name}") - - def save_quizzes(self, input, result_dir, filename_prefix, logger): - self.save_image(input, result_dir, filename_prefix + ".png", logger) - def make_ar_mask(self, input): b = torch.arange(input.size(1), device=input.device) > input.size(1) // 2 return b.long()[None, :].expand_as(input) def __init__( self, + problem, nb_train_samples, nb_test_samples, batch_size, @@ -94,18 +84,12 @@ class QuizzMachine: ): super().__init__() + self.problem = problem self.batch_size = batch_size self.device = device - self.height = 6 - self.width = 8 - - self.train_w_quizzes = sky.generate_seq( - nb_train_samples, height=self.height, width=self.width - ).to(device) - self.test_w_quizzes = sky.generate_seq( - nb_test_samples, height=self.height, width=self.width - ).to(device) + self.train_w_quizzes = self.problem.generate_seq(nb_train_samples).to(device) + self.test_w_quizzes = self.problem.generate_seq(nb_test_samples).to(device) self.nb_codes = max(self.train_w_quizzes.max(), self.test_w_quizzes.max()) + 1 @@ -113,8 +97,8 @@ class QuizzMachine: self.test_c_quizzes = [] if result_dir is not None: - self.save_quizzes( - self.train_w_quizzes[:72], result_dir, f"culture_w_quizzes", logger + self.problem.save_quizzes( + self.train_w_quizzes[:72], result_dir, "culture_w_quizzes" ) def batches(self, split="train", desc=None): @@ -221,11 +205,8 @@ class QuizzMachine: device=self.device, ) - self.save_quizzes( - result[:72], - result_dir, - f"culture_prediction_{n_epoch:04d}_{model.id:02d}", - logger, + self.problem.save_quizzes( + result[:72], result_dir, f"culture_prediction_{n_epoch:04d}_{model.id:02d}" ) return main_test_accuracy @@ -234,9 +215,7 @@ class QuizzMachine: input = self.train_w_quizzes if for_train else self.test_w_quizzes nb = min(nb, input.size(0)) input[:-nb] = input[nb:].clone() - input[-nb:] = sky.generate_seq(nb, height=self.height, width=self.width).to( - self.device - ) + input[-nb:] = self.problem.generate_seq(nb).to(self.device) def store_c_quizzes(self, new_c_quizzes, for_train=True): if for_train: @@ -246,19 +225,19 @@ class QuizzMachine: def create_c_quizzes( self, + nb, + model_for_generation, + models_for_validation, + min_ave_seq_logproba, n_epoch, result_dir, logger, - nb, - model, - other_models, - min_ave_seq_logproba, ): ############################################################### # Generate quizzes with model c_quizzes = torch.empty( - nb, self.height * self.width * 2 + 1, device=self.device, dtype=torch.int64 + nb, self.train_w_quizzes.size(1), device=self.device, dtype=torch.int64 ) ar_mask = torch.full(c_quizzes.size(), 1, device=self.device) @@ -271,46 +250,46 @@ class QuizzMachine: seq_logproba[...] = 0 masked_inplace_autoregression( - model=model, + model=model_for_generation, batch_size=self.batch_size, input=c_quizzes, ar_mask=ar_mask, seq_logproba=seq_logproba, temperature=temperature, deterministic_synthesis=False, - progress_bar_desc="sampling c_quizzes", + # progress_bar_desc="sampling c_quizzes", device=self.device, ) ave_seq_logproba = seq_logproba.mean() - logger(f"{ave_seq_logproba=} {min_ave_seq_logproba=}") - if min_ave_seq_logproba is None: break # Oh man that's ugly - if ave_seq_logproba < min_ave_seq_logproba * 1.1: + if ave_seq_logproba < min_ave_seq_logproba: if d_temperature > 0: d_temperature *= -1 / 3 temperature += d_temperature - elif ave_seq_logproba > min_ave_seq_logproba: + elif ave_seq_logproba > min_ave_seq_logproba * 0.99: if d_temperature < 0: d_temperature *= -1 / 3 temperature += d_temperature else: break - logger(f"chaging temperature to {temperature}") + logger(f"changing temperature to {temperature}") ############################################################### # Create the reverse quizzes - l = self.height * self.width + token_forward, token_backward = self.problem.direction_tokens() + + l = (c_quizzes.size(1) - 1) // 2 direction = c_quizzes[:, l : l + 1] - direction = sky.token_forward * ( - direction == sky.token_backward - ) + sky.token_backward * (direction == sky.token_forward) + direction = self.problem.token_forward * ( + direction == self.problem.token_backward + ) + self.problem.token_backward * (direction == self.problem.token_forward) reverse_c_quizzes = torch.cat( [c_quizzes[:, l + 1 :], direction, c_quizzes[:, :l]], dim=1 ) @@ -324,18 +303,18 @@ class QuizzMachine: nb_correct = [] - for m in other_models: + for model in models_for_validation: result = c_quizzes.clone() masked_inplace_autoregression( - model=m, + model=model, batch_size=self.batch_size, input=result, ar_mask=ar_mask, seq_logproba=seq_logproba, temperature=1.0, deterministic_synthesis=True, - progress_bar_desc="solving c_quizzes", + # progress_bar_desc="solving c_quizzes", device=self.device, ) @@ -344,14 +323,14 @@ class QuizzMachine: reverse_result = reverse_c_quizzes.clone() masked_inplace_autoregression( - model=m, + model=model, batch_size=self.batch_size, input=reverse_result, ar_mask=ar_mask, seq_logproba=seq_logproba, temperature=1.0, deterministic_synthesis=True, - progress_bar_desc="solving reversed c_quizzes", + # progress_bar_desc="solving reversed c_quizzes", device=self.device, )