torch.Tensor.view#
- Tensor.view(*shape) Tensor#
返回一個與
self張量具有相同資料但具有不同shape的新張量。返回的張量共享相同的資料,並且必須具有相同數量的元素,但其大小可能不同。為了能夠對張量進行 view 操作,新的 view 大小必須與其原始大小和步幅相容,即,每個新的 view 維度必須是原始維度的子空間,或者僅跨越滿足以下類似連續性條件的原始維度 :
否則,將無法在不復制
self張量的情況下將其 view 為shape(例如,透過contiguous())。當不確定是否可以執行view()時,建議使用reshape(),它將在形狀相容時返回一個 view,否則將執行復制(等同於呼叫contiguous())。- 引數
shape (torch.Size 或 int...) – 期望的大小
示例
>>> x = torch.randn(4, 4) >>> x.size() torch.Size([4, 4]) >>> y = x.view(16) >>> y.size() torch.Size([16]) >>> z = x.view(-1, 8) # the size -1 is inferred from other dimensions >>> z.size() torch.Size([2, 8]) >>> a = torch.randn(1, 2, 3, 4) >>> a.size() torch.Size([1, 2, 3, 4]) >>> b = a.transpose(1, 2) # Swaps 2nd and 3rd dimension >>> b.size() torch.Size([1, 3, 2, 4]) >>> c = a.view(1, 3, 2, 4) # Does not change tensor layout in memory >>> c.size() torch.Size([1, 3, 2, 4]) >>> torch.equal(b, c) False
- view(dtype) Tensor
返回一個與
self張量具有相同資料但具有不同dtype的新張量。如果
dtype的元素大小與self.dtype不同,則輸出的最後一個維度的尺寸將按比例縮放。例如,如果dtype的元素大小是self.dtype的兩倍,則self的最後一個維度中的每對元素將被合併,並且輸出的最後一個維度的尺寸將是self的一半。如果dtype的元素大小是self.dtype的一半,則self的最後一個維度中的每個元素將被分成兩半,並且輸出的最後一個維度的尺寸將是self的兩倍。要使此操作成為可能,必須滿足以下條件:self.dim()必須大於 0。self.stride(-1)必須為 1。
此外,如果
dtype的元素大小大於self.dtype的元素大小,則還必須滿足以下條件:self.size(-1)必須可被 dtypes 元素大小之比整除。self.storage_offset()必須可被 dtypes 元素大小之比整除。除最後一個維度外的所有維度的步幅都必須可被 dtypes 元素大小之比整除。
如果上述任何條件不滿足,則會丟擲錯誤。
警告
此過載不受 TorchScript 支援,在 Torchscript 程式中使用它將導致未定義行為。
- 引數
dtype (
torch.dtype) – 期望的 dtype
示例
>>> x = torch.randn(4, 4) >>> x tensor([[ 0.9482, -0.0310, 1.4999, -0.5316], [-0.1520, 0.7472, 0.5617, -0.8649], [-2.4724, -0.0334, -0.2976, -0.8499], [-0.2109, 1.9913, -0.9607, -0.6123]]) >>> x.dtype torch.float32 >>> y = x.view(torch.int32) >>> y tensor([[ 1064483442, -1124191867, 1069546515, -1089989247], [-1105482831, 1061112040, 1057999968, -1084397505], [-1071760287, -1123489973, -1097310419, -1084649136], [-1101533110, 1073668768, -1082790149, -1088634448]], dtype=torch.int32) >>> y[0, 0] = 1000000000 >>> x tensor([[ 0.0047, -0.0310, 1.4999, -0.5316], [-0.1520, 0.7472, 0.5617, -0.8649], [-2.4724, -0.0334, -0.2976, -0.8499], [-0.2109, 1.9913, -0.9607, -0.6123]]) >>> x.view(torch.cfloat) tensor([[ 0.0047-0.0310j, 1.4999-0.5316j], [-0.1520+0.7472j, 0.5617-0.8649j], [-2.4724-0.0334j, -0.2976-0.8499j], [-0.2109+1.9913j, -0.9607-0.6123j]]) >>> x.view(torch.cfloat).size() torch.Size([4, 2]) >>> x.view(torch.uint8) tensor([[ 0, 202, 154, 59, 182, 243, 253, 188, 185, 252, 191, 63, 240, 22, 8, 191], [227, 165, 27, 190, 128, 72, 63, 63, 146, 203, 15, 63, 22, 106, 93, 191], [205, 59, 30, 192, 112, 206, 8, 189, 7, 95, 152, 190, 12, 147, 89, 191], [ 43, 246, 87, 190, 235, 226, 254, 63, 111, 240, 117, 191, 177, 191, 28, 191]], dtype=torch.uint8) >>> x.view(torch.uint8).size() torch.Size([4, 16])