主頁 >  其他 > 百度飛槳(PaddlePaddle)- 張量(Tensor)

百度飛槳(PaddlePaddle)- 張量(Tensor)

2023-05-12 08:34:15 其他

張量(Tensor)、標量(scalar)、向量(vector)、矩陣(matrix)

飛槳 使用張量(Tensor) 來表示神經網路中傳遞的資料,Tensor 可以理解為多維陣列,類似于 Numpy 陣列(ndarray) 的概念,與 Numpy 陣列相比,Tensor 除了支持運行在 CPU 上,還支持運行在 GPU 及各種 AI 芯片上,以實作計算加速;此外,飛槳基于 Tensor,實作了深度學習所必須的反向傳播功能和多種多樣的組網算子,從而可更快捷地實作深度學習組網與訓練等功能,

Tensor 必須形如矩形,即在任何一個維度上,元素的數量必須相等,否則會拋出例外

Tensor 的創建

指定資料創建

import paddle 

# 創建類似向量(vector)的 1 維 Tensor:
ndim_1_Tensor = paddle.to_tensor([2.0, 3.0, 4.0])
print(ndim_1_Tensor)

# 創建類似矩陣(matrix)的 2 維 Tensor:
ndim_2_Tensor = paddle.to_tensor([[1.0, 2.0, 3.0],
                                  [4.0, 5.0, 6.0]])
print(ndim_2_Tensor)

# 創建 3 維 Tensor:
ndim_3_Tensor = paddle.to_tensor([[[1, 2, 3, 4, 5],
                                   [6, 7, 8, 9, 10]],
                                  [[11, 12, 13, 14, 15],
                                   [16, 17, 18, 19, 20]]])
print(ndim_3_Tensor)

輸出

"D:\Program Files\Python38\python.exe" D:/OpenSource/PaddlePaddle/Tensor.py
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=True,
       [2., 3., 4.])
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
       [[1., 2., 3.],
        [4., 5., 6.]])
Tensor(shape=[2, 2, 5], dtype=int64, place=Place(cpu), stop_gradient=True,
       [[[1 , 2 , 3 , 4 , 5 ],
         [6 , 7 , 8 , 9 , 10]],

        [[11, 12, 13, 14, 15],
         [16, 17, 18, 19, 20]]])

Process finished with exit code 0

image

指定形狀創建

paddle.zeros([m, n])             # 創建資料全為 0,形狀為 [m, n] 的 Tensor
paddle.ones([m, n])              # 創建資料全為 1,形狀為 [m, n] 的 Tensor
paddle.full([m, n], 10)          # 創建資料全為 10,形狀為 [m, n] 的 Tensor

paddle.ones([2,3])
輸出

Tensor(shape=[2, 3], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [[1., 1., 1.],
        [1., 1., 1.]])

指定區間創建

如果要在指定區間內創建 Tensor,可以使用paddle.arange、 paddle.linspace 實作,

paddle.arange(start, end, step)  # 創建以步長 step 均勻分隔區間[start, end)的 Tensor
paddle.linspace(start, stop, num) # 創建以元素個數 num 均勻分隔區間[start, stop)的 Tensor
paddle.arange(start=1, end=5, step=1)

輸出

Tensor(shape=[4], dtype=int64, place=Place(gpu:0), stop_gradient=True,
       [1, 2, 3, 4])

指定影像、文本資料創建

在常見深度學習任務中,資料樣本可能是圖片(image)、文本(text)、語音(audio)等多種型別,在送入神經網路訓練或推理前,這些資料和對應的標簽均需要創建為 Tensor,以下是影像場景和 NLP 場景中手動轉換 Tensor 方法的介紹,

  • 對于影像場景,可使用 paddle.vision.transforms.ToTensor 直接將 PIL.Image 格式的資料轉為 Tensor,使用 paddle.to_tensor 將影像的標簽(Label,通常是 Python 或 Numpy 格式的資料)轉為 Tensor,
  • 對于文本場景,需將文本資料解碼為數字后,再通過 paddle.to_tensor 轉為 Tensor,不同文本任務標簽形式不一樣,有的任務標簽也是文本,有的則是數字,均需最終通過 paddle.to_tensor 轉為 Tensor,
    下面以影像場景為例介紹,以下示例代碼中將隨機生成的圖片轉換為 Tensor,
import numpy as np
from PIL import Image
import paddle.vision.transforms as T
import paddle.vision.transforms.functional as F

fake_img = Image.fromarray((np.random.rand(224, 224, 3) * 255.).astype(np.uint8)) # 創建隨機圖片
transform = T.ToTensor()
tensor = transform(fake_img) # 使用 ToTensor()將圖片轉換為 Tensor
print(tensor)

自動創建 Tensor 的功能介紹

除了手動創建 Tensor 外,實際在飛槳框架中有一些 API 封裝了 Tensor 創建的操作,從而無需用戶手動創建 Tensor,例如 paddle.io.DataLoader 能夠基于原始 Dataset,回傳讀取 Dataset 資料的迭代器,迭代器回傳的資料中的每個元素都是一個 Tensor,另外在一些高層 API,如 paddle.Model.fit 、paddle.Model.predict ,如果傳入的資料不是 Tensor,會自動轉為 Tensor 再進行模型訓練或推理,

paddle.Model.fit、paddle.Model.predict 等高層 API 支持傳入 Dataset 或 DataLoader,如果傳入的是 Dataset,那么會用 DataLoader 封裝轉為 Tensor 資料;如果傳入的是 DataLoader,則直接從 DataLoader 迭代讀取 Tensor 資料送入模型訓練或推理,因此即使沒有寫將資料轉為 Tensor 的代碼,也能正常執行,提升了編程效率和容錯性,

以下示例代碼中,分別列印了原始資料集的資料,和送入 DataLoader 后回傳的資料,可以看到資料結構由 Python list 轉為了 Tensor,

import paddle

from paddle.vision.transforms import Compose, Normalize

transform = Compose([Normalize(mean=[127.5],
                               std=[127.5],
                               data_format='CHW')])

test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
print(test_dataset[0][1]) # 列印原始資料集的第一個資料的 label
loader = paddle.io.DataLoader(test_dataset)
for data in enumerate(loader):
    x, label = data[1]
    print(label) # 列印由 DataLoader 回傳的迭代器中的第一個資料的 label
    break

Tensor 的屬性

在前文中,可以看到列印 Tensor 時有 shape、dtype、place 等資訊,這些都是 Tensor 的重要屬性,想要了解如何操作 Tensor 需要對其屬性有一定了解,接下來分別展開介紹 Tensor 的屬性相關概念,

Tensor(shape=[3], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [2., 3., 4.])

Tensor 的形狀(shape)

(1)形狀的介紹

形狀是 Tensor 的一個重要的基礎屬性,可以通過 Tensor.shape 查看一個 Tensor 的形狀,以下為相關概念:

  • shape:描述了 Tensor 每個維度上元素的數量,
  • ndim: Tensor 的維度數量,例如向量的維度為 1,矩陣的維度為 2,Tensor 可以有任意數量的維度,
  • axis 或者 dimension:Tensor 的軸,即某個特定的維度,
  • size:Tensor 中全部元素的個數,

創建 1 個四維 Tensor ,并通過圖形來直觀表達以上幾個概念之間的關系:

ndim_4_Tensor = paddle.ones([2, 3, 4, 5])
print("Data Type of every element:", ndim_4_Tensor.dtype)
print("Number of dimensions:", ndim_4_Tensor.ndim)
print("Shape of Tensor:", ndim_4_Tensor.shape)
print("Elements number along axis 0 of Tensor:", ndim_4_Tensor.shape[0])
print("Elements number along the last axis of Tensor:", ndim_4_Tensor.shape[-1])

image

(2)重置 Tensor 形狀(Reshape) 的方法

重新設定 Tensor 的 shape 在深度學習任務中比較常見,如一些計算類 API 會對輸入資料有特定的形狀要求,這時可通過 paddle.reshape 介面來改變 Tensor 的 shape,但并不改變 Tensor 的 size 和其中的元素資料,
以下示例代碼中,創建 1 個 shape=[3] 的一維 Tensor,使用 reshape 功能將該 Tensor 重置為 shape=[1, 3] 的二維 Tensor,這種做法經常用在把一維的標簽(label)資料擴展為二維,由于飛槳框架中神經網路通常需要傳入一個 batch 的資料進行計算,因此可將資料增加一個 batch 維,方便后面的資料計算,

ndim_1_Tensor = paddle.to_tensor([1, 2, 3])
print("the shape of ndim_1_Tensor:", ndim_1_Tensor.shape)

reshape_Tensor = paddle.reshape(ndim_1_Tensor, [1, 3])
print("After reshape:", reshape_Tensor.shape)

在指定新的 shape 時存在一些技巧:

  • -1 表示這個維度的值是從 Tensor 的元素總數和剩余維度自動推斷出來的,因此,有且只有一個維度可以被設定為 -1,
  • 0 表示該維度的元素數量與原值相同,因此 shape 中 0 的索引值必須小于 Tensor 的維度(索引值從 0 開始計,如第 1 維的索引值是 0,第二維的索引值是 1),
