對於你這個 中文字型風格遷移任務(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
嘗試這種結構。
✅ 總結:
模塊位置 | downconv | upconv | 說明 |
---|---|---|---|
innermost | 3×3 / s=1 | 4×4 / s=2 (建議保留) | 保持解析度 → 再上採樣 |
inner blocks | 4×4 / s=2 | 4×4 / s=2 | 標準 UNet 結構 |
outermost | 4×4 / s=2 | 4×4 / s=2 + Tanh | 邊界輸出層 |
需要我幫你把 innermost
部分改寫成使用 Upsample + Conv2d
的版本嗎?還是你想保持 ConvTranspose2d
?