為了確保在遇到奇數尺寸圖像時能對齊 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 嗎?