Pytorch筆記搬運張量

      網友投稿 708 2022-05-29

      寫在前面:踩坑指南

      為什么安裝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

      Pytorch筆記搬運:張量

      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小時內刪除侵權內容。

      上一篇:[跟著官方文檔學pytest][五][學習筆記]
      下一篇:偽共享和Java緩存行
      相關文章
      国产亚洲AV夜间福利香蕉149 | 久久久久亚洲精品天堂| 国产精品国产亚洲区艳妇糸列短篇| 亚洲最大福利视频| 亚洲成a人不卡在线观看| 亚洲精品欧洲精品| 亚洲无圣光一区二区| 亚洲精品欧洲精品| 亚洲人成影院77777| 亚洲国产成人精品激情| 亚洲色在线无码国产精品不卡| 在线a亚洲老鸭窝天堂av高清| 亚洲最大av资源站无码av网址| 亚洲AV无码成人专区| 亚洲国产区男人本色在线观看| 国产成人精品日本亚洲网址| 国产午夜亚洲精品国产| 伊人久久亚洲综合影院首页| 亚洲精品无码专区在线播放| 欧美激情综合亚洲一二区| 国产精品亚洲综合天堂夜夜| 亚洲?v无码国产在丝袜线观看| 亚洲成年看片在线观看| 久久久久国产亚洲AV麻豆 | 国产日韩成人亚洲丁香婷婷| 中文字幕亚洲乱码熟女一区二区| 亚洲日产韩国一二三四区| 久久青草亚洲AV无码麻豆| 亚洲午夜免费视频| 亚洲伊人久久精品| 亚洲国产成人无码AV在线| 五月婷婷亚洲综合| 国产亚洲一区二区在线观看| 久久精品国产亚洲av日韩| 亚洲一级毛片免费在线观看| 亚洲精品无码专区久久| 亚洲美女高清一区二区三区| 亚洲精品一品区二品区三品区| 亚洲五月激情综合图片区| 色婷五月综激情亚洲综合| 久久亚洲精品成人无码|