目錄

1140930 meeting

目錄

本次構想如何嵌入 autoFRK 模型至 SSSD 模型中,現決定由以下方式入手:

預計加入 autoFRK 的程式碼如下,位於 SSSD 模型中的 /sssd/training/trainer.py 檔案。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class DiffusionTrainer:
    ...
    
    def _train_per_epoch(self) -> torch.Tensor:
        for (batch,) in tqdm(self.dataloader):
            batch = batch.to(self.device)
            mask = self._update_mask(batch)
            loss_mask = ~mask.bool()

            batch = batch.permute(0, 2, 1)
            assert batch.size() == mask.size() == loss_mask.size()

            self.optimizer.zero_grad()
            loss = training_loss(
                model=self.net,
                loss_function=nn.MSELoss(),
                training_data=(batch, batch, mask, loss_mask),
                diffusion_parameters=self.diffusion_hyperparams,
                generate_only_missing=self.only_generate_missing,
                device=self.device,
            )
            loss.backward()
            self.optimizer.step()
        # autoFRK step
        # calculate loss from autoFRK
        # backward step
            #loss.backward()
            #self.optimizer.step()
        return loss

為嵌入 autoFRK 模型,此處應檢查的部分如下:

  1. 應檢查 loss 回傳值屬於數值矩陣(初步檢查後,應為單一數值)。
  2. 檢查如何使用目前參數進行 SSSD 預測,方便後續預測後由 autoFRK 插值。
  3. 運用模組嵌入 autoFRK ,並回傳未知地點之插值,同時計算 loss 。
  4. 檢查是否需進行 loss.backward()self.optimizer.step() 步驟(應該要做,否則無法透過梯度更新參數)。

目前修改的想法先由 ChatGPT 代勞,寫出修改大綱如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
def _train_per_epoch(self) -> torch.Tensor:
    # Step 1: 正常 batch 訓練
    for (batch,) in tqdm(self.dataloader):
        batch = batch.to(self.device)
        mask = self._update_mask(batch)
        loss_mask = ~mask.bool()

        batch = batch.permute(0, 2, 1)
        assert batch.size() == mask.size() == loss_mask.size()

        self.optimizer.zero_grad()
        loss = training_loss(
            model=self.net,
            loss_function=nn.MSELoss(),
            training_data=(batch, batch, mask, loss_mask),
            diffusion_parameters=self.diffusion_hyperparams,
            generate_only_missing=self.only_generate_missing,
            device=self.device,
        )
        loss.backward()
        self.optimizer.step()

    # Step 2: 用更新後的參數做完整 sampling 預測
    with torch.no_grad():
        generated_series = sampling(
            net=self.net,
            size=batch.shape,  # 用最後一個 batch 的 shape
            diffusion_hyperparams=self.diffusion_hyperparams,
            cond=batch,
            mask=mask,
            only_generate_missing=self.only_generate_missing,
            device=self.device,
        )

    # Step 3: autoFRK 填補未知區域
    # TODO: 把 generated_series, batch, mask 丟給 autoFRK
    # imputed_series = autoFRK(generated_series, mask, ...)

    imputed_series = generated_series  # 暫時直接用 sampling 的結果

    # Step 4: 用填補後的結果計算未知區域 loss
    self.optimizer.zero_grad()
    loss = nn.MSELoss()(
        imputed_series[~mask.bool()],
        batch[~mask.bool()]
    )

    # Step 5: 更新參數
    loss.backward()
    self.optimizer.step()

    return loss