Upsample¶
- class torch.nn.Upsample(size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)[source][source]¶
對給定的多通道 1D(時序)、2D(空間)或 3D(體素)資料進行上取樣。
輸入資料假定為 minibatch x channels x [可選深度] x [可選高度] x 寬度 的形式。因此,對於空間輸入,我們期望一個 4D Tensor;對於體素輸入,我們期望一個 5D Tensor。
可用於上取樣的演算法包括最近鄰插值,以及分別用於 3D、4D 和 5D 輸入 Tensor 的線性插值、雙線性插值、雙三次插值和三線性插值。
可以提供一個
scale_factor或目標輸出size來計算輸出尺寸。(兩者不能同時提供,因為存在歧義)- 引數
size (int 或 Tuple[int] 或 Tuple[int, int] 或 Tuple[int, int, int], 可選) – 輸出空間尺寸
scale_factor (float 或 Tuple[float] 或 Tuple[float, float] 或 Tuple[float, float, float], 可選) – 空間尺寸的乘數。如果是元組,則必須與輸入尺寸匹配。
mode (str, 可選) – 上取樣演算法:可以是
'nearest','linear','bilinear','bicubic', 或'trilinear'之一。預設值:'nearest'align_corners (bool, 可選) – 如果為
True,則輸入和輸出 Tensor 的角畫素對齊,從而保留這些畫素的值。這僅在mode為'linear','bilinear','bicubic', 或'trilinear'時有效。預設值:Falserecompute_scale_factor (bool, 可選) – 重新計算用於插值計算的 scale_factor。如果 recompute_scale_factor 為
True,則必須傳入 scale_factor,並使用 scale_factor 計算輸出 size。計算得到的輸出 size 將用於推斷插值的新比例。請注意,當 scale_factor 是浮點數時,由於四捨五入和精度問題,它可能與重新計算的 scale_factor 不同。如果 recompute_scale_factor 為False,則 size 或 scale_factor 將直接用於插值。
- 形狀
輸入:、 或
輸出:、 或 ,其中
警告
當
align_corners = True時,線性插值模式(linear、bilinear、bicubic 和 trilinear)不會按比例對齊輸出和輸入畫素,因此輸出值可能取決於輸入尺寸。這在 0.3.1 版本之前是這些模式的預設行為。從那時起,預設行為是align_corners = False。有關這如何影響輸出的具體示例,請參見下文。注意
如果需要下采樣/通用尺寸調整,應使用
interpolate()。示例
>>> input = torch.arange(1, 5, dtype=torch.float32).view(1, 1, 2, 2) >>> input tensor([[[[1., 2.], [3., 4.]]]]) >>> m = nn.Upsample(scale_factor=2, mode='nearest') >>> m(input) tensor([[[[1., 1., 2., 2.], [1., 1., 2., 2.], [3., 3., 4., 4.], [3., 3., 4., 4.]]]]) >>> m = nn.Upsample(scale_factor=2, mode='bilinear') # align_corners=False >>> m(input) tensor([[[[1.0000, 1.2500, 1.7500, 2.0000], [1.5000, 1.7500, 2.2500, 2.5000], [2.5000, 2.7500, 3.2500, 3.5000], [3.0000, 3.2500, 3.7500, 4.0000]]]]) >>> m = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True) >>> m(input) tensor([[[[1.0000, 1.3333, 1.6667, 2.0000], [1.6667, 2.0000, 2.3333, 2.6667], [2.3333, 2.6667, 3.0000, 3.3333], [3.0000, 3.3333, 3.6667, 4.0000]]]]) >>> # Try scaling the same data in a larger tensor >>> input_3x3 = torch.zeros(3, 3).view(1, 1, 3, 3) >>> input_3x3[:, :, :2, :2].copy_(input) tensor([[[[1., 2.], [3., 4.]]]]) >>> input_3x3 tensor([[[[1., 2., 0.], [3., 4., 0.], [0., 0., 0.]]]]) >>> m = nn.Upsample(scale_factor=2, mode='bilinear') # align_corners=False >>> # Notice that values in top left corner are the same with the small input (except at boundary) >>> m(input_3x3) tensor([[[[1.0000, 1.2500, 1.7500, 1.5000, 0.5000, 0.0000], [1.5000, 1.7500, 2.2500, 1.8750, 0.6250, 0.0000], [2.5000, 2.7500, 3.2500, 2.6250, 0.8750, 0.0000], [2.2500, 2.4375, 2.8125, 2.2500, 0.7500, 0.0000], [0.7500, 0.8125, 0.9375, 0.7500, 0.2500, 0.0000], [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]]]]) >>> m = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True) >>> # Notice that values in top left corner are now changed >>> m(input_3x3) tensor([[[[1.0000, 1.4000, 1.8000, 1.6000, 0.8000, 0.0000], [1.8000, 2.2000, 2.6000, 2.2400, 1.1200, 0.0000], [2.6000, 3.0000, 3.4000, 2.8800, 1.4400, 0.0000], [2.4000, 2.7200, 3.0400, 2.5600, 1.2800, 0.0000], [1.2000, 1.3600, 1.5200, 1.2800, 0.6400, 0.0000], [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]]]])