為了確保在遇到奇數尺寸圖像時能對齊 encoder 和 decoder 輸出,我們需要在 ConvTranspose2d
加入 output_padding=1
。這個參數讓 decoder 在需要時多補一個 pixel,解決上採樣尺寸偏小的問題。
以下是你需要修改的地方:
✅ 修改 UnetSkipConnectionBlock
中所有 ConvTranspose2d
:
✅ 原本:
upconv = nn.ConvTranspose2d(..., kernel_size=4, stride=2, padding=1, bias=use_bias)
🔁 修改後:
upconv = nn.ConvTranspose2d(..., kernel_size=4, stride=2, padding=1, output_padding=1, bias=use_bias)
✨ 整體替換建議(只需改 ConvTranspose2d
部分即可):
✅ outermost
:
upconv = nn.ConvTranspose2d(inner_nc * 2, outer_nc, kernel_size=4, stride=2, padding=1, output_padding=1, bias=use_bias)
✅ innermost
:
upconv = nn.ConvTranspose2d(inner_nc + embedding_dim, outer_nc, kernel_size=4, stride=2, padding=1, output_padding=1, bias=use_bias)
✅ 中間層:
upconv = nn.ConvTranspose2d(inner_nc * 2, outer_nc, kernel_size=4, stride=2, padding=1, output_padding=1, bias=use_bias)
這樣就可以讓你的 UNet 結構在處理奇數高寬圖像時避免因為上下層不對齊而產生維度 mismatch。
要我直接幫你貼出改好的 UnetSkipConnectionBlock
嗎?