Exponential Moving Average (EMA, 指數移動平均)

以下內容是 google antigravity 產生, 雖然是回覆繁體中文, 但單字使用了”魯棒性” 應該是訓練資料裡, 簡體中文占了大部份造成.

AI寫出來的程式還是有機會發生邏輯的錯誤.


Proposed Changes

Model Architecture (model/model.py, utils/)

[MODIFY] model.py

  • Add EMA Class: Implement a helper class to handle model weight averaging.
  • Modify Zi2ZiModel:
    • Initialize EMA shadow model in init.
    • Update EMA weights in optimize_parameters.
    • Use EMA weights for validation/inference if enabled.
  • Modify UnetSkipConnectionBlock:
    • Implement/Integrate BlurPool (Anti-aliased downsampling) to replace standard strided convolution when a specific flag (e.g., d_blur or new flag) is set.

Training Script (train.py)

[MODIFY] train.py

  • Add arguments for EMA decay (e.g., --ema_decay 0.999).
  • Ensure EMA model is saved during checkpoints (or swapped in).

Inference Script (infer.py)

[MODIFY] infer.py

  • Support loading the EMA version of the model if available/specified.

Verification Plan

Manual Verification

  • Run a short training loop (e.g., 100 steps) to ensure BlurPool and EMA update logic runs without errors.
  • Compare generated samples from standard model vs. EMA model to verify visual quality (EMA should be less noisy).

需求「更穩定的上採樣/下採樣」以及「更好的推論效果」,我已經為您的專案實作了兩項核心技術:

  1. Exponential Moving Average (EMA, 指數移動平均)
    • 原理: 在訓練過程中,模型權重會不斷更新震盪。EMA 會維護一份「影子權重」(Shadow Weights),它是過去一段時間權重的平滑平均值。
    • 效果: 使用 EMA 權重進行推論,通常能產生更平滑、噪點更少、且更穩定的圖像,顯著提升最終生成品質。
    • 使用方式:
      • 訓練時加入參數: --ema_decay 0.999 (預設已開啟)。
      • 推論時,程式會自動偵測並優先載入 EMA 權重 (_net_G_EMA.pth)。若無 EMA 權重則載入一般權重。
  2. Anti-aliased Downsampling (BlurPool, 抗鋸齒下採樣)
    • 原理: 傳統的 Stride=2 卷積會直接丟棄資訊,容易導致「混疊效應」(Aliasing),使得模型對圖像的微小位移非常敏感(不穩定)。我引入了 BlurPool 層,在下採樣前先進行低通濾波(模糊化)。
    • 效果: 提升模型對特徵位置變化的魯棒性,讓訓練收斂更穩定,生成的線條結構會更紮實。
    • 使用方式:
      • 訓練與推論時加上參數: --g_blur (針對生成器) 或 --d_blur (針對判別器)。建議至少對 Generator 開啟 (--g_blur)。

已修改的檔案:

  • model/model.py: 新增 EMA 與 BlurPool 類別,並整合至 Zi2ZiModel 與 UNetGenerator。
  • train.py: 新增 --ema_decay 參數,並在 checkpoint 時保存 EMA 權重。
  • infer.py: 支援載入 EMA 權重,新增 --g_blur 與 --d_blur 參數以配合模型架構。

建議的訓練指令範例:

python train.py --experiment_dir experiments/run1 --gpu_ids 0 --batch_size 16 --epoch 50 --g_blur --ema_decay 0.999

建議的推論指令範例:

python infer.py --experiment_dir experiments/run1 --gpu_ids 0 --batch_size 16 --resume latest --g_blur

(註:若訓練時使用了 

--g_blur

,推論時也必須加上該參數以維持架構一致)


train.py: error: unrecognized arguments: –use_ema

Analyzed train.py#L1-233

我了解這個錯誤的原因。這是因為我沒有新增 

--use_ema

 這個參數到 

argparse

 中,但在之前的說明或內部邏輯中可能暗示了它的存在。實際上,我在 model.py 中是透過 

ema_decay

 的值來決定是否啟用 EMA 的(通常直接啟用,或加上一個內部開關),而在 train.py 中,我只加了 

--ema_decay

您遇到的錯誤 

train.py: error: unrecognized arguments: --use_ema

 表示您在執行命令時加上了 

--use_ema

,但程式碼並不認得這個參數。

修正方案: 我不需要在 

train.py 中新增 

--use_ema

,因為目前的實作是只要是訓練模式 (

is_training=True

) 就會預設啟用 EMA (參考 model.py 的邏輯:

if self.is_training: self.netG_EMA = EMA(...); self.use_ema = True

)。

您只需要從您的執行指令中移除 

--use_ema

 即可。

正確的訓練指令範例:

python train.py --experiment_dir experiments/run1 --gpu_ids 0 --batch_size 16 --epoch 50 --g_blur --ema_decay 0.999

(請注意:不需要也不能加 

--use_ema

)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *