您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何實現PyTorch的基本數據類型、數據的獲得和生成,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
總的來說,除了String類型之外,Python中存在的數據類型,PyTorch中都有對應的數據類型。只不過PyTorch中的數據類型都是Tensor。
PyTorch中的變量是用Variable定義。例如想要定義一個FloatTensor的變量,我們可以這樣:先定義一個常量tensor,然后用Variable類包裝一下即可:
① w = Variable(torch.tensor([2.0, 3.0]), requires_grad = True)
這個w是一維的,稱之為張量。張量可以是一維、二維或多維。如果w需要梯度下降優化,那就要梯度requires_grad = True。如果w不需要梯度下降優化,則設置requires_grad為False。
② b = Variable(torch.tensor(1.0), requires_grad = True)。這個b是0維的,稱之為標量。
Variable變量除了有tensor的屬性和方法之外,還有一些特殊的屬性和方法:grad屬性、zero_grad()方法等。
PyTorch的數據的獲得
第一行是導入torch包,注意,名字是torch,而不是PyTorch。
第二行代碼是引入numpy包,并使用np作為別名。以后代碼中不再顯示這兩行代碼。
PyTorch可以從Numpy獲得數據,把Numpy的數據轉化成PyTorch的數據的方式:torch.from_numpy()
PyTorch也可以自己生成數據。torch.empty()、torch.Tensor()、torch.IntTensor()這三種方法獲得的是矩陣,矩陣中的數據是隨機的,有可能非常大,也可能非常小。所以用這些方法獲得的矩陣中的數據一定要重新進行初始化,而不能直接使用。
torch.tensor([2,3])是把已有的一個列表轉化成一維張量,這個一維張量里面的數據是兩個標量,分別是toensor(2)和toensor(3)。這兩個標量中的數據都是整數類型。
b = torch.Tensor(2, 3)是生成一個2行3列的二維張量,PyTorch默認的數據類型是TensorFloat,所以得到的都是tensor(0.0),簡寫成tensor(0.)。
a = torch.rand(2,3)表示產生一個2行3列的二維張量,這個張量中的數據是[0, 1]之間的tensor標量,里面的數據分布是均勻分布的。
而torch.rand_like(a)表示產生與張量a相同形狀的張量,里面的數據也是[0, 1]之間的tensor標量。
torch.randint(1,10, [5])的意思是產生5個元素的一維張量,里面的數據是[1, 10)之間的整數。如果把第三個參數換成[5, 2],那就可以得到5行2列的二維張量。
與torch.rand([2, 3])得到均勻分布的數據不同,torch.randn([2, 3])生成2行3列的二維張量,里面的數據是均值為0,方差為1的正態分布的。函數名randn()中的n是normal,也就是正態的意思。(正態分布:Normal distribution)。
torch.full([2,3], 7)的意思是生成2行3列的二維張量,里面的數據是都是7。張量和一個普通數據的相乘(加、減、除)得到的結果是張量中的每個元素都與這個普通數據相乘(加、減、除)。torch.ones([2, 3])的意思是生成2行3列的二維張量,里面的數據是都是1。所以torch.full([2,3], 7)也可以用torch.ones([2, 3]) + 6或torch.ones([2, 3]) * 7代替。
如果torch.full([], 9)第一個參數是一個空數組,這樣得到的就是一個標量9。與torch.tensor(9)一樣。
torch.linspace(0, 10, steps = 4)的意思是把0~10分為3等分。
torch.logspace(0, 1, steps = 10)的意思是把0~1分為9等分,然后分別計算10^X,得到如下序列。
torch.zeros([2,3])的意思是生成2行3列的二維張量,里面的數據是都是0。
torch.ones([2,3])在前面已經介紹過了,是2行3列的二維張量,里面的數據是都是1。
torch.eye(3,4)生成的是對角線矩陣,對角線上的數據都是1,其余都是0。如果兩個參數相等就生成正方形的矩陣,這時可以只寫一個參數。
torch.full([2,3], 9)在前面已經介紹過了,是2行3列的二維張量,里面的數據是都是9。它可以用torch.ones([2,3])代替。
產生隨機打亂的一個序列。troch.randperm()函數非常有用。一般情況下,我們的數據集中的數據都是有序的,在訓練和檢測的時候,我們都需要一些隨機的次序的數據,這時就可以用troch.randperm()產生隨機的整數,用這些整數作為數據集中的數據的index進行取樣即可得到隨機的數據。
torch中也有與Python一樣的range()函數,但是torch產生的是張量。為了避免混淆,PyTorch建議使用arange()函數。類似的,numpy中也有arange()函數。
torch與Python一樣支持切片功能,且語法幾乎一致。
reshape()函數是tensor自帶的函數。它可以改變tensor的維度和尺寸。例如把[4, 1, 28, 28]的四維數據轉化成1~4維,只需要保證轉變之后的數據的維度的乘積與轉變之前相等。
卷積操作需要的是二維數據,而卷積層后的全連接層需要一維數據。用reshape()函數處理之后就可以把n張圖片的二維數據轉成一維數據。當然,有些預處理的圖片是一維數據,也可以用這個函數處理成二維數據,然后進行卷積操作。
a.unsqueeze()就是在指定的位置插入一個維度,里面的參數是插入的維度的位置。這里的參數與Python的切片用的參數完全一致。
與a.unsqueeze()相反,a.squeeze()是壓縮指定位置的維度。如果不指定參數,則壓縮所有能壓縮的維度。所有一維的維度都是可以壓縮的。
b.expand()是維度擴展,注意這是維度擴展,而不是維度增加。這里a是4維的,b必須也是4維的才能進行擴展。里面的參數也是跟Python的切片一樣。最后還有一個b.expand_as(a),就是把b擴展成a一樣的尺寸。
a.repeat()是把a的每個維度重復多少次。這里需要指定每一個維度的重復次數。
在數學上,二維矩陣使用a.T表示轉置,在PyTorch中使用a.t()表示。但轉置僅限于二維矩陣。
a.transpose(1, 3)表示交換兩個維度的數據。當交換數據與矩陣變形聯用時一定要當心數據被污染。
permute():手動指定各個維度的數據的存放位置,這個方法比transpose()更靈活。
矩陣也可以像字符串一樣分割,使用的也是split()。很是好奇,PyTorch怕range()函數與Python中的range()函數混淆,但卻不怕split()函數與Python中的split()函數混淆。
上述內容就是如何實現PyTorch的基本數據類型、數據的獲得和生成,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。