origin:[3, 2, 5] reshape:[3, 10]      actual: [3, 10] # 直接指定目標 shape
origin:[3, 2, 5] reshape:[-1]         actual: [30] # 轉換為 1 維,維度根據元素總數推斷出來是 3*2*5=30
origin:[3, 2, 5] reshape:[-1, 5]      actual: [6, 5] # 轉換為 2 維,固定一個維度 5,另一個維度根據元素總數推斷出來是 30÷5=6
origin:[3, 2, 5] reshape:[0, -1]         actual: [3, 6] # reshape:[0, -1]中 0 的索引值為 0,按照規則,轉換后第 0 維的元素數量與原始 Tensor 第 0 維的元素數量相同,為 3;第 1 維的元素數量根據元素總值計算得出為 30÷3=10,
origin:[3, 2] reshape:[3, 1, 0]          error: # reshape:[3, 1, 0]中 0 的索引值為 2,但原 Tensor 只有 2 維,無法找到與第 3 維對應的元素數量,因此出錯,

(3)原位(Inplace)操作和非原位操作的區別

飛槳框架的 API 有原位(Inplace)操作和非原位操作之分,原位操作即在原 Tensor 上保存操作結果,輸出 Tensor 將與輸入 Tensor 共享資料,并且沒有 Tensor 資料拷貝的程序,非原位操作則不會修改原 Tensor,而是回傳一個新的 Tensor,通過 API 名稱區分兩者,如 paddle.reshape 是非原位操作,paddle.reshape_ 是原位操作,

Tensor 的資料型別(dtype)

(1)指定資料型別的介紹

Tensor 的資料型別 dtype 可以通過 Tensor.dtype 查看,支持型別包括:bool、float16、float32、float64、uint8、int8、int16、int32、int64、complex64、complex128,
同一 Tensor 中所有元素的資料型別均相同,通常通過如下方式指定:

(2)修改資料型別的方法

飛槳框架提供了paddle.cast 介面來改變 Tensor 的 dtype:

float32_Tensor = paddle.to_tensor(1.0)

float64_Tensor = paddle.cast(float32_Tensor, dtype='float64')
print("Tensor after cast to float64:", float64_Tensor.dtype)

int64_Tensor = paddle.cast(float32_Tensor, dtype='int64')
print("Tensor after cast to int64:", int64_Tensor.dtype)

Tensor 的設備位置(place)

Tensor 的名稱(name)

Tensor 的 stop_gradient 屬性

Tensor 的操作

索引和切片

索引或切片的第一個值對應第 0 維,第二個值對應第 1 維,依次類推,如果某個維度上未指定索引,則默認為 :
Python Numpy 切片

import paddle

# 創建 3 維 Tensor:
ndim_3_Tensor = paddle.to_tensor([[[[1, 2, 3, 4, 5],
                                    [6, 7, 8, 9, 10],
                                    [11, 12, 13, 14, 15]],
                                   [[21, 22, 23, 24, 25],
                                    [26, 27, 28, 29, 30],
                                    [31, 32, 33, 34, 35]]],

                                  [[[1, 2, 3, 4, 5],
                                    [6, 7, 8, 9, 10],
                                    [11, 12, 13, 14, 15]],
                                   [[29, 22, 23, 24, 25],
                                    [26, 57, 28, 29, 30],
                                    [31, 32, 33, 34, 59]]]])


print("Origin Tensor:", ndim_3_Tensor.ndim)
print("Tensor Shape:", ndim_3_Tensor.shape) # [2, 2, 3, 5]
print("Slice:", ndim_3_Tensor[1, 1, 2, 4].numpy()) # 對應 shape


print("First row:", ndim_3_Tensor[0].numpy())
print("First row:", ndim_3_Tensor[1, 1, 2, 4].numpy())
print("First column:", ndim_3_Tensor[:, 0].numpy())
print("Last column:", ndim_3_Tensor[:, -1].numpy())
print("All element:", ndim_3_Tensor[:].numpy())
print("First row and second column:", ndim_3_Tensor[1, 0].numpy())

運算

Tensor 的廣播機制

飛槳 Tensor 的廣播機制
Python NumPy 廣播(Broadcast)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552223.html

標籤:其他

上一篇:構建萬物互聯,華為云IoT+鴻蒙重燃物體感知

下一篇:返回列表

