1. 程式人生 > 程式設計 >Pytorch之view及view_as使用詳解

Pytorch之view及view_as使用詳解

view()函式是在torch.Tensor.view()下的一個函式,可以有tensor呼叫,也可以有variable呼叫。

其作用在於返回和原tensor資料個數相同,但size不同的tensor

【Numpy中的size是元素個數,但是在Pytorch中size等價為Numpy中的shape】

view函式的-1引數的作用在於基於另一引數,自動計算該維度的大小

很重要的一點

view函式只能由於contiguous的張量上,具體而言,就是在記憶體中連續儲存的張量。

具體而言,可以參看 https://www.jb51.net/article/177564.htm

所以,當tensor之前呼叫了transpose,permute函式就會是tensor記憶體中變得不再連續,就不能呼叫view函式。

所以,應該提前做tensor.contiguous()的操作

view函式與Pytorch0.4中新增的reshape的區別

reshape函式呼叫是不依賴於tensor在記憶體中是不是連續的。

reshape ≈ tensor.contiguous().view

程式碼

import numpy as np
import torch
from torch.autograd import Variable
 
x = torch.Tensor(2,2,2)
print(x)
 
y = x.view(1,8)
print(y)
 
z = x.view(-1,4) # the size -1 is inferred from other dimensions
print(z)
 
t = x.view(8)
print(t)

輸出

tensor([[[1.3712e-14,6.4069e+02],[4.3066e+21,1.1824e+22]],[[4.3066e+21,6.3828e+28],[3.8016e-39,0.0000e+00]]])

#x.view(1,8)生成的是[1,8]的張量
tensor([[1.3712e-14,6.4069e+02,4.3066e+21,1.1824e+22,6.3828e+28,3.8016e-39,0.0000e+00]])

#x.view(-1,4)其中-1是在4下的另一個維度的大小,也就是8/4=2,所以生成的是[2,4]的張量
tensor([[1.3712e-14,1.1824e+22],0.0000e+00]])

x.view(8)生成的是[8,]的張量,是個陣列
tensor([1.3712e-14,0.0000e+00])

view_as

返回被視作與給定的tensor相同大小的原tensor。 等效於:

self.view(tensor.size())

具體用法為:

程式碼

a = torch.Tensor(2,4)
b = a.view_as(torch.Tensor(4,2))
print (b)

輸出

tensor([[1.3712e-14,0.0000e+00]])

以上這篇Pytorch之view及view_as使用詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。