下採樣 (downconv) / 上採樣 (upconv) 對 feature map 的影響

對於你這個 中文字型風格遷移任務(Noto Sans → Zen Maru Gothic),在 innermost 區塊中:


建議維持 upconv 使用 kernel_size=4, stride=2

原因如下:

1. 下採樣 (downconv) 使用 kernel=3, stride=1 → 並未改變 feature map 大小

  • 表示此層僅是進行特徵擷取(提取 bottleneck 表徵),並不負責空間縮放
  • 這樣的 innermost block 更像是一個“中介處理”層。

2. 上採樣 (upconv) 使用 kernel=4, stride=2 → 對 feature map 進行放大

  • 這是 U-Net 經典的上採樣方式,能穩定地把空間大小 x2,搭配 skip connection 更容易重建高頻資訊。
  • 若你改成 kernel=3, stride=1,那就無法執行上採樣(輸出尺寸將不變),U-Net decoder 就會無法恢復解析度。

✅ 正確做法是:

  • innermost
    • downconv: kernel=3, stride=1 → 保持解析度不變(特徵提取)
    • upconv: kernel=4, stride=2 → 解析度放大 2 倍(還原圖像細節)

✨ 額外建議(進階):

若你想更細緻控制 innermost 輸出的空間分布,有兩種方式可以取代標準 ConvTranspose2d 上採樣:

選項 A:改為 F.interpolate + Conv2d

up = nn.Sequential(
    uprelu,
    nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False),
    nn.Conv2d(inner_nc, outer_nc, kernel_size=3, stride=1, padding=1),
    upnorm
)
  • 優點:不會出現 deconvolution checkerboard 偏差
  • 缺點:少了參數化上採樣的能力(但通常這樣更穩定)

選項 B:使用 PixelShuffle(sub-pixel convolution)

若你更注重重建細節品質,可以在 innermost 嘗試這種結構。


✅ 總結:

模塊位置downconvupconv說明
innermost3×3 / s=14×4 / s=2 (建議保留)保持解析度 → 再上採樣
inner blocks4×4 / s=24×4 / s=2標準 UNet 結構
outermost4×4 / s=24×4 / s=2 + Tanh邊界輸出層

需要我幫你把 innermost 部分改寫成使用 Upsample + Conv2d 的版本嗎?還是你想保持 ConvTranspose2d

發佈留言

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