標籤雲
其他(158863) Python(38128) JavaScript(25413) Java(18033) C(15226) 區塊鏈(8265) C#(7972) AI(7469) 爪哇(7425) MySQL(7177) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5338) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4570) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1972) 功能(1967) Web開發(1951) HtmlCss(1935) python-3.x(1918) C++(1915) 弹簧靴(1913) xml(1889) PostgreSQL(1875) .NETCore(1860) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 百度飛槳(PaddlePaddle)- 張量(Tensor)

    張量(Tensor)、標量(scalar)、向量(vector)、矩陣(matrix) 飛槳 使用張量(Tensor) 來表示神經網路中傳遞的資料,Tensor 可以理解為多維陣列,類似于 Numpy 陣列(ndarray) 的概念。與 Numpy 陣列相比,Tensor 除了支持運行在 CPU 上 ......

    uj5u.com 2023-05-12 08:34:15 more
  • 構建萬物互聯,華為云IoT+鴻蒙重燃物體感知

    摘要:鴻蒙的出現,讓硬體、軟體行業面臨著變革與重構的洪流,但激流勇進中,也潛藏著巨大機遇。物聯網設備與鴻蒙結合成為必然趨勢,本文將解讀華為云IoT+鴻蒙如何強強聯合,為物聯網行業提供新的思路和方法。 本文分享自華為云社區《華為云IoT攜同鴻蒙打造萬物智聯新機遇》,作者:華為云IoT DTSE團隊。 ......

    uj5u.com 2023-05-12 08:34:00 more
  • SemiEng20230413-What Designers Need To Know About GAA

    Nanowire與nanosheet爭議仍然存在,業界還沒確定誰更適合作下一代主流邏輯器件。 對任何新器件,第一代都是用來學習試驗的,后面再迭代升級。 FinFET不能繼續縮微的原因:fin之間要填柵和功函式堆疊層,fin之間15-20nm的距離是必要的。“So, you have this cli ......

    uj5u.com 2023-05-12 08:27:58 more
  • 面試秘籍 | 測驗工程師的簡歷該怎么寫?(帶樣例)

    作為軟體測驗的垂直領域深耕者,面試或者被面試都是常有的事,可是不管是啥,總和簡歷有著理不清的關系,面試官要通過簡歷了解面試者的基本資訊、過往經歷等,面試者希望通過簡歷把自己最好的一面體現給面試官,所以在這場博弈中,作為面試者,需要掌握一定的技巧,寫出一個高質量的簡歷,才能抓住面試官的眼光。 ......

    uj5u.com 2023-05-12 08:17:13 more
  • 如何做直播平臺的開發:直播原始碼推拉流技術的實作(二)

    直播原始碼的拉流技術通俗來講觀看直播的人,通過拉流的相關協議和地址,拉取直播人的直播資料,在播放端,比如手機、平板、PC上就可以觀看直播了。 ......

    uj5u.com 2023-05-12 08:16:53 more
  • 揭秘Karmada百倍集群規模多云基礎設施體系

    摘要:本文結合Karmada社區對大規模場景的思考,揭示Karmada穩定支持100個大規模集群、管理超過50萬個節點和200萬個Pod背后的原理 本文分享自華為云社區《Karmada百倍集群規模多云基礎設施體系揭秘》,作者: 云容器大未來 。 隨著云原生技術在越來越多的企業和組織中的大規模落地,如 ......

    uj5u.com 2023-05-12 08:15:34 more
  • IntelliJ IDEA 最新激活碼:2023、2022及以下版本通用(親測有效)

    IntelliJ IDEA 2023版正式發布了。如何破解和激活IDEA呢?本文提供簡單易懂的破解和激活指南,幫助你全面有效的解鎖IDEA工具,不在受限于 IDEA 30天試用期。本文適用于 IDEA 2023, 2022及以下版本。IDEA最新激活碼,IDEA2023激活碼,一步到位,永久激活,親... ......

    uj5u.com 2023-05-12 08:14:15 more
  • 金三銀四好像消失了,IT行業何時復蘇!

    疫情時候不敢離職,以為熬過來疫情了,行情會好一些,可是疫情結束了,反而行情更差了, 這是要哪樣 我心中不由一萬個 草泥🐴 路過 我心中不驚有了很多疑惑和感嘆 接著上一篇 一個28歲程式員入行自述和感受 自我10連問 我的心情 自去年下半年以來,互聯網行業一片寒冬傳言,眾多企業倒閉,裁員。本以為隨著 ......

    uj5u.com 2023-05-12 08:13:51 more
  • 如何設計介面測驗用例?(文末送介面測驗用例模板)

    介面測驗是專案測驗的一部分,正如其名,它測驗的主要物件是介面,是測驗系統組件間介面的一種測驗。介面測驗主要用于檢測外部系統與所測系統之間以及內部各系統之間的互動點。測驗的重點是檢查資料互動、傳遞、和控制管理程序以及系統間的相互依賴關系等。 ......

    uj5u.com 2023-05-12 08:13:35 more
  • Python復制檔案的9種方法

    以下是演示“如何在Python中復制檔案”的九種方法。 1.shutil copyfile()方法 2.shutil copy()方法 3.shutil copyfileobj()方法 4.shutil copy2()方法 5.os popen方法 6.os系統()方法 7.Thread()方法 8 ......

    uj5u.com 2023-05-12 08:13:08 more