(pytorch-深度學習系列)pytorch資料操作

我是一顆棒棒糖發表於2020-10-12

pytorch資料操作

基本資料操作,都詳細註釋了,如下:

import torch

#5x3的未初始化的Tensor
x = torch.empty(5, 3)
print("5x3的未初始化的Tensor:")
print(x)
print("******************************")

#5x3的隨機初始化的Tensor:
x = torch.rand(5, 3)
print("5x3的隨機初始化的Tensor:")
print(x)
print("******************************")

#5x3的long型全0的Tensor:
x = torch.zeros(5, 3, dtype=torch.long)
print("5x3的long型全0的Tensor:")
print(x)
print("******************************")

#根據源資料建立
x = [5, 4, 3]
x = torch.tensor(x, dtype=torch.float64)
print("根據源資料建立tensor:")
print(x)
print("******************************")

#返回的tensor預設具有相同的torch.dtype和torch.device
#建立一個tensor
x = x.new_ones(5, 3, dtype=torch.float64)  
print("建立的tensor")
print(x)
print("******************************")

#通過對已有的tensor 指定新的資料型別 建立tensor
x = torch.randn_like(x, dtype=torch.float)
print("通過對已有的tensor 指定新的資料型別 建立tensor:")
print(x) 
print("******************************")

#通過shape或者size()來獲取Tensor的形狀:
print("通過shape或者size()來獲取Tensor的形狀:")
print(x.size())
print(x.shape)
print("******************************")

#tensor加法:
y = torch.rand(5, 3)
print(x + y)
print("******************************")

#add函式實現tensor相加
print(torch.add(x, y))
print("******************************")

#add函式指定輸出相加
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
print("******************************")

#使用行內函數實現加發
y.add_(x)
print(y)
#PyTorch操作inplace版本都有字尾_, 例如x.copy_(y), x.t_()
print("******************************")

#類似numpy的索引方式
y=x[0,:]
y += 2
print(y)
print("修改了y,那麼原tensor也會被修改")
print(x[0, :])
print("******************************")

#改變形狀 view函式
y = x.view(15)
z = x.view(-1, 5)  # -1所指的維度可以根據其他維度的值推出來
print(x.size(), y.size(), z.size())
print("******************************")

#view()返回的新Tensor與源Tensor雖然可能有不同的size,但是是共享data的,即更改一個,另一個也會變化
x += 1
print(x)
print(y) # 也加了1
print("******************************")

#使用clone函式獲得一個真正的資料副本3.
x_clone = x.clone().view(15)
x += 1
print(x)
print(x_clone)
print("******************************")
#使用clone還有一個好處是會被記錄在計算圖中,即梯度回傳到副本時也會傳到源Tensor。



#另外一個常用的函式就是item(), 它可以將一個標量Tensor轉換成一個Python number:
x = torch.randn(1)
print(x)
print(x.item())
print("******************************")

#形狀不同的tensor進行計算,會觸發廣播機制
x = torch.arange(1, 3).view(1, 2)
y = torch.arange(0, 3).view(3, 1)
print(x)
print(y)
print(x + y)
print(torch.add(x, y))
#print(x.add_(y))
#由於x和y分別是1行2列和3行1列的矩陣,如果要計算x + y,那麼x中第一行的2個元素被廣播(複製)到了第二行和第三行,而y中第一列的3個元素被廣播(複製)到了第二列。如此,就可以對2個3行2列的矩陣按元素相加。
print("******************************")


#索引操作與clone操作不同,不會開闢新的記憶體,但是運算操作會開闢新的記憶體
x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
y[:] = y + x
print(id(y) == id_before) # True
print("未開闢新的記憶體")

x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
y = y + x
print(id(y) == id_before) # False 
print("開闢了新的記憶體")

print("使用 add函式指定輸出也可以避免開闢記憶體:")
x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
torch.add(x, y, out=y) # y += x, y.add_(x)
print(id(y) == id_before) # True
print("******************************")

#Tensor轉NumPy:tensor.numpy()
a = torch.ones(5)
b = a.numpy()
print(a, b)
a += 1
print(a, b)
b += 1
print(a, b)

#torch.from_numpy
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(a, b)
a += 1
print(a, b)
b += 1
print(a, b)

#torch.tensor(numpy)這樣會開闢新的記憶體
c = torch.tensor(a)
a += 1
print(a, c)


#測試gpu環境
# 以下程式碼只有在PyTorch GPU版本上才會執行
if torch.cuda.is_available():
    device = torch.device("cuda")          # GPU
    y = torch.ones_like(x, device=device)  # 直接建立一個在GPU上的Tensor
    x = x.to(device)                       # 等價於 .to("cuda")
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # to()還可以同時更改資料型別

輸出結果如下:

Microsoft Windows [版本 10.0.18363.1082]
(c) 2019 Microsoft Corporation。保留所有權利。

C:\Users\20626>d:

D:\>cd workspace

D:\workspace>cd "python Workspace"

D:\workspace\python Workspace>cd deeplearning-pytorch

D:\workspace\python Workspace\deeplearning-pytorch>activate pytorch_gpu

D:\workspace\python Workspace\deeplearning-pytorch>conda.bat activate pytorch_gpu

