UNet 結構在處理奇數高寬圖像時避免因為上下層不對齊而產生維度 mismatch

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

發佈留言

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