Pytorch筆記搬運:張量
寫在前面:踩坑指南
為什么安裝conda后不能直接啟動activate環境?
核心問題
在這個列表里選擇可初始化的shell腳本
cmd.exe
作為shell name :
conda init cmd.exe
再輸入
conda activate pytorch
就進入環境了
其實cmd給了我們提示了
2.1 張量
這次繼續參與datawhale的看遠學習,學習有關Pytorch,然后就把有關內容都自己碼了一遍,加深理解和運用的功底。
進入到我們的jupyter lab
2.1.1 簡介
幾何代數中定義的張量是基于向量和矩陣的推廣,比如我們可以將標量視為零階張量,矢量可以視為一階張量,矩陣就是二階張量。
0維張量/標量 標量是一個數字
1維張量/向量 1維張量稱為“向量”。
2維張量 2維張量稱為矩陣
3維張量 公用數據存儲在張量 時間序列數據 股價 文本數據 彩色圖片(RGB)
張量是現代機器學習的基礎。它的核心是一個數據容器,多數情況下,它包含數字,有時候它也包含字符串,但這種情況比較少。因此可以把它想象成一個數字的水桶。
這里有一些存儲在各種類型張量的公用數據集類型:
3維 = 時間序列
4維 = 圖像
5維 = 視頻
例子:一個圖像可以用三個字段表示:
(width, height, channel) = 3D
1
但是,在機器學習工作中,我們經常要處理不止一張圖片或一篇文檔——我們要處理一個集合。我們可能有10,000張郁金香的圖片,這意味著,我們將用到4D張量:
(sample_size, width, height, channel) = 4D
1
在PyTorch中, torch.Tensor 是存儲和變換數據的主要工具。如果你之前用過NumPy,你會發現 Tensor 和NumPy的多維數組非常類似。然而,Tensor 提供GPU計算和自動求梯度等更多功能,這些使 Tensor 這一數據類型更加適合深度學習。
2.1.2 創建tensor
在接下來的內容中,我們將介紹幾種創建tensor的方法。
我們可以通過torch.rand()的方法,構造一個隨機初始化的矩陣:
import torch x = torch.rand(4, 3) print(x)
1
2
3
tensor([[0.7569, 0.4281, 0.4722], [0.9513, 0.5168, 0.1659], [0.4493, 0.2846, 0.4363], [0.5043, 0.9637, 0.1469]])
1
2
3
4
我們可以通過torch.zeros()構造一個矩陣全為 0,并且通過dtype設置數據類型為 long。
import torch x = torch.zeros(4, 3, dtype=torch.long) print(x)
1
2
3
tensor([[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]])
1
2
3
4
我們可以通過torch.tensor()直接使用數據,構造一個張量:
import torch x = torch.tensor([5.5, 3]) print(x)
1
2
3
tensor([5.5000, 3.0000])
1
基于已經存在的 tensor,創建一個 tensor :
x = x.new_ones(4, 3, dtype=torch.double) # 創建一個新的tensor,返回的tensor默認具有相同的 torch.dtype和torch.device # 也可以像之前的寫法 x = torch.ones(4, 3, dtype=torch.double) print(x) x = torch.randn_like(x, dtype=torch.float) # 重置數據類型 print(x) # 結果會有一樣的size # 獲取它的維度信息 print(x.size()) print(x.shape)
1
2
3
4
5
6
7
8
9
10
tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], dtype=torch.float64) tensor([[ 2.7311, -0.0720, 0.2497], [-2.3141, 0.0666, -0.5934], [ 1.5253, 1.0336, 1.3859], [ 1.3806, -0.6965, -1.2255]]) torch.Size([4, 3]) torch.Size([4, 3])
1
2
3
4
5
6
7
8
9
10
返回的torch.Size其實是一個tuple,?持所有tuple的操作。
還有一些常見的構造Tensor的函數:
2.1.3 張量的操作
在接下來的內容中,我們將介紹幾種常見的張量的操作方法:
加法操作:
import torch # 方式1 y = torch.rand(4, 3) print(x + y) # 方式2 print(torch.add(x, y)) # 方式3 提供一個輸出 tensor 作為參數 # 這里的 out 不需要和真實的運算結果保持維數一致,但是會有警告提示! result = torch.empty(5, 3) torch.add(x, y, out=result) print(result) # 方式4 in-place y.add_(x) print(y)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tensor([[ 2.8977, 0.6581, 0.5856], [-1.3604, 0.1656, -0.0823], [ 2.1387, 1.7959, 1.5275], [ 2.2427, -0.3100, -0.4826]]) tensor([[ 2.8977, 0.6581, 0.5856], [-1.3604, 0.1656, -0.0823], [ 2.1387, 1.7959, 1.5275], [ 2.2427, -0.3100, -0.4826]]) tensor([[ 2.8977, 0.6581, 0.5856], [-1.3604, 0.1656, -0.0823], [ 2.1387, 1.7959, 1.5275], [ 2.2427, -0.3100, -0.4826]]) tensor([[ 2.8977, 0.6581, 0.5856], [-1.3604, 0.1656, -0.0823], [ 2.1387, 1.7959, 1.5275], [ 2.2427, -0.3100, -0.4826]])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
索引操作:(類似于numpy)
需要注意的是:索引出來的結果與原數據共享內存,修改一個,另一個會跟著修改。如果不想修改,可以考慮使用copy()等方法
# 取第二列 print(x[:, 1])
1
2
tensor([-0.0720, 0.0666, 1.0336, -0.6965])
1
y = x[0,:] y += 1 print(y) print(x[0, :]) # 源tensor也被改了了
1
2
3
4
tensor([3.7311, 0.9280, 1.2497]) tensor([3.7311, 0.9280, 1.2497])
1
2
改變大小:如果你想改變一個 tensor 的大小或者形狀,你可以使用 torch.view:
x = torch.randn(4, 4) y = x.view(16) z = x.view(-1, 8) # -1是指這一維的維數由其他維度決定 print(x.size(), y.size(), z.size())
1
2
3
4
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
1
注意 view() 返回的新tensor與源tensor共享內存(其實是同一個tensor),也即更改其中的一個,另 外一個也會跟著改變。(顧名思義,view僅僅是改變了對這個張量的觀察?度)
x += 1 print(x) print(y) # 也加了了1
1
2
3
tensor([[ 1.3019, 0.3762, 1.2397, 1.3998], [ 0.6891, 1.3651, 1.1891, -0.6744], [ 0.3490, 1.8377, 1.6456, 0.8403], [-0.8259, 2.5454, 1.2474, 0.7884]]) tensor([ 1.3019, 0.3762, 1.2397, 1.3998, 0.6891, 1.3651, 1.1891, -0.6744, 0.3490, 1.8377, 1.6456, 0.8403, -0.8259, 2.5454, 1.2474, 0.7884])
1
2
3
4
5
6
所以如果我們想返回一個真正新的副本(即不共享內存)該怎么辦呢?Pytorch還提供了一 個 reshape() 可以改變形狀,但是此函數并不能保證返回的是其拷貝,所以不推薦使用。推薦先用 clone 創造一個副本然后再使用 view 。
注意:使用 clone 還有一個好處是會被記錄在計算圖中,即梯度回傳到副本時也會傳到源 Tensor 。
如果你有一個元素 tensor ,使用 .item() 來獲得這個 value:
import torch x = torch.randn(1) print(type(x)) print(type(x.item()))
1
2
3
4
1
2
PyTorch中的 Tensor 支持超過一百種操作,包括轉置、索引、切片、數學運算、線性代數、隨機數等等,可參考官方文檔。
2.1.4 廣播機制
當對兩個形狀不同的 Tensor 按元素運算時,可能會觸發廣播(broadcasting)機制:先適當復制元素使這兩個 Tensor 形狀相同后再按元素運算。
x = torch.arange(1, 3).view(1, 2) print(x) y = torch.arange(1, 4).view(3, 1) print(y) print(x + y)
1
2
3
4
5
tensor([[1, 2]]) tensor([[1], [2], [3]]) tensor([[2, 3], [3, 4], [4, 5]])
1
2
3
4
5
6
7
由于 x 和 y 分別是1行2列和3行1列的矩陣,如果要計算 x + y ,那么 x 中第一行的2個元素被廣播 (復制)到了第二行和第三行,? y 中第?列的3個元素被廣播(復制)到了第二列。如此,就可以對2 個3行2列的矩陣按元素相加。
手寫一遍,收獲會更多。
pytorch TensorFlow 機器學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。