(pytorch_gpu) D:\workspace\python Workspace\deeplearning-pytorch>python chapter-1.py
5x3的未初始化的Tensor:
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])
******************************
5x3的隨機初始化的Tensor:
tensor([[0.7356, 0.2419, 0.0771],
        [0.2658, 0.9888, 0.8363],
        [0.7294, 0.4150, 0.9157],
        [0.8824, 0.1682, 0.8827],
        [0.7691, 0.0690, 0.8040]])
******************************
5x3的long型全0的Tensor:
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
******************************
根據源資料建立tensor:
tensor([5., 4., 3.], dtype=torch.float64)
******************************
建立的tensor
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
******************************
通過對已有的tensor 指定新的資料型別 建立tensor:
tensor([[ 0.1654, -0.1937,  1.2233],
        [-0.4828, -0.8176, -0.3672],
        [ 0.5762,  0.6457, -0.0862],
        [ 0.9082, -0.3934, -0.3169],
        [ 0.1841,  0.8648,  1.1849]])
******************************
通過shape或者size()來獲取Tensor的形狀:
torch.Size([5, 3])
torch.Size([5, 3])
******************************
tensor([[ 1.0382e+00, -4.8804e-04,  2.1988e+00],
        [-2.5249e-01, -1.7922e-01,  4.7531e-01],
        [ 1.1131e+00,  7.3895e-01,  5.4079e-01],
        [ 1.8360e+00, -3.9927e-02, -1.0457e-01],
        [ 4.7496e-01,  1.6555e+00,  1.2281e+00]])
******************************
tensor([[ 1.0382e+00, -4.8804e-04,  2.1988e+00],
        [-2.5249e-01, -1.7922e-01,  4.7531e-01],
        [ 1.1131e+00,  7.3895e-01,  5.4079e-01],
        [ 1.8360e+00, -3.9927e-02, -1.0457e-01],
        [ 4.7496e-01,  1.6555e+00,  1.2281e+00]])
******************************
tensor([[ 1.0382e+00, -4.8804e-04,  2.1988e+00],
        [-2.5249e-01, -1.7922e-01,  4.7531e-01],
        [ 1.1131e+00,  7.3895e-01,  5.4079e-01],
        [ 1.8360e+00, -3.9927e-02, -1.0457e-01],
        [ 4.7496e-01,  1.6555e+00,  1.2281e+00]])
******************************
tensor([[ 1.0382e+00, -4.8804e-04,  2.1988e+00],
        [-2.5249e-01, -1.7922e-01,  4.7531e-01],
        [ 1.1131e+00,  7.3895e-01,  5.4079e-01],
        [ 1.8360e+00, -3.9927e-02, -1.0457e-01],
        [ 4.7496e-01,  1.6555e+00,  1.2281e+00]])
******************************
tensor([2.1654, 1.8063, 3.2233])
修改了y,那麼原tensor也會被修改
tensor([2.1654, 1.8063, 3.2233])
******************************
torch.Size([5, 3]) torch.Size([15]) torch.Size([3, 5])
******************************
tensor([[3.1654, 2.8063, 4.2233],
        [0.5172, 0.1824, 0.6328],
        [1.5762, 1.6457, 0.9138],
        [1.9082, 0.6066, 0.6831],
        [1.1841, 1.8648, 2.1849]])
tensor([3.1654, 2.8063, 4.2233, 0.5172, 0.1824, 0.6328, 1.5762, 1.6457, 0.9138,
        1.9082, 0.6066, 0.6831, 1.1841, 1.8648, 2.1849])
******************************
tensor([[4.1654, 3.8063, 5.2233],
        [1.5172, 1.1824, 1.6328],
        [2.5762, 2.6457, 1.9138],
        [2.9082, 1.6066, 1.6831],
        [2.1841, 2.8648, 3.1849]])
tensor([3.1654, 2.8063, 4.2233, 0.5172, 0.1824, 0.6328, 1.5762, 1.6457, 0.9138,
        1.9082, 0.6066, 0.6831, 1.1841, 1.8648, 2.1849])
******************************
tensor([-0.5415])
-0.5414556860923767
******************************
tensor([[1, 2]])
tensor([[0],
        [1],
        [2]])
tensor([[1, 2],
        [2, 3],
        [3, 4]])
tensor([[1, 2],
        [2, 3],
        [3, 4]])
******************************
True
未開闢新的記憶體
False
開闢了新的記憶體
使用 add函式指定輸出也可以避免開闢記憶體:
True
******************************
tensor([1., 1., 1., 1., 1.]) [1. 1. 1. 1. 1.]
tensor([2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2.]
tensor([3., 3., 3., 3., 3.]) [3. 3. 3. 3. 3.]
[1. 1. 1. 1. 1.] tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
[2. 2. 2. 2. 2.] tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
[3. 3. 3. 3. 3.] tensor([3., 3., 3., 3., 3.], dtype=torch.float64)
[4. 4. 4. 4. 4.] tensor([3., 3., 3., 3., 3.], dtype=torch.float64)
tensor([2, 3], device='cuda:0')
tensor([2., 3.], dtype=torch.float64)

(pytorch_gpu) D:\workspace\python Workspace\deeplearning-pytorch>

相關文章